2011-03-07 75 views
6

我正在将ARM芯片的程序从IAR编译器移植到gcc。如何从C代码引用段起始和大小

在原始代码中,IAR特定运算符(如__segment_begin__segment_size)分别用于获取某些内存段的开始和大小。

有没有办法用GCC做同样的事情?我搜查了GCC手册,但无法找到任何相关的内容。


更多细节:
所讨论的内存段必须在固定的位置,使得程序能够与芯片上的某些外围设备正确地对接。原始代码使用__segment_begin运算符来获取此内存的地址,并使用__segment_size以确保它不会溢出此内存。

我可以通过添加变量来指示这些内存段的开始和结束来实现相同的功能,但是如果GCC有类似的操作符,这将有助于最小化编译器相关代码的数量,最终我不得不编写和维护。

+0

您能更具体地了解您需要哪些细分地址和尺寸以及哪些细分受众群? – JeSuisse 2011-03-07 13:49:58

回答

2

链接器的标志--section-start?我读的是支持here

关于如何使用它的一个例子可以在AVR Freaks Forum发现:

const char __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1"; 

这样您就可以添加到链接器的选项:-Wl,--section-start=.honk=address

+0

谢谢。我想避免不得不更改链接器设置,因为我正在移植的代码旨在用于图书馆,这意味着图书馆的所有用户将不得不编辑链接器设置才能使其工作,如果可能, d喜欢避免。 – tomsgd 2011-03-18 00:43:57

0

GCC的现代版本将为每个分段声明两个变量,即__start_MY_SEGMENT和__stop_MY_SEGMENT。要使用这些变量,您需要将它们声明为具有所需类型的extern。之后,您然后使用'&'运算符来获取该段的开始和结束地址。

extern uint8_t __start_MY_SEGMENT; 
extern uint8_t __stop_MY_SEGMENT; 
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT)