TI中文支持网
TI专业的中文技术问题搜集分享网站

dsp dma中断方式学数据到内存DDR2,有错误

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再做读取到变量的吗?

赞(0)
未经允许不得转载:TI中文支持网 » dsp dma中断方式学数据到内存DDR2,有错误
分享到: 更多 (0)