我在两个例程里面看到对全局变量的使用方法有矛盾,还请专家帮忙解释下
在shmIPC例程里面,在c文件开头定义了一些全局变量,从下文的程序中可以看出,各个core都有自己的全局变量,全局变量的值都不一样。
但是在led_play例程里面,定义了next_core这个全局变量,却被用于多核之间同步,因此可见多核都可以访问的是同一个内存空间。
这里我有一点想不明白,对于多核程序,全局变量是多核共享的还是每个core都有对应的全局变量?
如果全局变量是共享的,shmIPC中之所以多核各自访问得到的全局变量值不同,只是因为各自cache里面的数据没有维护一致性,那么这样的使用方式岂不是很不安全?
Andy Yin1:
如果是多核共享一个out的话,可以很容易做到多个核使用相同的变量名字对应不同的地址;如果多核共享一个out,如果定义的全局变量在LL2则是私有的,如果在共享memory则是共享变量。
siying long:
回复 Andy Yin1:
如果用不同的.out呢,多核共享同一变量出问题是什么原因???
怎么保证两个核中的同一个变量指向一个地址,核0的标识位isMCBSPInitialized置1了,但核1中isMCBSPInitialized还是0,没有同步,我两个核用相同的程序就可以同步。
两个核都是这样定义的
#pragma DATA_ALIGN (isMCBSPInitialized, 128)#pragma DATA_SECTION (isMCBSPInitialized, ".initialiedSharedMem");volatile Uint32 isMCBSPInitialized = 0;
核0:
isMCBSPInitialized = 1;
CACHE_wbL1d ((void *) &isMCBSPInitialized, 128, CACHE_FENCE_WAIT);
核1:
while (isMCBSPInitialized == 0)CACHE_invL1d ((void *) &isMCBSPInitialized, 128, CACHE_FENCE_WAIT);
核0的cmd:
SECTIONS{.init_array: load >> L2SRAM.mcbsp: load >> MSMCSRAM.initializedSharedMem: load >> MSMCSRAM// .mcbspSharedMem: load >> MSMCSRAMplatform_lib: load >> MSMCSRAMsystemHeap: load >> L2SRAM}
核1的cmd:
SECTIONS{.init_array: load >> L2SRAM.initialiedSharedMem: load >> MSMCSRAM.qmss: load >> MSMCSRAM.cppi: load >> MSMCSRAM}
Adam Yao94020:
回复 siying long:
一个简单的办法,你可以分别检查两个核的map文件,看看这两个变量是否分配到了MSMC上面的相同地址。如果分配到相同地址的话,这样操作是没有问题的。
siying long:
回复 Adam Yao94020:
怎么保证两个核中共享全局变量分配相同地址,我查看了两个map文件分配地址不一致。
Adam Yao94020:
回复 siying long:
最简单的办法就是多个核使用同一个out文件,将共享变量分配到MSMC中
如果每个核要使用不同out文件的话,需要在cmd中强制指定一个共享section的起始地址,然后将两个核的共享变量都分配到这个section中,同时共享变量最好定义在一个相同的C文件中,保证编译的时候分配在section中的顺序也相同