【问题标题】:Get address of ram sections during runtime在运行时获取 ram 部分的地址
【发布时间】:2020-12-16 15:01:34
【问题描述】:

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

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

我的方法是,用一个神奇的词从 .tbss 部分填充内存,直到堆栈指针。 在运行时,堆栈会增长,并会用数据覆盖我的魔法词。 在循环检查中,我能够将堆栈的末尾专用。从这些信息中,我可以得出大致的堆栈使用情况。

是否可以在我的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)

【问题讨论】:

  • 检查您对该产品的参考。这不是我们可以从模糊的屏幕截图中辨别出来的。
  • 讨论问题需要哪些信息?截图有什么问题?
  • 在类似的情况下,我需要的信息可以通过链接器在编译器可见性中可见的符号获得。类似于_section_SECTIONNAME_start。这会对你有帮助吗(问这个以确认我对你的问题的理解)?你能在你的环境中/为你的环境找到类似的东西吗?这是模糊的,因为我的记忆和你提供的信息。因此只有一个评论。对于答案,我可以研究我所指的环境以及标识符的精确命名......
  • 我含蓄地理解你不使用操作系统,甚至没有像 OSEK 这样的微型嵌入式操作系统。但是您可能会澄清这一点,因为操作系统(以及操作系统)的存在会显着改变您问题的答案。
  • @Yunnosch:不,我没有使用任何操作系统,所以我的整个应用程序中只有一个堆栈。我编辑了问题并添加了我的 .map 文件的一部分。我不知道从我的环境中获取更多信息。我无权访问链接器脚本。内存放置在一个 xml 文件中进行管理,该文件包含在 Segger Studio 中

标签: c assembly stack-overflow ram


【解决方案1】:

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

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

extern char __bss_end__;

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

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

【讨论】:

  • 看起来像我的意思。假设我带你去发现:我的荣幸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 2015-10-10
  • 2013-05-14
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
相关资源
最近更新 更多