我现在遇到的情况是:
在shram上开辟一段空间,存放一个结构体如:
struct
{ void * buffer;
……}A a;
在core0上对a->buffer = calloc()一段空间,然后往里面循环充数据;
每充完一次cache_wbL1d();(这里没开L2cache);
然后在core1上首先从shram读取这个结构体,读出来的buffer地址值是正确的,
接着cache_invL1d()(也没开L2cache);
core1上第一次读出来的数据是对的,后面就变成有时对,有时不对,关于cache的一致性除了用的那两个函数,在核之间还有其他的特殊性吗?为什么数据会不对呢?
附加一个问题:我在单核上,创建线程,然后直接加锁操作很简单,那如果我要对不同的核进行加锁怎么操作?比如说,一个在shram的共用结构体里面的变量,如果在核0上被使用,在核1上就要等候,这个锁是个什么原理????
求大神及TI员工 帮帮忙解答,,,感激不尽。。
Andy Yin1:
L1D cache需要保证地址和长度64B对齐,然后对于写端,在写完后可以尝试write back and invalid,在读数端,在读完数后进行invalid。
不同的核也可以使用信号量互斥。
user1746900:
回复 Andy Yin1:
谢谢!
地址和长度64B对齐,怎么保证??比如我在shram里放一个结构体A,#pramga DATASECTION(.share),#pramga ALLIGN(64),是这样对齐吗?您说的读数端,读完后我加了wbInvallL1d(),这样对吗? 不同核使用信号量互斥,这个怎么用,有没有实例及说明文件什么的指导性东西,非常感谢!!!