This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求助:OMAPL138的DSP端采用EDMA读外设有问题,貌似是MPU引起的。



公司项目,用EDMA从EMIF外设读取数据,采用GPIO2事件触发。在Windows下用JTAG调试无问题,在Linux下用利用dsplink的loop范例程序改了一个程序,利用Windows上调试好的代码,发现有问题,问题具体表现如下:(用伪代码描述)

情况1--------------------------------------------------------------------------

循环N次:

     用malloc函数分配内存

     EDMA读取数据到该内存

    重复上述循环

结果:每次读到的数据都是正确的,由于内存泄漏,循环几次后结束执行

情况2--------------------------------------------------------------------------

循环N次:

     用malloc函数分配内存

     EDMA读取数据到该内存

     用free函数释放内存

    重复上述循环

结果:第一次读到的数据是正确的,后来读到的数据都是0(两次malloc分配到的内存块估计是同一内存块)

情况3--------------------------------------------------------------------------

定义全局数组

循环N次:

     EDMA读取数据到全局数组

    重复上述循环

结果:第一次读到的数据是正确的,后来读到的数据都是0

似乎是只要对内存有读写操作后,就锁定了该内存以至于无法EDMA。在JTAG模式下无问题,看资料可能是MPU的原因,因为MPU在JTAG模式下无效。第一次读到的数据都是正确的,因为MPU在复位后的初始阶段为配置为全可访问。

不知道我的理解对不对,求高手,如果是MPU的问题,求代码如何解锁该内存块,使得可被EDMA访问。

  • 问题解决,将缓冲区定义到DSP内部空间即可。在默认的DSP/BIOS开发环境下,全局变量默认分配到了外部的DDR上。DMA就变成了从外设(FPGA)到外设(DDR)上,这种外设到外设的应当无法正常DMA。DMA一般是外设到DSP内部存储之间的数据传输。

  • 你放到内部RAM上是不要自己维护Cache的一致性了,所以结果对了。放到DDR2上,CPU和EDMA同时访问同一段数据,要维护Cache 一致性的。

    对比的你测试情况就可以知道反复往同个内存地址传数据有问题,往不同的内存地址传数据就没问题。往不同内存传送时,CPU访问这段数据,如果在Cache中没有Hit,会自动更新Cache,所以数据是对的。