当前位置:  开发笔记 > 前端 > 正文

如何确定最大堆栈使用量?

如何解决《如何确定最大堆栈使用量?》经验,为你挑选了3个好方法。

有哪些方法可用于确定嵌入式/内存受限系统的最佳堆栈大小?如果它太大那么浪费的内存可以在其他地方使用.但是,如果它太小,那么我们得到这个网站的同名......

为了尝试快速启动:Jack Ganssle在"嵌入式系统设计的艺术"中指出,"凭借经验,人们可以学习标准的,科学的方法来计算堆栈的正确尺寸:随机选择尺寸并希望." 任何人都可以做得更好吗?

要求提供更具体的例子.那么,在没有操作系统的情况下使用IAR Embedded Workbench工具链,针对具有2 kB RAM 的MSP430 MCU的C程序怎么样?使用JTAG调试器时,此IDE可以显示堆栈内容和使用情况.



1> Michael Burr..:

确定最深堆栈使用情况的最常用方法是使用一些已知但不寻常的值初始化堆栈内存,然后定期(或在大型测试运行结束时)查看该模式停止的位置.

这正是IAR IDE确定使用的堆栈量的方式.


@JXG - 对于Windows程序来说,这不太可行; 堆栈内存由操作系统管理,因此您没有很好的机会绘制堆栈.此解决方案更适合嵌入式系统,其中任务的堆栈通常由应用程序管理.我必须考虑如何在Windows上安全地执行此操作.

2> Diomidis Spi..:

您使用静态分析标记了您的问题,但这是一个难以通过静态分析解决的问题.堆栈使用情况取决于程序的运行时配置文件,特别是,如果您正在使用递归或alloca.鉴于这是一个嵌入式平台,我想也很难运行像pstop这样的东西,看看你的应用程序使用了多少堆栈.

一种有趣的方法是使用当前堆栈帧的地址来确定使用了多少堆栈.您可以通过获取函数参数或局部变量的地址来完成此操作.为主函数和您认为使用最多堆栈的函数执行此操作.差异将告诉您应用程序所需的堆栈数量.这是一个例子(假设通常的从高到低的堆栈增长).

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);
    // ...
}

我使用了类似于我所描述的方法来生成这些图表.


既然你在答案中说"这是一个难以通过静态分析解决的问题",我提到http://www.absint.com/stackanalyzer/

3> Ira Baxter..:

使用良好的源代码静态分析工具,您可以为您的应用程序生成调用图.鉴于此,以及编译器生成的本地/临时数量的估计,您可以直接计算堆栈需求的保守估计.

我所说的"好"分析工具是一个可以读取所有涉及的编译单元,可以确定直接函数调用,可以确定间接指针,在compilaiton单元中,可以计算整个系统的保守点 - 分析,可以构建一个考虑到点到分析的调用图.这消除了很多工具,这就是人们看到特殊方法的原因,例如"在运行时填充堆栈并查看会发生什么".您还需要估计编译器在堆栈上放置的堆栈需求; 通过简单地了解所有类型的存储需求有多大,您可以近似大量,这对于嵌入式系统C程序来说通常相当容易确定.最后,你需要相信你的应用程序没有递归调用,或者该工具知道最深的递归(可能是你告诉它).

DMS软件重新设计工具包满足C程序的所有这些要求.请参阅http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html 您仍需要将其配置为通过爬网调用图并使用各种大小估计来计算堆栈需求.

如果您想快速回答,请使用堆栈填充技巧.如果您想要在每个源代码更改后可以重新计算的答案,则需要使用静态分析方法.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有