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.

C6678 EDMA 搬运有内存保护吗?

各位老师好,

   我再6678平台下,用edma的CC1做数据搬运。pingset:将数据从一个内存固定源地址src搬到内存ping区域,pongset:将数据从该地址搬到pong区域。ping和pong在msm上。

ping pong搬运相互link。当ping搬运完成之后,edma发出中断,core0对ping区域进行处理,pong搬运完之后,core0处理pong数据。

现在中断程序只是简单的将ping或pong区域的数据搬运到另外一个数组里面,然后问题出现了,如果中断程序什么都不做,则edma可以正确的进行ping pong搬运,但是如果中断程序里面对ping区域进行了访问,则edma下一次搬到ping里面的数据就不是src地址的数据了。pong也是这样。

不知道是不是对内存做了保护,但是我看了mpu的介绍,发现它保护的空间并没有到0x0cxxxxx,也就是没有对msm进行保护。在msmc里面,priID0~15,也没有edma啊,为什么edma的对内存的访问会受到限制呢?

  • 默认情况下EDMA可以访问SL2及DDR,你这种情况肯定是跟内存保护没有关系,因为“如果中断程序什么都不做,则edma可以正确的进行ping pong搬运”,先查一下对于源地址及目的地址是SL2及DDR时,注意cache一致性的维护,在启动EDMA前对源地址做cache write back,对目的之地做cache invalid。

  • 谢谢,我这样修改了之后,edma可以正确的搬运了,但是又出了新的问题。麻烦您帮我看一下。

    程序里面的所有数据,都位于SL2,首先从源地址,一个uint16类型,固定地址的变量src,用edma搬运至uint16  pingIn[512],edma的触发event是通过gpio输入的一个方波信号。搬运完毕之后edma发出中断,让cpu处理pingIn的数据至pingOut[512], edma将pingOut的数据搬运至固定地址dst。

    我的中断程序修改如下:

    CACHE_invL1d ((void *)pingInBuff,2*BUFF_SZ , CACHE_NOWAIT);
    CACHE_invL2 ((void *)pingInBuff, 2*BUFF_SZ, CACHE_NOWAIT);

    int index;
     for(index=0;index<BUFF_SZ;index++)
      pingOutBuff[index]=pingInBuff[index];

     CACHE_wbInvL1d((void *)pingOutBuff, 2*BUFF_SZ, CACHE_NOWAIT);
     CACHE_wbInvL2(pingOutBuff, 2*BUFF_SZ, CACHE_NOWAIT);

    这样修改完毕之后,edma的确可以正确搬运src的值了,但是有些时候,中断程序还没执行完,edma就又出发了下一次中断,有时候pingInBuff里面的数据中固定位置的几个总是不对,但是这样的现象时有时无,我的方波频率为200HZ,频率不高,pll采用默认的设置,不知道为什么会出现这样的情况,是不是我的cache配置还是有问题?

  • Andy你好,

          我用的edma源地址,目的地址全在msmc sram上面,默认是 SL2吗,如果是,应该不需要软件维护一致性的啊?那为什么我不维护的时候,在ccs memory browser里面看的内容就不对呢?(勾选L1D L2)