2013-07-23 18 views
1

编译指令与GHS编译器编译代码为海合会

#pragma ghs section data = ".shareddata" 

// some c code 

#pragma ghs section data = default 

我们如何定义编译指示使用的GCC上述事情

+1

为什么你想在不实时的环境中有不同的内存部分? (我只想知道purpouse为了稍后做一个简短的研究:))? – Ordiel

+1

@Ordiel例如:你可以定义一个宏来定义一些要存储在特殊部分中的结构。您可以在任何地方执行这些定义(跨越多个对象文件),因为一旦对象文件链接并合并它们的部分,每个这样的结构都会在编译时放入特殊节中,您仍然可以在运行时逐一浏览数组。这用于调用C++全局初始化器。 – Pyjong

回答

3

节一般情况下,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属性强制变量初始化。 某些文件格式不支持任意部分,因此部分属性在所有平台上都不可用。如果您需要将模块的全部内容映射到特定部分,请考虑使用链接器的功能。