在运行时获取 ram 部分的地址

Get address of ram sections during runtime

我想用 Segger Embedded Studio 为我的 NRF52840-Mikrocontroller 实现堆栈使用监视器。

为了监控最大堆栈使用量,我需要在运行时获取一些信息,例如 .bss 段的结束地址,这是我的空闲内存的开始。

我的方法是,用一个魔法词填充从 .tbss 部分到堆栈指针的 ram。 在运行时,堆栈会增长并用数据覆盖我的魔法词。 在循环检查中,我可以使用堆栈的末尾。从这些信息中,我可以推导出大概的堆栈使用情况。

在我的c(或ASM)程序中,是否可以在运行时从下图中获取地址?

这是我的 .map 文件的一部分,其中定义了例如符号 __bss_start。是否可以从 C 代码访问此符号?

 *(COMMON)
            0x0000000020020ec4                __bss_end__ = (__bss_start__ + SIZEOF (.bss))
            0x000000000001b8c8                __bss_size__ = SIZEOF (.bss)
            0x0000000020020ec4                __bss_load_end__ = __bss_end__
            0x0000000000000001                . = ASSERT (((__bss_start__ == __bss_end__) || ((__bss_end__ - __RAM_segment_start__) <= __RAM_segment_size__)), error: .bss is too large to fit in RAM memory segment)
            0x0000000020020ec4                __tbss_load_start__ = ALIGN (__bss_end__, 0x4)

感谢您的帮助,我现在已经解决了问题。

为了在运行时访问 .map 文件的符号,我使用了以下代码:

extern char __bss_end__;

int main()
{
    char * bss = &__bss_end__;
}

在这行代码之后,bss变量包含了bss段的起始地址。 使用此代码,我可以在运行时获取 RAM 段的地址以监控我的堆栈使用情况。