有哪些方法可用于确定嵌入式/内存受限系统的最佳堆栈大小?如果它太大那么浪费的内存可以在其他地方使用.但是,如果它太小,那么我们得到这个网站的同名......
为了尝试快速启动:Jack Ganssle在"嵌入式系统设计的艺术"中指出,"凭借经验,人们可以学习标准的,科学的方法来计算堆栈的正确尺寸:随机选择尺寸并希望." 任何人都可以做得更好吗?
要求提供更具体的例子.那么,在没有操作系统的情况下使用IAR Embedded Workbench工具链,针对具有2 kB RAM 的MSP430 MCU的C程序怎么样?使用JTAG调试器时,此IDE可以显示堆栈内容和使用情况.
确定最深堆栈使用情况的最常用方法是使用一些已知但不寻常的值初始化堆栈内存,然后定期(或在大型测试运行结束时)查看该模式停止的位置.
这正是IAR IDE确定使用的堆栈量的方式.
您使用静态分析标记了您的问题,但这是一个难以通过静态分析解决的问题.堆栈使用情况取决于程序的运行时配置文件,特别是,如果您正在使用递归或alloca.鉴于这是一个嵌入式平台,我想也很难运行像ps或top这样的东西,看看你的应用程序使用了多少堆栈.
一种有趣的方法是使用当前堆栈帧的地址来确定使用了多少堆栈.您可以通过获取函数参数或局部变量的地址来完成此操作.为主函数和您认为使用最多堆栈的函数执行此操作.差异将告诉您应用程序所需的堆栈数量.这是一个例子(假设通常的从高到低的堆栈增长).
char *stack_top, stack_bottom; int main(int argc, char *argv[]) { stack_top = (char *)&argc; // ... printf("Stack usage: %d\n", stack_top - stack_bottom); } void deeply_nested_function(void) { int a; stack_bottom = (char *)&a; // ... }
如果你的编译器允许你指定一个自定义函数序言(很多都是为了允许基于图形的程序分析),你甚至可以安排所有函数调用这样的测量代码.然后你的测量功能就像是
void stack_measurement_function(void) { int a; stack_bottom = min(stack_bottom, (char *)&a); // ... }
我使用了类似于我所描述的方法来生成这些图表.
使用良好的源代码静态分析工具,您可以为您的应用程序生成调用图.鉴于此,以及编译器生成的本地/临时数量的估计,您可以直接计算堆栈需求的保守估计.
我所说的"好"分析工具是一个可以读取所有涉及的编译单元,可以确定直接函数调用,可以确定间接指针,在compilaiton单元中,可以计算整个系统的保守点 - 分析,可以构建一个考虑到点到分析的调用图.这消除了很多工具,这就是人们看到特殊方法的原因,例如"在运行时填充堆栈并查看会发生什么".您还需要估计编译器在堆栈上放置的堆栈需求; 通过简单地了解所有类型的存储需求有多大,您可以近似大量,这对于嵌入式系统C程序来说通常相当容易确定.最后,你需要相信你的应用程序没有递归调用,或者该工具知道最深的递归(可能是你告诉它).
DMS软件重新设计工具包满足C程序的所有这些要求.请参阅http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html 您仍需要将其配置为通过爬网调用图并使用各种大小估计来计算堆栈需求.
如果您想快速回答,请使用堆栈填充技巧.如果您想要在每个源代码更改后可以重新计算的答案,则需要使用静态分析方法.