请教专家,现在SL2设置为CACHEABL。如果为该空间中,每隔800个整形数据,赋值一个数。下面的cache写回的调用是否正确。每次给一个地址上写数据都要调用WritebackCache吗?这样会不会浪费效率? 该函数的第二个参数是要更新的字节数,最大可传入参数的大小为多少?有的时候,经常内存数据不正确,请专家指点,怎样正确调用该函数。谢谢
#define INTERVL 800
unsigned int * Dat = (unsigned int * )0xc100000;
for(i=0; i<40; i++)
{
*Dat=i;
WritebackCache((void *)(Dat+i), 4);
Dat =Dat + i*INTERVL ;
}
King Wang1:
回答你的问题
1。这样效率确实很低。
2。第二个参数的字节数不限。
内存数据不正确的可能原因:cache刷新是按照line来操作的,L1D的line应该是64byte。这表示你一次最少都是刷新64byte的内容。如果你的64byte里面,有些内容是别的core控制的,但是你还是刷出去了,可能就会有问题。原则上,如果要刷cache,L1 cache必须保证64B数据都是由该master控制的。
如果是你这种操作,建议最好将所有需要刷cache的内容放到连续空间,然后按照64byte向上取整。全部赋值后一次性刷新。
jian zong1:
回复 King Wang1:
专家好,现在DDR设置为cache.FPGA在一开始,会给DSP外接的DDR发送18MB的数据。DSP只有等待这18M数据,真正的写到DDR里面之后,才会工作。请问怎么才能保证这18M数据,真正的写到DDR里面去?
jian zong1:
回复 jian zong1:
这个项目有点紧,请专家解答,怎么才能正确写数据到DDR。在使用的过程中,怎么才能确保DDR中的数据不被cache误操作而改变??
YUCHAO WANG:
回复 jian zong1:
你的应用是外设写内存而DSP去读,想要保证cache一致很简单,在读之前作inValid操作,这样就能保证你读到的数一定是FPGA写进来的数。(你不用DSP写那块地址的话就用不着writeBack)。
数据肯定能被写到DDR,只要你不乱用writeback,cache不会影响到内存里的数