我正在将一个ARM芯片的程序从IAR编译器移植到gcc。
在原始代码中,IAR特定运算符(如__segment_begin
和__segment_size
)分别用于获取某些内存段的开头和大小。
有没有办法和GCC做同样的事情?我搜索过GCC手册,却找不到任何相关内容。
更多细节:
所讨论的存储器段必须位于固定位置,以便程序可以正确地与芯片上的某些外围设备接口。原始代码使用__segment_begin
运算符来获取此内存的地址和__segment_size
,以确保它不会溢出此内存。
我可以通过添加变量来指示这些内存段的开始和结束来实现相同的功能,但是如果GCC具有类似的运算符,这将有助于最小化编译器相关代码的数量,我最终必须编写和维护。
答案 0 :(得分:2)
链接器的标志--section-start
怎么样?我读到了here。
有关如何使用它的示例,请参见AVR Freaks Forum:
const char __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1";
然后,您必须添加到链接器的选项:-Wl,--section-start=.honk=address
。
答案 1 :(得分:1)
GCC的现代版本将为每个段声明两个变量,即__start_MY_SEGMENT和__stop_MY_SEGMENT。要使用这些变量,您需要将它们声明为具有所需类型的外部。然后,您,然后使用'&'运算符以获取该段的开始和结束的地址。
extern uint8_t __start_MY_SEGMENT;
extern uint8_t __stop_MY_SEGMENT;
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT)