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

EDMA3数据搬移乱码问题

        DSP初学者,最近在做EDMA3数据搬移。遇到DDR3数据搬移到L3(共享内存)乱码问题。

平台:C6678+CCS5.5  

数据和程序都放在L3中,L2 128k使能cache;以下是我源码:

Uint32 Data1[16384];

Uint32 Data2[16384];

void CacheInit()          // 使能DDR3可cache
{  

    Cache_Size cacheSize;

    cacheSize.l1pSize = 32k;

    cacheSize.l1dSize = 32k;

    cacheSize.l2Size   = 128k;

    Cache_setMar((Ptr *)0x90000000, 0x00000020, Cache_Mar_ENABLE | Cache_PFX);    //用于存放其他数据

    Cache_setMar((Ptr *)0x91000000, 0x00000020, Cache_Mar_ENABLE | Cache_PFX);    //用于存放其他数据
}
void task()
{
   // ddr中写数据
   for(cnt=0;cnt<8192;cnt++)
  {
      *((Uint16 *)0x90000100+ 2*cnt)) = cnt*3+1;   // 与使能cache的地址不同
      *((Uint16 *)0x91000100+ 2*cnt)) = cnt*2-1;   // 与使能cache的地址不同
   }

   edma3Init();         // edma3 寄存器初始化
   edma3InterruptInit();// edma3 中断初始化
   edma3ParInit();      // edma3 PaRAM初始化

   while(1)
  {
           edma3Start(); // 手动启动 EDMA3
           while(irqRaised == 0u) // 等待EDMA3完成中断
          {
          }
          Cache_inv((void *)Data1, 16384, Cache_Type_ALLD, TRUE); // 无效化cache,保证cache一致性
          Cache_inv((void *)Data2, 16384, Cache_Type_ALLD, TRUE);
        
          // 其他程序
  }        
}

cmd

{

   // 所有的程序,数据都放在L3(共享内存中)

}

最近调试发现,当我禁用L2 cache时,搬移数据就没有乱码,当使能L2 cache后搬移数据就是乱码(用memory browser看的数据)。我猜测可能是L2 与 L3存在cache一致性问题,然后将原程序中的cache_inv()函数换成CACHE_invL2(DATA1,16384,CACHE_WAIT)。结果还是乱码。

当我点击restart按钮重新运行程序后,数据竟然是对的。

我不使能DDR3可cache时 数据也是对的,但是我使能的cache地址与EDMA3搬移的地址是不相同的呀

困扰好几天的问题了,该怎么解决?

Shine:

回复 Ming LEO:

感谢分享解决方法!

赞(0)
未经允许不得转载:TI中文支持网 » EDMA3数据搬移乱码问题
分享到: 更多 (0)