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端EDMA3数据传输若干问题

TI工程师您好,

      我在用OMAPL138中startware的EDMA的例程时,传输一个100Bytes的连续数据,发现有以下几个疑惑的地方;

1,srcAddr地址在DDR2中,destAddr地址在shareRAM中,(即DD2->shareRAM,下同),观察到的destAddr地方都是0,没有传输成功,但IPR却能置位。

2、DD2->DD2时,也不能传成功,目标地址上都是0 ,但IPR却能置位;

3、shareRAM->shareRAM时,数据成功传递,且数据都正确;

4、shareRAM->DDR2时,数据部分传递,只有前十几个数据传递了,后面的数据都是0。

我不太清楚什么原因导致了上述情况的发生?是否在同一块区域不是使用EDMA,望TI工程师能帮忙解惑。

  • 后续又上网看了很多有关EDMA的帖子,发现很多问题的原因都出在cache,自己尝试了关闭cache,确实可以实现正常传输。但随之问题又出现了,我的cache是根据TI工程师的建议配置优化的cache,能够实现运算加速,

     CacheEnableMAR((unsigned int)0xC0000000, (unsigned int)0x00018000);

    CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_128K);

    这部分cache优化以后是要用到的,所以不能关闭。请问有在不关闭cache的情况下实现EDMA的传输么?

  • 目的地址在EDMA传输前是否被CPU访问过?如果访问过,那么是这块内存被Cache了,你看到的可能只是Cache里的内容,而不是物理内存的内容。可以打开memory窗口,输入目的地址,对比勾选/不勾选窗口的L1D, L2,看目的地址的内容是否有变化来判断。

    建议:开始EDMA传输前,做一个Cache invalid操作。EDMA传输完后,不要做Cache write back操作哟!

  • 谢谢的回复,

    你对Cache的分析很正确,从memory窗口中看数据确实在Cache中,而非物理内存中。

    我仔细考虑了下您给的建议,每次EDMA3传输前做一次Cache invalid操作,发现Cache invalid函数会调用IntGlobalDisable()操作,我的程序需要中断触发EDMA3传输参数,中断频率20k,不知道函数中调用的中断关闭操作会不会对我程序的中断产生严重影响。

    在使用Cache invalid操作时发现,调用函数耗费了大量CPU时间,网上的帖子也有类似的说法,如果我要传300个16位的数据是不是有点得不偿失了,本来想借用EDMA 来节省CPU时间来做其他操作,但Cache invalid操作已经耗费了大量时间。

    其它几点疑问:1、有工程师说把源地址和目标地址定义在Cache映射区外部,这样传输的数据就不会被Cache,但通过实验没有达到效果;

                             2、有人使用UARTDMA或SPIDMA的程序例程操作时,是否也存在数据被Cache的情况?

    谢谢

  • 既然是在中断触发EDMA,就是说不知道什么时侯做Cache操作。

    首先在EDMA之前或之后做都可以,关键是否要把Cache的数据更新回物理内存。

    如果只是300x16个数据,可能真不如用memory copy函数,因为你还要配置EDMA,这个还是要通过测试一下哪人更高效。如果是用Link方式ping-pong buffer,不用每次都配EDMA,还是EDMA快。

    Cache invalid操作很快的,所在关全局中断不会有影响,其实你在调用RTS库的memory copy的时候,全局中断也是关了的,这是优化策略问题。

    回答你的疑问:

    #1. 应该是没有配置以,一个MAR寄存器控制16Mbyte空间,确认你更改后的buffer的地址是不是MAR的控制范围内。

    #2. 这个涉及程序运行的时机问题,被访问的地址已被从Cache替换出来,那么EDMA之后,去访问buffer,则buffer的数据重新被Cache,访问到的就是更新数据。就像你提到的有时候部分是对的。

    涉及Cache的简单原则是:CPU访问了buffer,则buffer的数据被Cache,然后EDMA更新数据到buffer,这时CPU是不知道的,CPU再访问Buffer,如果前面Cache进去的地址没有被替换出来,那么就直接从Cache读数据,即旧的数据。所以要确保再次读到的是更新的物理内存的数据,而不是Cache里的数据,那么就要把buffer从Cache invalid,如果数据是有用的,即write back invalid。