专家您好:
最近在调试过程中发现:通过Pcie传送来的数据数据大到一定范围cache inv操作就不起作用了。导致程序运行错误。
1. csl库中的cache操作分两种,一种直接对L1、L2进行inv和writebak操作,一种是对内存地址依照大小进行cache维护操作,测试时发现有些csl中的cache语句
没有起到相应的作用。对内存地址进行cache操作超过一定范围就会失效。
请问:
1.对于用共享接受外设数据的cache维护有何需要注意的地方,比如地址128byte字节对齐,大小128byte字节对齐。cache维护有无大小限制?
2.如果更新的数据量比较大,对整个L1cache无效和依照内存地址进行cache无效有何区别?
3.csl库的cache维护代码,需不需要其他相关配置,为何有些语句不起作用?
4.观察memery brower发现MSM中的数据可能出现在L2cache中,但是L2的cache大小设置为0?
谢谢!!!
li yanlong:
回复 Allen35065:
谢谢您的回答:
单独测试时没出现inv32k不起作用的情况,我们现在依照地址8k byte大小inv cache数据大了也起作用了,问题可能不在清cache本身。
yl c:
回复 Allen35065:
Allen Yin
1. 无大小限制,应与cache line大小对齐;
2. L1最大32K,也就是最多缓存32K的数据,写不下的就先回写原来的;
3. 不需要,可能是回写还没有完成,需加上两次_mfence()语句保证回写完成;
4.不可能,0x0C000000开始的SL2内容不会出现在L2 cache,一定是别的地方搞错了。
Andy Yin1:
回复 yl c:
外部memory地址与cache是有映射对应关系,超过cache大小,会进行cache替换,将之前的数据回写后再重新映射读入cache,软件回写只需向cache寄存器写入基地址及长度48k即可,或者调用csl cache函数即可。可以参考cache、corepac user guide关于cache的映射及一致性维护。
yl c:
回复 Andy Yin1:
好的,谢谢
yl c:
回复 Andy Yin1:
Andy,希望继续向你请教一些问题,还望多多指教;
在6678的多核访问中,
core1要对core0的L2中的内容进行更新操作时,core0的L2控制器会根据被更新数据的地址判断相应的地址 是否在core0的L1D CACHE中,如果在L1D CACHE中,硬件会自动将更新的数据拷贝一份到L1D CACHE中。当Core0重新对L2中的这部分数据进行处理的时候,如果要读取的数据已经在L1D CACHE中,Core0可以直接从L1D CACHE中得到更新过的数据。如果要读取的数据不在L1D CACHE中,L1D控制器会自动从L2加载数据,Core0也可以得到更新后的数据。
当core1要对core0 L2中的内容进行读操作的时候,L2控制器会判断要读取的数据地址是否在L1D CACHE中,对于在L1D CACHE中的数据,硬件会自动从L1D CACHE中读取最新的数据送给core1。对于不在L1D CACHE中的数据,说明core0 L2中的数据已经是最新的数据,可以直接从L2中读取。
这样的分析对吧?core1对core0的L2是直接进行内存写操作的么,不经过cache的写操作;而对L2进行读操作时,则考虑cache的存在???
yl c:
回复 Andy Yin1:
Andy,当数据在L2存储器中时,虽然存在CACHE的一致性问题,但可以硬件自动维护;
那么为什么当代码在L2存储器中时,所存在CACHE的一致性问题必须由软件维护而不能像数据那样硬件自动维护呢?
期待你的解答。
谢谢!
Allen35065:
回复 yl c:
同一个核自身的L1和L2之间是自动维护的;
不同核之间的L1和L2的一致性需要手动维护。
yl c:
回复 Allen35065:
Allen Yin
同一个核自身的L1和L2之间是自动维护的;
不同核之间的L1和L2的一致性需要手动维护。
Allen35065:
回复 yl c:
是的,因为代码段一般不会被修改;因此L1P和L2之间的一致性不会自动维护,详见corepac user guide 4.3.8节。