6

我正在将一个用于 ARM 芯片的程序从 IAR 编译器移植到 gcc。

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

有什么办法可以用 GCC 做同样的事情吗?我搜索了 GCC 手册,但找不到任何相关内容。


更多细节:
有问题的内存段必须位于固定位置,以便程序可以与芯片上的某些外围设备正确连接。原始代码使用__segment_begin运算符来获取此内存的地址并__segment_size确保它不会溢出此内存。

我可以通过添加变量来指示这些内存段的开始和结束来实现相同的功能,但是如果 GCC 具有类似的运算符,这将有助于最大限度地减少依赖于编译器的代码的数量,我最终不得不编写和维护。

4

2 回答 2

2

链接器的标志--section-start呢?我在这里读到的支持。

可以在AVR Freaks 论坛上找到如何使用它的示例:

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

然后,您必须添加到链接器的选项:-Wl,--section-start=.honk=address.

于 2011-03-13T20:41:59.510 回答
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)
于 2016-06-02T06:02:07.517 回答