我不太明白我固件地图文件中关于堆栈使用的一些细节的含义。我在地图文件中添加了如下内容:
*******************************************************************************
*** STACK USAGE
***
Call Graph Root Category Max Use Total Use
------------------------ ------- ---------
interrupt 48 112
Program entry 704 704
Uncalled function 424 25 424
谁能帮我理解"最大使用"one_answers"总使用"是什么意思?栈的实际大小是多少?48+704+424还是112+704+25424 ?堆栈是否包含未调用函数的数据?我在IAR帮助中搜索,但不清楚。
Thanks in advance
"Max Use"列是指该行所属类别中任意一个函数的最大使用量。在第一行中断中,它说任何一个标记为中断的函数的最大堆栈深度是48字节。在未调用的函数中,可能由函数指针引用,也可能用作任务入口函数,单个最深的堆栈深度为424字节。最后,您的程序项(即从重置开始使用主堆栈)的最大深度为704字节。
"总使用"列是每个类别中所有项目的堆栈使用之和。因此,对于中断,这是所有中断堆栈使用的总和,并且在Cortex-M3上很有用,因为中断可以嵌套。如果每个中断都触发和嵌套,这个值给你提供了你期望在中断堆栈上看到的函数调用的最大深度,减去核心为你堆栈的寄存器。对于未调用的函数,这个数字不太有用,因为不希望未调用的函数嵌套并同时堆叠。最后,由于只有一个程序入口点,所以所有(一个)程序入口点的总使用量为704字节。
如果你想确定你应该使用什么堆栈大小,这个总结并不是那么有用。由于大量使用未调用的函数,您要么有IAR无法解析的重要间接调用(通过函数指针或跳转表),要么有许多RTOS任务。对于间接调用,有一个IAR pragma来指示它可能调用哪些函数,这将使堆栈分析更加准确。对于RTOS任务,您需要进一步查看映射文件,以查看单个任务入口函数所需的堆栈大小。
如果你只是想看看堆栈已经分配了多大,你可以在映射文件的另一部分查看CSTACK
定义,它将列出大小。