首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在编译时访问__bss_end的位置?

有没有办法在编译时访问__bss_end的位置?
EN

Stack Overflow用户
提问于 2021-02-28 12:07:53
回答 1查看 60关注 0票数 0

我想在我的代码中访问bss部分末尾的地址,并在编译时使用它进行操作。我是用avr-gcc为ATmega328p编译的。(当然:)

其目的是将剩余的RAM (在Arduino上)划分为偶数段。我有RAM的结尾,但不是全局不占用的开始。该程序假定没有动态内存分配。

我知道该位置在预处理器时或编译时不可用。但是,在上传代码之前,它应该是可用的。

现在我有

代码语言:javascript
运行
复制
extern uint16_t __bss_end;

然后后来

代码语言:javascript
运行
复制
Serial.println((uint16_t) &__bss_end);

这是可行的。它打印0x0F00 (RAMSTART) +使用的字节。然而,这将迫使我在运行时计算分区位置,这需要我将分区位置存储到变量中,从而浪费宝贵的RAM。

所以我想我要说的是:如何使用__bss_end在编译时计算这些常量(分区位置)?(或者,实际上,任何等效的东西)。

这只是一个有趣的项目,不是为了实用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-06 03:28:46

当链接器将所有目标代码组合在一起时,__bss_end将作为创建可执行文件的最后阶段之一进行计算。

由于链接器计算是在所有编译步骤之后进行的,因此它显然不能在编译时直接使用,但是,一种选择是从一个构建中获取__bss_end的值,并将您获得的值作为编译时间常数应用到另一个构建中,然后在启动时断言新版本中的运行时__bss_end等于您计算的编译时版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档