我正在为嵌入式系统编写启动代码——在跳转到 main() 函数之前加载初始堆栈指针的代码——我需要告诉它我的应用程序将使用多少字节的堆栈(或者更大,保守估计)。
我被告知 gcc 编译器现在有一个 -fstack-usage 选项和 -fcallgraph-info 选项,它们可以以某种方式用于为我静态计算确切的“最大堆栈使用量”。(“使用 GCC 进行编译时堆栈需求分析”,Botcazou、Comar 和 Hainque 着)。
Nigel Jones 说递归在嵌入式系统中是一个非常糟糕的主意(“计算堆栈大小” 2009),所以我一直小心不要在这段代码中创建任何相互递归的函数。
另外,我确保我的中断处理程序在它们最后的从中断返回指令之前都不会重新启用中断,所以我不需要担心可重入中断处理程序。
如果没有递归或重入中断处理程序,应该可以静态确定最大堆栈使用量。(所以大多数关于如何确定最大堆栈使用量的答案?请勿应用)。我的理解是我(或者最好是我的 PC 上的一些代码,每次我重建可执行文件时都会自动运行)首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断中断时,以及最大值main() 函数未中断时的堆栈深度。然后我将它们全部加起来以找到总(最坏情况)最大堆栈深度。当 main() 后台任务在被最低优先级中断中断时处于其最大深度时,会发生这种情况(在我的嵌入式系统中),并且当它被下一个最低优先级中断时,该中断处于其最大深度中断等等。
我正在使用带有 gcc 4.6.0 的 YAARTO 来编译 LM3S1968 ARM Cortex-M3 的代码。
那么如何使用 gcc 的 -fstack-usage 选项和 -fcallgraph-info 选项来计算最大堆栈深度?还是有更好的方法来确定最大堆栈使用量?
(有关针对 Keil 编译器的几乎相同的问题,请参阅如何确定嵌入式系统中的最大堆栈使用量。)