点击蓝字
关注我们
堆栈是嵌入式系统中非常基础但又特别重要的概念。正确设置堆栈的大小对于嵌入式系统的稳定性和可靠性非常重要。如果堆栈设置过小,可能会引起堆栈溢出,从而导致系统运行异常。反之,如果堆栈设置过大,则会造成宝贵RAM资源的浪费。由于堆栈需要开发人员指定分配,因此开发人员需要知道堆栈的使用情况,从而正确设置堆栈的大小。
本文主要介绍如何在IAR Embedded Workbench中分析和监控堆栈的使用,帮助开发人员正确设置堆栈的大小,提高系统的稳定性和可靠性,同时最大程度地减小RAM资源的使用。
静态堆栈使用分析
在下面的例子中,程序入口根函数 (__iar_program_start) 的最大堆栈深度为 288 字节,中断根函数 (__interrupt_170 and _default_handler) 的最大堆栈深度为 120 字节。
*************************************************************************
*** STACK USAGE
***
Call Graph Root Category Max Use Total Use
------------------------ ------- ---------
interrupt 120 120
Program entry 288 288
Program entry
"__iar_program_start": 0xffffb14c
Maximum call chain 288 bytes
"__iar_program_start" 4
"_main" 8
"_printf" 8
"__PrintfFullNoMb" 152
"__LdtobFullNoMb" in xprintffull_nomb.o [4] 80
"__GenldFullNoMb" in xprintffull_nomb.o [4] 36
interrupt
"__interrupt_170": 0xffffaa22
Maximum call chain 52 bytes
"__interrupt_170" 52
interrupt
"_default_handler": 0xffff98cb
Maximum call chain 68 bytes
"_default_handler" 52
"_abort" 4
"__exit" 12
运行时堆栈使用监控
静态堆栈使用分析在构建时计算出理论上的最大堆栈深度。然而在程序运行过程中,实际的堆栈消耗一般很难到静态堆栈使用分析计算出的理论上的最大深度。IAR Embedded Workbench提供了一种方法来监控程序运行时的堆栈使用,由 C-SPY 调试器实现。C-SPY 调试器可以在应用程序开始执行前用一个特殊数值模式,例如 0xCD 来填充整个堆栈区域。在程序运行一段时间后(最好是在某些测试条件下),堆栈内存可以从其末端向上检查,直到找到一个与 0xCD 不同的值,这可以被认为是 SP 曾经到达的最大位置。由于堆栈内存中仍然包含 0xCD 的部分从未被覆盖过,因此将堆栈的大小减少到这个数量是安全的。当然,最好保留一点额外的空间,以防您的测试没有持续足够长的时间,或者没有准确地反映所有可能的运行情况。
注意:
总结
参考文献:
1. IAR C/C++ Development Guide (Stack usage analysis)
2. How much stack memory do I need for my Arm Cortex-M applications? : https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/how-much-stack-memory-do-i-need-for-my-arm-cortex--m-applications
3. C-SPY® Debugging Guide (Monitoring stack usage)
4. IAR Embedded Workbench Integrated software and RTOS:https://www.iar.com/products/integrations/
END
关注我们
学习更多嵌入式知识