【发布时间】: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