【问题标题】:How to determine the memory being used on an embedded system C?如何确定嵌入式系统 C 上使用的内存?
【发布时间】:2018-02-17 17:25:16
【问题描述】:

我想实时报告正在使用的内存量(闪存和 RAM)(嵌入式环境)。有谁知道这样做的技术? 我听说过使用“水印”,但真的不明白。

嵌入式系统是来自恩智浦 MagniV 系列的 16 位微控制器,应用的方法是裸机。

【问题讨论】:

  • 你的意思是你想知道 Ram 的使用量是多少?

标签: c memory-management embedded


【解决方案1】:

可能不需要“即时”报告此类信息,因为内存使用情况是在链接代码时静态确定的。链接器生成的链接映射将提供此信息。

在运行时确定可能有用的是堆和堆栈的使用情况。如果可能的话,堆使用报告将完全取决于您正在使用的 C 库。例如使用 ARM 的库,__heapstats() 函数将提供该功能。

堆栈内存的“水印”涉及用特定的位模式填充它,然后扫描堆栈以查看该模式已更改的位置 - 这表示 最大 em> 堆栈使用情况(高水位线)。

一些链接器能够执行堆栈使用的静态分析,并且可以报告任何特定函数的最坏情况堆栈使用和调用路径。然而,分析是最坏情况,并且确定的调用路径在实际执行中永远不会发生。此外,此类分析无法通过函数指针变量或递归函数进行调用来提供堆栈使用情况。

关于各种常见场景(裸机、RTOS、内存映射和工具链组合)的堆栈使用分析的建议可以在this article中找到

【讨论】:

  • 第一句话对flash来说是正确的,但是ram场景不同,水印解释真的很好,你分享的资源对我帮助很大,现在我清楚了。谢谢。
  • @Kahjiit :你错了。链接映射将包括静态分配的 RAM 使用情况,包括堆和堆栈分配(但不包括堆栈和堆 usage)。
  • @Cliddord:正如您所看到的,这个问题从未提及分配。我知道我可以从链接器获取(和配置)它。问题是关于使用情况。
  • @Kahjiit :这显然是一个观点问题。从链接器的角度来看,分配的所有内存都是使用的。从应用程序的角度来看,堆栈池和堆池的使用都是可变的。所以第一个陈述没有任何错误。由于在您的问题中您将闪存的使用与 RAM 混为一谈,因此假设链接器 PoV 并非不合理,但由于您希望“即时”确定使用情况,因此我清楚地涵盖了这两种可能性。涵盖您没有预料到或需要的方面的答案不会使其错误。
【解决方案2】:

如果您使用 gcc 链接器,您可以使用 -Wl,--print-memory-usage 作为链接器参数,如 this question 所示。

【讨论】:

  • 这仅显示静态用法,但它是一个开始。它可以结合打印出运行时使用情况,例如堆栈指针和有效堆大小,尽管堆栈至少在程序的不同部分会有所不同。将内存初始化为唯一值,然后在某些操作后将其全部转储可能会显示高水位记录。
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2012-06-07
  • 2011-09-16
  • 2010-09-12
  • 2010-09-15
相关资源
最近更新 更多