Hello,
目前DM8148 DSP开发进行算法优化。
我将DDR3的数据搬移到L2内存段内。
一开始用memcpy()函数,数据搬移没有问题,算法运算结果正确。
然后用自己编写EDMA3_copy()函数搬移数据,同时也没有使DDR 该段外存cache使能,方法如下:
for(i=0;i<256;i++)
{
MAR->MAREG[i] = 0;
}
数据搬移没有任何问题。
但是当DDR 该段外存cache使能后,重新运行该段代码,运算结果就不正确。
DDR 该段外存cache使能方法如下:
for(i=0;i<256;i++)
{
MAR->MAREG[i] = 1;
}
我尝试修改使该传输数据的原地址和目标地址都是0x80对齐后,DDR 该段外存cache使能,重新运行代码,运算结果正常。
根据EDMA3文档,EDMA3传送中没有对源地址,目标地址对齐有专门要求。
能否解释这种现象原因?
谢先,
BRS,
Meng
lu edward:
回复 Chris Meng:
cache 一致性。
应为你的开辟或者使用的这段空间没有做cache 对齐处理。参考kmem_cache分配内存的原理。这个函数分配的内存大小都是和cache的最大访问位宽的倍数。
Lingcon Meng:
回复 Chris Meng:
Hello Chris,
非常感谢您的回复。
目前程序中,L2中没有使用与其相关的cache_wb(),cache_inv(),cache_wbInv()这些函数。
L2与L1之间的一致性是自动维护的。
BRS,
Meng
Lingcon Meng:
回复 lu edward:
Hello,
谢谢您的回复。
但是EDMA3操作中,没有说明,edma数据搬移必须地址对齐。
如果地址必须对齐,我没有DDR cache 没有使能时,数据搬移应该也不成功。
目前只是,在DDR cache使能时,EDMA3 数据搬移不成功。
但是对齐cache line size时,数据搬移成功。
非常感谢!
BRS,
Meng
Lingcon Meng:
回复 lu edward:
Hello ,
another question:
能否给一些信息,我从那儿可以得到kmem_cache()的相关文档,对其深入了解。
BRS,
Meng
lu edward:
回复 Lingcon Meng:
wiki或者百度上都有,忘记说了还有一个叫回写(write back)或者更新的机制。