TI专家,你好,
我的设计是:从dsp upp_A口读入48kB数据,采用dma方式传到内存(0xc200-000,共20块,每块4kB)。
dsp从upp_A口,dma每完成一次(每读到4KB数据),将产生一次中断,共应产生12次中断。
问题是:
1、开始数据有丢。
2、中断次数不足12次。
我每次在设置好内存后、设置dma传输前,有加Cache_inv(),在读内存数据前加Cache_wb(),错误没有变化。
加的头文件是:#include<ti/sysbios/hal/Cache.h>
请帮忙分析问题所在。
谢谢!
Tony Tang:
jack zhao3我每次在设置好内存后、设置dma传输前,有加Cache_inv(),在读内存数据前加Cache_wb(),错误没有变化。
置dma传输前,有加Cache_inv()。这一步要不要无所谓。
在读内存数据前加Cache_wb(),这一步明显错误了,write back是将Cache的内容写回物理地址,岂不是把DMA更新后的数据用Cache里的老数据覆盖了,要做也是Cache_inv()。
jack zhao3
1、开始数据有丢。
2、中断次数不足12次。
你做的是接收,那么要确保在upp DMA配置完成后,外部才开始发start信号启动uPP DMA的接收。
jack zhao3:
回复 Tony Tang:
Tony 你好,
也就是在“在读内存数据前加Cache_inv()”,就可以。
我试过,问题依旧。
upp DMA配置完成以后,才开始传输数据的。
Tony Tang:
回复 jack zhao3:
你这中断数都不对,跟Cache本来就无关。先把中断数搞对了,数据再不对的话再来查是不是Cache的问题。
jack zhao3:
回复 Tony Tang:
你好,Tony,
1、丢终端问题解决了,是程序含延时造成的。
2、我在读内存数据前加入以下语句,问题依旧。
Cache_inv(node,sizeof(DataNode),Cache_Type_L2,true); Cache_inv(data,SR_BUFFER_SIZE,Cache_Type_L2,true); Cache_wait();
jack zhao3:
回复 jack zhao3:
你好,Tony,
现在情况如下。
每次接收完UPP的数据后,dsp共享内存里数据如下:
[INFO |print_nodes@main.c,61] nodes:0,681,35b60,40000100,b5880100[INFO |print_nodes@main.c,61] nodes:1,81,493e0,40001180,b5881180[INFO |print_nodes@main.c,61] nodes:2,181,493e0,40002200,b5882200[INFO |print_nodes@main.c,61] nodes:3,281,493e0,40003280,b5883280[INFO |print_nodes@main.c,61] nodes:4,381,493e0,40004300,b5884300[INFO |print_nodes@main.c,61] nodes:5,481,493e0,40005380,b5885380[INFO |print_nodes@main.c,61] nodes:6,581,493e0,40006400,b5886400[INFO |print_nodes@main.c,61] nodes:7,681,493e0,40007480,b5887480[INFO |print_nodes@main.c,61] nodes:8,781,493e0,40008500,b5888500[INFO |print_nodes@main.c,61] nodes:9,881,493e0,40009580,b5889580[INFO |print_nodes@main.c,61] nodes:10,981,493e0,4000a600,b588a600[INFO |print_nodes@main.c,61] nodes:11,a81,493e0,4000b680,b588b680[INFO |print_nodes@main.c,61] nodes:12,b81,493e0,4000c700,b588c700[INFO |print_nodes@main.c,61] nodes:13,81,35b60,4000d780,b588d780[INFO |print_nodes@main.c,61] nodes:14,781,3e8,4000e800,b588e800[INFO |print_nodes@main.c,61] nodes:15,181,35b60,4000f880,b588f880[INFO |print_nodes@main.c,61] nodes:16,281,35b60,40010900,b5890900[INFO |print_nodes@main.c,61] nodes:17,381,35b60,40011980,b5891980[INFO |print_nodes@main.c,61] nodes:18,481,35b60,40012a00,b5892a00[INFO |print_nodes@main.c,61] nodes:19,581,35b60,40013a80,b5893a80
493e0是这次的采样速率
但dsp变量里数据,我是从共享内存中读出的,与它不同:
[INFO |client_handler_do@client_handler.c,91] dd:0,681,35b60,40000100,b5880100[INFO |client_handler_do@client_handler.c,91] dd:1,81,493e0,40001180,b5881180[INFO |client_handler_do@client_handler.c,91] dd:2,881,35b60,40002200,b5882200[INFO |client_handler_do@client_handler.c,91] dd:3,981,35b60,40003280,b5883280[INFO |client_handler_do@client_handler.c,91] dd:4,a81,35b60,40004300,b5884300[INFO |client_handler_do@client_handler.c,91] dd:5,b81,35b60,40005380,b5885380[INFO |client_handler_do@client_handler.c,91] dd:6,581,33450,40006400,b5886400[INFO |client_handler_do@client_handler.c,91] dd:7,681,33450,40007480,b5887480[INFO |client_handler_do@client_handler.c,91] dd:8,781,33450,40008500,b5888500[INFO |client_handler_do@client_handler.c,91] dd:9,881,33450,40009580,b5889580[INFO |client_handler_do@client_handler.c,91] dd:10,981,33450,4000a600,b588a600[INFO |client_handler_do@client_handler.c,91] dd:11,a81,33450,4000b680,b588b680[INFO |client_handler_do@client_handler.c,91] dd:12,b81,33450,4000c700,b588c700
它们前两行数据相同。
jack zhao3:
回复 jack zhao3:
dsp变量里数据,我是从共享内存中读出的数据,是dsp共享内存里上一次存进的数据。
似乎dsp读共享内存比dma快一点。
jack zhao3:
回复 jack zhao3:
从dsp upp_A口读入48kB数据,采用dma方式传到内存(0xc200-000,共20块,每块4kB)。
我想请教upp数据到共享内存,dma方式,数据是直接到内存,还是先到cache?
jack zhao3:
回复 jack zhao3:
从dsp upp_A口读入48kB数据,采用dma方式传到共享内存(0xc200-000,共20块,每块4kB)。
dsp从upp_A口,dma每完成一次(每读到8KB数据),将产生一次中断,共应产生6次中断。
共享内存里数据 变量内存数据比较,请见附件。
Tony Tang:
回复 jack zhao3:
哇,一下这么多问题,我一个一个来尝试回答吧。
jack zhao3 1、丢终端问题解决了,是程序含延时造成的。
是因为任务里的task_sleep吗,我觉得这里不应该用sleep,应该用sem_pend,而semphore在UPP的ISR里post,然后直接触发任务处理,不然task_sleep在那里白白等1000个tick.
jack zhao3
2、我在读内存数据前加入以下语句,问题依旧。
Cache_inv(node,sizeof(DataNode),Cache_Type_L2,true); Cache_inv(data,SR_BUFFER_SIZE,Cache_Type_L2,true); Cache_wait();
这个可能与放在代码中的位置有关系,后面你的问题里好像还有更详细的描述,在后面回答吧。
Tony Tang:
回复 jack zhao3:
jack zhao3每次接收完UPP的数据后,dsp共享内存里数据如下
这是ARM端读的吗?如果这是正确的数据,那么说明数据是正常接收了。恭喜你。
jack zhao3但dsp变量里数据,我是从共享内存中读出的,与它不同:
我理解这是DSP程序读取后再打印的,与上面ARM读的有出入,那么这里应该就是DSP的Cache维护没做好了。你是在uPP接收中断后,做Cache Invalid再做读取到变量的吗?