编译指令与GHS编译器编译代码为海合会
#pragma ghs section data = ".shareddata"
// some c code
#pragma ghs section data = default
我们如何定义编译指示使用的GCC上述事情
编译指令与GHS编译器编译代码为海合会
#pragma ghs section data = ".shareddata"
// some c code
#pragma ghs section data = default
我们如何定义编译指示使用的GCC上述事情
节一般情况下,gcc不鼓励使用编译指示,而是建议您为函数和变量使用属性。
从GCC手册(“函数声明的Attibutes”):
通常,编译器将其生成在文本段中的代码。然而,有时候,您需要额外的部分,或者您需要某些特殊功能才能出现在特殊部分。 section属性指定一个函数存在于特定的部分。例如,以下声明:
extern void foobar (void) __attribute__ ((section ("bar")));
将函数foobar在酒吧部分。
从“指定变量的属性”
通常,编译器将其生成的对象等数据和bss部分。但是,有时您需要额外的部分,或者您需要某些特定的变量才能出现在特殊的部分中,例如映射到特殊的硬件。 section属性指定一个变量(或函数)位于特定的部分。例如,这个小程序使用一些特定的部分名称:
struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };
char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
int init_data __attribute__ ((section ("INITDATA")));
main()
{
/* Initialize stack pointer */
init_sp (stack + sizeof (stack));
/* Initialize initialized data */
memcpy (&init_data, &data, &edata - &data);
/* Turn on the serial ports */
init_duart (&a);
init_duart (&b);
}
使用全局变量而不是局部变量的部分属性,如图所示的例子。
您可以将section属性与初始化或未初始化的全局变量一起使用,但链接器要求每个对象都要定义一次,但未初始化的变量暂时放在common(或bss)部分中,并且可以乘以“已定义”。如果未初始化的变量具有多个定义,则使用section属性可更改变量进入的部分,并可能导致链接器发出错误。您可以使用-fno-common标志或nocommon属性强制变量初始化。 某些文件格式不支持任意部分,因此部分属性在所有平台上都不可用。如果您需要将模块的全部内容映射到特定部分,请考虑使用链接器的功能。
为什么你想在不实时的环境中有不同的内存部分? (我只想知道purpouse为了稍后做一个简短的研究:))? – Ordiel
@Ordiel例如:你可以定义一个宏来定义一些要存储在特殊部分中的结构。您可以在任何地方执行这些定义(跨越多个对象文件),因为一旦对象文件链接并合并它们的部分,每个这样的结构都会在编译时放入特殊节中,您仍然可以在运行时逐一浏览数组。这用于调用C++全局初始化器。 – Pyjong