Hello 您好,
C674x 开发算法,并进行优化。
数据从DDR3–>L2(SRAM,没有cache使能)–>DDR3.
所有的DDR3内存通过MARn cache使能。
数据从L2到DDR3的搬移都是通过EDMA3来实现。
当我将EDMA搬移变成memcpy()时,程序能得到正常的结果。
但是当用EDMA3进行数据搬移的时候,程序不能得到正常的运行结果。
因此,问题出现是与EDMA3,操作有关。
但是我单步跟踪EDMA3搬移程序,没有发现程序有问题。
因此我怀疑问题发生在由于EDMA3进行数据搬移时,cache的不一致性所致。
如何保持cache的一致性,在这样的数据流
DDR3(cached)–>L2(SRAM,没有cache使能)–>DDR3(cached).
是否能提供这方面的例子。
非常感谢!
BRS,
Meng
Tony Tang:
感觉上面描述的有些不完全。DDR3上的buffer是不是CPU访问过,是在什么时候访问的,还有DDR3上的buffer的数据源是从哪里来的?我觉得问题在这里。
cache一致性操作参考文档sprufk5a. MARn只是控制是否可被Cache,一致性维护要操作Cache的寄存器。
还有L2是都配置成RAM了吗?还是部分Cache?
Lingcon Meng:
回复 Tony Tang:
Hello Tony,
DDR3上的buffer是在EDMA之前,算法处理的中间结果。
L2 是部分是配置成SRAM,部分配置成了Cache。我用的部分是被配置成SRAM的,DDR3是被MARn 寄存器 cache使能。
是的,我知道cache的控制需要自己L1P,L1D,L2控制寄存器来完成,MARn 只是将相应的DDR3段,设置成是否被L2 cache。
如我下面代码段中,将DMA_transfer() 换成memcpy是没有任何问题的,DSP程序能正常工作,得到期望的结果,但是换成EDMA数据搬移,则不行。
EDMA_transfer(),单步跟踪代码是没有任何问题,数据能正常传输。但是全速运行,就会出现问题。
顺便问一下,L1p,L1D,L2 的cache操作,Cache_Inv(),Cache_Wb(),Cache_WbInv()操作对应的地址,是L1地址,L2地址 or DDR3的地址?
下面是code,自己也写了cache操作函数(应该不正确)。
附件fft_cache_functions.c是我写的cache代码,及包含DDR3–>L2–>DDR3的代码,请帮检查。
非常感谢!
BRS,
Meng
Tony Tang:
回复 Lingcon Meng:
Lingcon Meng顺便问一下,L1p,L1D,L2 的cache操作,Cache_Inv(),Cache_Wb(),Cache_WbInv()操作对应的地址,是L1地址,L2地址 or DDR3的地址?
是DDR的地址,Cache是没有地址的,Cache只是记录Cache了什么外部地址。
从上面代码来看,是刚刚CPU对DDR3上的buffer tmpAddr0, tmpAddr1做了处理,就调用EDMA将之搬到L2,这时tmpAddr0/1的数据还在Cache里,所以搬到L2的数据有可能是没更新的,所以你的判断是正确的。
这里只需要在上面Cache操作处加上Cache writeback and invalid操作即可。
后面一个对L2的write back是什么意思?而且是在EDMA操作后调用的。
Lingcon Meng:
回复 Tony Tang:
Hello Tony,
非常感谢您的回复。
也就是说所有的cache操作都是基于DDR的地址的,与L1,L2的具体地址没有关系。
Tony:后面一个对L2的write back是什么意思?而且是在EDMA操作后调用的。
EDMA数据搬移,将L2 SRAM的内容回写到DDR3。按照您的意思,应该地址参数是DDR地址,而不是L2的地址?
那么我以前对cache_inv() 和 cache_wb()理解是有偏差的。
因此我自己写的cache_Inv() 和 cache_wb()函数,是分别对L1P,L1D,L2来操作的,是有问题的。
具体函数见附件。
如何正确实现cache_Inv() 和 cache_wb()函数功能,对数据的一致性,是通过L1D,L2
共同实现的吗,还是单独L1D,L2单独来实现?
我是在裸机下来实现算法处理的。没办法直接调用sysBios的cache_inv(),cache_wb,cache_wbInv().
非常感谢您给予的帮助。
BRS,Meng
Lingcon Meng:
回复 Tony Tang:
Hello Tony,
非常感谢您的解释。
根据您的解释及我最近的对文档阅读,也就是说,我们的应用情况(提供的例程):
DDR3(cache)–>L2(as SRAM,not cache) –> DDR3(cache),每一阶段数据传送都是EDMA3来完成。
在 DDR3(cache)–>L2(as SRAM,not cache) 数据搬移EDMA3之前,cache_invL2() DDR3所涉及地址,就ok。
数据在L2处理完,然后EDMA3将数据从L2搬移到DDR3,之后无需任何cache操作(such as cache_wbL2()).
这样的理解正确吗?
再次感谢!
BRS,
Meng
Lingcon Meng:
回复 Tony Tang:
Hello Tony,
谢谢您的耐心解释!
BRS,
Meng