MSP430上C程序所需的最大堆栈大小

时间:2013-04-01 10:06:44

标签: c stack elf msp430

在不使用递归的C程序中,理论上应该可以计算出调用给定函数所需的最大/最坏情况堆栈大小,以及它调用的任何内容。是否有任何免费的开源工具可以从源代码或编译的ELF文件中执行此操作?

或者,有没有办法从ELF文件中提取函数的堆栈帧大小,所以我可以尝试手动解决它?

我正在使用MSPGCC 3.2.3编译MSP430(我知道它是旧版本,但在这种情况下我必须使用它)。要分配的堆栈空间在源代码中设置,并且应该尽可能小,以便其余的内存可以用于其他事情。我已经读过你需要考虑中断使用的堆栈空间,但我正在使用的系统已经考虑到了这一点 - 我正在尝试计算出多少额外的空间来添加。另外,我已经读过函数指针使这很困难。在这里使用函数指针的少数地方,我知道它们可以调用哪些函数,因此如果已知调用函数和调用函数所需的堆栈空间,则可以手动考虑这些情况。

静态分析似乎是比运行时堆栈绘制更强大的选项,但如果没有好的方法可以静态地执行它,那么在运行时处理它是一种选择。

修改

我找到了GCC的-fstack-usage标志,它在编译时保存每个函数的帧大小。不幸的是,MSPGCC不支持它。但对于那些试图在不同平台上做类似事情的人来说,这可能是有用的。

5 个答案:

答案 0 :(得分:1)

虽然静态分析是确定最大堆栈使用率的最佳方法,但您可能不得不求助于实验方法。此方法无法保证绝对最大值,但可以让您非常了解堆栈的使用情况。

您可以检查链接描述文件以获取__STACK_END和__STACK_SIZE的位置。您可以使用这些来填充堆栈空间,使用易于识别的模式,如0xDEAD或0xAA55。通过折磨测试运行您的代码,以尝试确保尽可能多的中断生成。

在测试之后,您可以检查堆栈空间以查看堆栈的覆盖量。

答案 1 :(得分:0)

有趣的问题。

我希望这些信息在调试版本中包含的调试数据中是静态可用的。

我简要介绍了DWARF标准,它确实为DW_AT_frame_baseDW_AT_static_link的函数指定了两个属性,可用于“计算框架” 子程序的相关实例的基础 它立即包含子程序或入口点“。

答案 2 :(得分:0)

我认为唯一要做的就是静态分析。您需要考虑所有非静态局部变量的空间,这些变量主要是指针,但无论如何都要存储在堆栈中的指针,您还需要为当前运行的地址保留空间。调用者,因为它将由编译器存储在堆栈中,因此控制可以在函数返回后返回给调用者,并且还需要所有函数参数的空间。 基于此,如果您有一个工具能够计算所有参数,自动变量并计算出它们的大小,您应该能够计算出您需要的最小堆栈帧大小。 请注意,编译器还可以尝试在特定体系结构的堆栈上对齐值,这可能会使堆栈空间要求比您对此计算所期望的要大一些。

答案 3 :(得分:0)

某些嵌入式IDE可以在运行时管理堆栈信息 我知道IAR eembedded workbench支持它。

请注意,您需要考虑到中断是异步发生的,因此请采用最大的堆栈使用方案并为其添加中断上下文。如果像ARM处理器那样支持嵌套中断,则还需要考虑这一点。

答案 4 :(得分:0)

TinyOS在堆栈大小分析方面做了一些工作。这里描述: http://tinyos.stanford.edu/tinyos-wiki/index.php/Stack_Analysis

他们只支持AVR,但是说“MSP430并不难以支持,但这不是超高优先级”。无论如何,该页面提供了大量资源。