大家好!
开发板6670EVM, core0将共享内存的一个地址置为1,执行write back;core1执行invalid后,读取该地址的值。
问题是这样的:如果core0先执行操作,core1后去取值,没有问题。但是如果core1先取值,因为取不到‘1’,循环等待;然后core0赋值,按道理core1可以取到值,继续运行,问题是这种情况core1一直取不到值,永远在循环!何解?
Zhan Xiang:
core1每次读该共享地址前都应该执行invalid,否则一旦数据进了cache,core1会一直读取cache中的数据。
fei xiao1:
回复 Zhan Xiang:
我非常确定,每次都是执行了invalid。
Andy Yin1:
建议在全局变量前加上关键字volatile。
对于你这种使用方式,建议将类似的共享标志变量放在non cache memory区域,可以免除cache一致性的维护。
fei xiao1:
回复 Andy Yin1:
好像是prefetch方面的问题。
在读之前CSL_XMC_invalidatePrefetchBuffer()一次就可以解决问题,但是编译选项改为o2好像又不行了,难道噢o2编译对这条指令又有影响?
Andy Yin1:
回复 fei xiao1:
加上volatile关键字,并在配置memory attributes时将对应MAR寄存器中的PFXbit清零,将prefetch功能关闭。