【问题标题】:Is there a way to access the location of __bss_end at compile time?有没有办法在编译时访问 __bss_end 的位置?
【发布时间】:2021-02-28 04:07:52
【问题描述】:

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

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

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

我现在有

extern uint16_t __bss_end;

后来

Serial.println((uint16_t) &__bss_end);

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

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

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

【问题讨论】:

    标签: arduino avr-gcc


    【解决方案1】:

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

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

    【讨论】:

    • 这是个好主意。我想我会打破自己的条件并在运行时计算它。只是多了几条指令。
    猜你喜欢
    • 2022-10-07
    • 2014-02-10
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多