【发布时间】:2013-05-27 12:03:25
【问题描述】:
如何确定微控制器中特定程序所需的堆栈内存? 例如,假设我有一个内部可能有许多子例程或线程的程序。在我开始执行程序之前,我想修复该程序的堆栈大小。如何标记堆栈的终点。
【问题讨论】:
-
使用较少或不使用局部变量或对您的项目进行分析,您应该知道所有代码路径,以及每个函数有多少本地数据。基本的嵌入式编程。
标签: microcontroller microprocessors
如何确定微控制器中特定程序所需的堆栈内存? 例如,假设我有一个内部可能有许多子例程或线程的程序。在我开始执行程序之前,我想修复该程序的堆栈大小。如何标记堆栈的终点。
【问题讨论】:
标签: microcontroller microprocessors
我假设您正在谈论一个 C 语言项目,没有动态分配内存。 堆栈使用的精确计算非常长且复杂。 您至少需要知道每个函数和调用图的堆栈使用情况(编译器可以提供此信息)。此外:有操作系统吗?每个线程都需要自己的堆栈。有中断程序吗?总堆栈使用量是每个当前执行流贡献的总和。
在许多情况下,经验方法更有效,即在运行时测量堆栈的使用情况。例如,您可以用固定模式填充整个堆栈区域,然后运行有意义的测试,然后检查“脏”区域的大小。实际大小可以通过应用安全边际来计算,例如 +50%。
【讨论】:
堆栈的限制来自您的微控制器拥有的内存量。您可以手动完成,这对于大型程序来说非常烦人,或者可以查看 elf dump 。在那里你会发现你的全局变量是如何占用内存的,然后剩余的可以用作堆栈。此外,要找出所需的最大堆栈,您需要查看最长的嵌套函数调用及其参数的大小。通过这种方式,您可以获得预先设置的最大堆栈要求的估计值。在最坏的情况下,您需要更多的堆栈,然后根据您的函数调用和参数的大小需要,那么您将需要进行一些优化。
【讨论】: