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:
感谢分享解决方法!