我正在编写嵌入式系统的启动代码——加载 main() 函数前的初始堆栈指针的代码——我需要告诉它我的应用程序将使用多少字节的堆栈(或者一些更大的保守估计值)。
有人告诉我,gcc 编译器现在有一个 -fstack-usage 选项和一个 -fcallgraph-info 选项,可以用来静态地计算出确切的 "最大堆栈使用量"。 ("使用 GCC 进行编译时堆栈需求分析" by Botcazou、Comar 和 Hainque)。
Nigel Jones 表示,在嵌入式系统中递归是一个非常糟糕的想法("计算你的堆栈大小" 2009),因此我在这段代码中小心不要制作任何相互递归的函数。
此外,我确保我的中断处理程序在最终的从中断返回指令之前不会重新启用中断,因此我不需要担心可重入的中断处理程序。
不使用递归或可重入中断处理程序,应该可以静态确定最大堆栈使用量。(因此大多数如何确定最大堆栈使用量?的答案并不适用。) 我的理解是,我(或更好的是,每次重新构建可执行文件时自动运行的PC上的某些代码)首先找到每个中断处理程序在没有被更高优先级的中断打断时的最大堆栈深度,以及主函数(main())在没有被打断时的最大堆栈深度。然后将它们全部加起来,以找到总的(最坏情况下的)最大堆栈深度。这在我的嵌入式系统中发生,当主背景任务(main())在被最低优先级中断打断时达到最大深度,并且该中断在被次低优先级中断打断时达到最大深度,依此类推。我正在使用YAGARTO和gcc 4.6.0为LM3S1968 ARM Cortex-M3编译代码。
那么我如何使用gcc的-fstack-usage选项和-fcallgraph-info选项来计算最大堆栈深度呢?还是有其他更好的方法来确定最大堆栈使用量吗?
(请参见如何确定嵌入式系统中的最大堆栈使用量?,该问题与Keil编译器几乎相同。)