【发布时间】:2018-02-17 17:25:16
【问题描述】:
我想实时报告正在使用的内存量(闪存和 RAM)(嵌入式环境)。有谁知道这样做的技术? 我听说过使用“水印”,但真的不明白。
嵌入式系统是来自恩智浦 MagniV 系列的 16 位微控制器,应用的方法是裸机。
【问题讨论】:
-
你的意思是你想知道 Ram 的使用量是多少?
标签: c memory-management embedded
我想实时报告正在使用的内存量(闪存和 RAM)(嵌入式环境)。有谁知道这样做的技术? 我听说过使用“水印”,但真的不明白。
嵌入式系统是来自恩智浦 MagniV 系列的 16 位微控制器,应用的方法是裸机。
【问题讨论】:
标签: c memory-management embedded
可能不需要“即时”报告此类信息,因为内存使用情况是在链接代码时静态确定的。链接器生成的链接映射将提供此信息。
在运行时确定可能有用的是堆和堆栈的使用情况。如果可能的话,堆使用报告将完全取决于您正在使用的 C 库。例如使用 ARM 的库,__heapstats() 函数将提供该功能。
堆栈内存的“水印”涉及用特定的位模式填充它,然后扫描堆栈以查看该模式已更改的位置 - 这表示 最大 em> 堆栈使用情况(高水位线)。
一些链接器能够执行堆栈使用的静态分析,并且可以报告任何特定函数的最坏情况堆栈使用和调用路径。然而,分析是最坏情况,并且确定的调用路径在实际执行中永远不会发生。此外,此类分析无法通过函数指针变量或递归函数进行调用来提供堆栈使用情况。
关于各种常见场景(裸机、RTOS、内存映射和工具链组合)的堆栈使用分析的建议可以在this article中找到
【讨论】:
如果您使用 gcc 链接器,您可以使用 -Wl,--print-memory-usage 作为链接器参数,如 this question 所示。
【讨论】: