我想在我的代码中访问bss部分末尾的地址,并在编译时使用它进行操作。我是用avr-gcc为ATmega328p编译的。(当然:)
其目的是将剩余的RAM (在Arduino上)划分为偶数段。我有RAM的结尾,但不是全局不占用的开始。该程序假定没有动态内存分配。
我知道该位置在预处理器时或编译时不可用。但是,在上传代码之前,它应该是可用的。
现在我有
extern uint16_t __bss_end;然后后来
Serial.println((uint16_t) &__bss_end);这是可行的。它打印0x0F00 (RAMSTART) +使用的字节。然而,这将迫使我在运行时计算分区位置,这需要我将分区位置存储到变量中,从而浪费宝贵的RAM。
所以我想我要说的是:如何使用__bss_end在编译时计算这些常量(分区位置)?(或者,实际上,任何等效的东西)。
这只是一个有趣的项目,不是为了实用。
发布于 2021-03-06 03:28:46
当链接器将所有目标代码组合在一起时,__bss_end将作为创建可执行文件的最后阶段之一进行计算。
由于链接器计算是在所有编译步骤之后进行的,因此它显然不能在编译时直接使用,但是,一种选择是从一个构建中获取__bss_end的值,并将您获得的值作为编译时间常数应用到另一个构建中,然后在启动时断言新版本中的运行时__bss_end等于您计算的编译时版本。
https://stackoverflow.com/questions/66405729
复制相似问题