TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678:全局变量是多核共享的吗

专家好,对于多核之间用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

赞(0)
未经允许不得转载:TI中文支持网 » C6678:全局变量是多核共享的吗
分享到: 更多 (0)