地图文件中STM32的IAR堆栈使用



我不太明白我固件地图文件中关于堆栈使用的一些细节的含义。我在地图文件中添加了如下内容:

*******************************************************************************
*** 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定义,它将列出大小。

相关内容

  • 没有找到相关文章

最新更新