当我给Keil编译器添加"--callgraph"选项时,它会静态地计算出确切的"最大堆栈使用量"。但今天它给了我一个"最大堆栈使用量 = 284字节 + 未知(没有堆栈大小信息的函数...)"的消息,并列出了"没有堆栈信息的函数"列表。Nigel Jones说在嵌入式系统中递归是个非常糟糕的想法("计算堆栈大小"2009),所以我一直小心不在代码中创建任何相互递归的函数。此外,我确保我的中断处理程序在最终从中断返回指令之前不会重新启用中断,因此我不需要担心可重入中断处理程序。没有递归或可重入中断处理程序,应该能够静态确定最大堆栈使用量。(因此,大多数关于如何确定最大堆栈使用量?的答案不适用)。我理解处理"--callgraph"选项的软件首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断打断时,以及main()函数在没有被中断时的最大堆栈深度。然后将它们全部加起来,以找到总的(最坏情况下的)最大堆栈深度。这发生在main()后台任务在被最低优先级中断打断时处于最大深度,而该中断在被次低优先级中断打断时处于最大深度,以此类推。
我怀疑处理--callgraph的软件对“无堆栈信息函数”列表中的小汇编语言函数感到困惑。 --callgraph文档似乎暗示我需要手动计算(或进行保守估计)它们使用的堆栈大小——它们非常简短,所以应该很简单——然后“使用汇编语言代码中的帧指令描述您的代码如何使用堆栈”。
其中一个是将堆栈重置为零并跳转到main()的初始启动代码——因此,实际上,这不消耗任何堆栈。
另一个是“故障”中断处理程序,它会在无限循环中锁定,直到我循环电源——可以安全地假设这不消耗任何堆栈。
我正在使用Keil uVision V4.20.03.0为LM3S1968 ARM Cortex-M3编译代码。
那么,我如何使用“帧指令”告诉处理“--callgraph”的软件这些函数使用了多少堆栈?
还是有更好的方法来确定最大堆栈使用量吗?
(请参见如何使用gcc确定嵌入式系统中的最大堆栈使用量? ,几乎是针对gcc编译器的相同问题。)
我怀疑处理--callgraph的软件对“无堆栈信息函数”列表中的小汇编语言函数感到困惑。 --callgraph文档似乎暗示我需要手动计算(或进行保守估计)它们使用的堆栈大小——它们非常简短,所以应该很简单——然后“使用汇编语言代码中的帧指令描述您的代码如何使用堆栈”。
其中一个是将堆栈重置为零并跳转到main()的初始启动代码——因此,实际上,这不消耗任何堆栈。
另一个是“故障”中断处理程序,它会在无限循环中锁定,直到我循环电源——可以安全地假设这不消耗任何堆栈。
我正在使用Keil uVision V4.20.03.0为LM3S1968 ARM Cortex-M3编译代码。
那么,我如何使用“帧指令”告诉处理“--callgraph”的软件这些函数使用了多少堆栈?
还是有更好的方法来确定最大堆栈使用量吗?
(请参见如何使用gcc确定嵌入式系统中的最大堆栈使用量? ,几乎是针对gcc编译器的相同问题。)
FRAME PUSH 0
或者FRAME ADDRESS sp
指令告诉Keil工具这些汇编函数不使用任何堆栈吗?我无法访问工具链,所以只能根据在线文档来询问。 - Michael Burr