__attribute__((at(address)))和零初始化__attribute__((section("name")))从Arm编译器5迁移到编译器6
Arm编译器5支持以下属性,而Arm编译器6不支持这些属性:
- __attribute__((at(address))),用于指定函数或变量的绝对地址。
- __attribute__((at(address), zero_init)),用于指定零初始化变量的绝对地址。
- __attribute__((section(name), zero_init)),以将一个零初始化的变量放置在一个具有给定名称的零初始化的部分中。
- __attribute__((zero_init))如果变量有初始化时生成错误。
下表显示了使用Arm编译器6支持的特性的这些特性的迁移路径:
表4-4迁移 __attribute__((at(address)))和零初始化__attribute__((section("name")))
Arm编译器5属性 | Arm编译器6属性 | 描述 |
__attribute__((at(address))) | __attribute__((section(".ARM.__at_address"))) | Arm编译器6中的Arm链接仍然支持以部分的形式放置.ARM.__at_address 注意 Arm编译器6属性只支持一个指定该部分的字符串。若要使用算术表达式,请参见支持Arm编译器6中的at(地址)属性中的算术表达式. |
__attribute__((at(address), zero_init)) | __attribute__((section(".bss .ARM.__at_address" ))) | Arm编译器6中的armlink支持以.bss的形式放置零初始化的部分.bss.ARM.__at_address。.bss前缀是区分大小写,并且必须都是小写的。 |
__attribute__((section(name), zero_init)) | __attribute__((section(".bss.name" ))) | name是你可以选择的名字。.bss前缀是区分大小写,并且必须都是小写的。 |
__attribute__((zero_init)) | Arm编译器6默认情况下将零初始化的变量放在.bss部分中。但是,当您指定一个初始化器时,并不等于生成一个错误。 | 如果变量具有初始化器,则Arm编译器5将生成一个错误。否则,它将将零初始化的变量放在.bss部分中。 |
支持Arm中的at(address)属性中的算术表达式®编译器6
Arm编译器5中的at(address) 属性支持算术表达式,例如:
my_variable_type my_variable __attribute__((at(0xE0001000 + MY_PREDEFINED_OFFSET)));
要在Arm编译器6中执行类似的操作,必须使用指针方法。对于此Arm编译器5的示例,请将代码更改为:
static my_variable_type * const my_address = (my_variable_type *) (0xE0001000 + MY_PREDEFINED_OFFSET);
#define my_variable (*my_address)