如何确定嵌入式系统中的最大堆栈使用量?

10
当我给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编译器的相同问题。)

2
也许你可以编写一些虚拟的 C 代码(从堆栈使用的角度来看),以替代汇编模块,并用它们来运行分析。 - Ira Baxter
我添加了“Keil”标签,因为这是一个特定于编译器的问题。希望这样能吸引更多专业人士关注这个问题。 - bta
我不确定您是在询问如何让GCC进行类似的分析,还是如何摆脱Keil的“+ Unknown”消息(或者您可能正在寻找两者,那么应该有两个单独的问题)。既然您已经确定“+ Unknown”来自使用零栈的函数,那么您似乎可以忽略它。 - Michael Burr
1
顺便提一下,GCC 4.6似乎添加了“-fstack-usage”选项,可以按函数基础给出堆栈使用情况统计。如果将此信息与由“cflow”或类似工具生成的调用图结合起来,就可以获得所需的堆栈深度分析(编写一个脚本可能很容易实现这一点)。因此,似乎可以使用GCC完成此操作,但您可能需要组合正确的一组工具。 - Michael Burr
1
你尝试过使用FRAME PUSH 0或者FRAME ADDRESS sp指令告诉Keil工具这些汇编函数不使用任何堆栈吗?我无法访问工具链,所以只能根据在线文档来询问。 - Michael Burr
显示剩余2条评论
2个回答

3
请在链接器选项中使用--info=stack。这样,映射文件将包括所有具有外部链接的函数的堆栈使用情况。
在单任务环境中,main()的堆栈使用情况将为您提供总需求量。如果您正在使用像RTX这样的RTOS,其中每个任务都有自己的堆栈,则需要查看所有任务入口点的堆栈使用情况,然后再添加一些(在RTX的情况下为64字节)以用于任务上下文存储。
此外,适用于Keil和更普遍的其他技术在这里描述。

3

犹他大学的John Regehr在http://www.embedded.com/design/prototyping-and-development/4025013/Say-no-to-stack-overflow中对嵌入式系统中测量堆栈使用情况进行了很好的讨论,但请注意,链接到ftp.embedded.com已过时,并且“未禁用中断”出现了一次,应该将第一个或最后一个单词否定。在商业领域,Coverity具有可配置的堆栈溢出检查器,某些版本的CodeWarrior具有半文档化的warn_stack_usage pragma。(它没有在我的编译器文档中提到,但在MetroWerks的“针对Palm OS”文档中提到。)


很棒的链接,我希望能够将其中一些技巧用于我正在进行的Freescale HCS08工作中(2KB RAM,因此每个字节都很重要,您不想在未使用的堆栈上浪费它们)。世界真小:在90年代,您创建了Newton的Kagi Register应用程序,而我创建了order.kagi.com网站。 - tomlogic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接