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