前言
在嵌入式应用开发过程中,由于MCU的存储资源有限,因此堆栈空间大小的设定极为关键。堆栈空间设置过大则会造成资源的浪费,堆栈空间设置过小则可能导致堆栈溢出等问题。如何设定一个合理的堆栈空间大小困扰着很多人,IAR的堆栈使用分析功可以帮助工程师设定一个合理的堆栈空间大小。
本文将介绍如何通过IAR进行堆栈使用分析。IAR的堆栈使用分析功能包括堆栈使用的理论分析和调试过程中实际堆栈使用情况监测(stack观察窗口)。
01
堆栈使用理论分析
1、通过下方路径选项勾选,使能堆栈理论分析。
Project > Options > Linker > Advanced > Enable stack usage analysis
2、堆栈使用情况的理论分析结果会保存在map文件中的“STACK USAGE”段,因此还需要勾选
Linker->List->Generate linker map file选项,以生成map文件。
3、在map文件中找到“STACK USAGE”段,理论分析结果中,应用程序Program entry和中断interrupt的堆栈使用是分开的,且提供了这两者的堆栈最大使用数值Max Use和总共的堆栈使用数值Total Use。
4、通过理论分析结果计算合理的堆栈空间以设定其大小,计算公式如下:
CSTACK Size >= maxstack(“Program entry”) + totalstack(“interrupt”) + safety margin(100);
需要设定的堆栈空间大小等于应用程序的最大堆栈使用加上中断服务程序的最大堆栈使用(假设所有的中断同时发生),再加上100字节的预留空间。
5、若应用程序中包含递归调用函数、函数指针间接调用等,还需要额外提供理论分析控制文件指定递归层数和间接调用的函数等,控制文件的具体使用请参阅阅读原文中的“IAR C/C++ Development Guide”手册。
02
堆栈空间大小观察窗口
除了堆栈使用理论分析功能外,IAR还提供了观察窗口,在调试过程中可视化应用程序实际堆栈使用。
1、通过Tools > Options > Stack > Enable graphical stackdisplay and stack usage tracking使能堆栈跟踪和可视化分析功能。
2、进入调试界面后,通过View->Stack打开Stack观察窗口,程序运行一段时间后,手动或由断点让程序暂停运行,stack窗口将显示应用程序运行到当前位置的实际堆栈使用情况。
鼠标移动到stack进度条位置时,将显示具体的堆栈使用信息。其中灰色部分代表开始运行到当前断点时刻已使用的最大堆栈空间,绿线位置代表当前断点时刻的堆栈指针,浅灰色部分代表未使用的堆栈空间。Stack窗口还显示当前堆栈指针地址和内容等信息。
总结
IAR提供了强大的调试功能,工程师若能了解并灵活应用这些功能将有效提高工作效率。更多IAR的功能介绍和使用技巧可以关注下方微信公众号。