在IAR Embedded Workbench中分析和监控堆栈使用
发布网友
发布时间:2024-10-03 15:27
我来回答
共1个回答
热心网友
时间:2024-10-03 15:41
堆栈在嵌入式系统中扮演着核心角色,正确设定堆栈大小是确保系统稳定与可靠的关键。过小的堆栈可能导致堆栈溢出,引起系统异常;而过大的堆栈则浪费宝贵的RAM资源。由于堆栈由开发者指定,因此,了解堆栈使用情况对于正确设定堆栈大小至关重要。
本文旨在介绍如何使用IAR Embedded Workbench进行堆栈分析与监控。它不仅帮助开发者设定适当的堆栈大小,提升系统稳定性和可靠性,同时优化RAM使用。若需详细了解堆栈基础知识,请参考过往推荐文章。
静态堆栈使用分析涉及链接器计算根函数(不被其他函数调用的函数,包括启动函数、中断函数与RTOS任务函数等)的最大堆栈使用量。通过在IAR Embedded Workbench中启用堆栈使用分析,链接器生成的map文件将列出每个根函数的最大堆栈深度。在Project>Options>Linker>Advanced中,选择Enable stack usage analysis开启该功能。
请确保在Project>Options>Linker> List选项卡中勾选Generate Linker map file以使map文件生成。举例来说,程序入口根函数(__iar_program_start)的最大堆栈深度为288字节,中断根函数(__interrupt_170和_default_handler)的最大堆栈深度为120字节。
注意:1. 计算的最大堆栈深度需基于准确的函数堆栈使用信息,编译器通常为每个函数生成此信息。但若涉及函数指针的间接调用,开发者需提供相应的调用信息。2. map文件中的最大堆栈深度不包含中断/任务抢占所需的额外堆栈空间,需由开发者手动计算。更多详情请参阅Arm Cortex-M专家Joseph Yiu的文章。
运行时堆栈使用监控是通过C-SPY调试器实现的。调试器在程序启动前用特殊数值模式(例如0xCD)填充堆栈区域。运行一段时间后,堆栈内存从末端向上检查,直至找到与0xCD不同的值,即SP曾经到达的最大位置。由此计算出堆栈大小并减去未被覆盖的部分,确保保留额外空间以防测试不充分或未反映所有可能的运行情况。
在IDE Options> Stack选项中勾选Enable graphical stack display and stack usage tracking以启用此功能。调试时,通过View>Stack打开Stack窗口,执行停止操作时,C-SPY会更新堆栈使用情况。
图形显示的堆栈条,左端代表堆栈底部,即SP空时的位置,右端代表堆栈内存的末端。深灰色区域表示已使用的堆栈内存,浅灰色区域表示未使用的堆栈内存。当堆栈使用超过预设阈值时,图形堆栈条会变为红色。
注意:1. 该功能无法在堆栈溢出时立即检测,只能检测留下的痕迹。尽管这是一项可靠的堆栈使用监控方法,但并不能保证总是检测到堆栈溢出。例如,堆栈溢出时可能未正确增长到范围外,甚至改变了堆栈区域以外的内存,但堆栈内的数据未被修改。2. 该功能仅监控系统的主堆栈,无法监控RTOS中的任务堆栈。为此,IAR Embedded Workbench提供了对应RTOS的调试插件,用于监控运行时RTOS的任务堆栈。
总结:正确设定堆栈大小对于嵌入式系统至关重要,本文介绍了如何使用IAR Embedded Workbench进行静态堆栈分析与运行时监控,以帮助开发者了解应用程序堆栈使用情况,提升系统稳定性和可靠性。
参考文献:
1. IAR C/C++ Development Guide (Stack usage analysis)
2. How much stack memory do I need for my Arm Cortex-M applications? : community.arm.com/arm-c...
3. C-SPY® Debugging Guide (Monitoring stack usage)
4. IAR Embedded Workbench Integrated software and RTOS: iar.com/products/integr...