专家好,对于多核之间用messageQ进行的通信的例子shmIpcBenchmark_c6678,我有一个疑惑:
在函数开始之前定义了很多的变量,如记录core号码的selfId,那么core0和core1在对selfId进行处理的时候,应该对应的是同一块内存吗?我看范例的意思好像是每个core都有自己的一个selfId,互相不干扰。
如果该变量是多核共享的,那么在程序里面多个core对该变量进行处理为什么没有使用任何的互斥的方式?
难道不是.out文件中,全局变量是多核可以共享的,如selfId等变量,而函数内部定义的函数,是出于各个core运行过程中建立的stack中的,是私有的。
King Wang1:
out文件都是单独的,因此多个共享变量不是靠一个out文件定义出来的。以你的例子,只有所有核都将一个变量定义在一个地方,才能说是共享变量。
共享变量的互斥有很多方法,比如信号量,IPC中断等。
littleWhite:
回复 King Wang1:
那为什么我在main前面定义一个flag=0,在main里面用core0修改flag=1,然后core0对flag进行cache一致性维护,然后core1输出发现flag=1。而且用expression看core0,core1的flag地址是一样的?
yuanwen dong:
是每个核单独的,不是共享的。
但可以每个核上变量定义到同一个内存位置,达到类似全局的效果,教你一个方法。
(1)比如要共享变量share_variable,在每个核的代码中都声明:
///////////////////////////////////////////////////////////////////////////////////////////////
#pragma DATA_SECTION (share_variable, ".global_shared");static unsigned int share_variable;
///////////////////////////////////////////////////////////////////////////////////////////////
(2)在link文件*.cmd中加入段定义
//////////////////////////////////////////////////////////////////////////////
MEMORY {
…..VAR_SHARED_RAM: origin = 0x0C3E0000 length=0x00020000
…..}
….
.global_shared: type=NOINIT > VAR_SHARED_RAM
///////////////////////////////////////////////////////////////////////////////////////////////
这样每个核上的变量share_variable,都对应与M3中的同一个内存,这就达到了类似全局变量的效果。
另外,记得在访问核间共享内存时,用spin_lock互斥(C6678有64个硬件信号量)。
BTW:Enea提供针对C66的商用平台软件,如果有兴趣可以联系。
Br
William.dong@enea.com