TI工程师您好! 我使用ipc 共享区域与其它核进行数据交互。我创建了一个56个字节长度的存储空间,循环赋值,用notify将地址传给子核做运算。程序通过信号量进行同步操作。但调试中发现数据只有第一次写成功。第二次子核读取出的数据与第一次的一样。这是什么原因造成的?主核更改过数据后,调用了cache_wbAll(); 我的共享区域定义于MSMC中。
请问:
多核交互变量,定义于共享内存,任何核写入后均立刻writeback,读出前Invalid;变量定义全部对齐到cache line大小。这个cache line的大小应该是多少?
Nancy Wang:
cache line大小:
L1P: 32 bytes
L1D: 64 bytes
L2: 128 bytes
读之前有没有Invalid,在CCS中View->memory中,勾上cache选项,观察一下memory的变化,再分析看看是没有修改成功,还是读取的时候有问题。
user6307690:
回复 Nancy Wang:
谢谢! 我看一下内存中的内容,从0核看,每个区域数据都有变化 ,但从子核角度看内存,传递到此子核 的内存区域中的内容没有变,是第一次赋的值 。请问这有可能是什么原因造成的?读之前使用了Invalid.因为我使用这个区域不只一次,之前读之前用了invalid.读完之后是不j是要恢复成valid?
请问 invalid cache 调用哪个函数 ?
Nancy Wang:
回复 user6307690:
把相关的代码贴出来看一下。
Nancy Wang:
回复 user6307690:
用CSL里面的代码:
CACHE_invL1d (start address, byte count,wait)
CACHE_wbL1d (start address, byte count,wait)
CACHE_invL2(InBuffB, BUFSIZE, CACHE_WAIT);
CACHE_wbL2(OutBuffB, BUFSIZE, CACHE_WAIT);
user6307690:
回复 Nancy Wang:
我在程序使用下面这个函数 Cache_disable(Cache_Type_ALL); 与上面的4个函数有区别吗?
Nancy Wang:
回复 user6307690:
你是用的sys/bios下的API,Cache_disable应该是禁用缓存,试试看用Cache_inv().
Void Cache_inv(Ptr blockPtr, SizeT byteCnt, Bits16 type, Bool wait);
software-dl.ti.com/…/Cache.html