映射文件中 STM32 的 IAR 堆栈使用

IAR Stack Usage for STM32 in the map File

我不太明白我的固件映射文件中关于堆栈使用的一些细节的含义。 我在地图文件中有这个:

*******************************************************************************
*** STACK USAGE
***

  Call Graph Root Category  Max Use  Total Use
  ------------------------  -------  ---------
  interrupt                      48        112
  Program entry                 704        704
  Uncalled function             424     25 424

谁能帮我理解 "Max Use" 和 "Total Use" 是什么意思?堆栈的实际大小是多少?是 48+704+424 还是 112+704+25424 ?堆栈是否包含未调用函数的数据?我在IAR Help中搜索,但不清楚。

提前致谢

"Max Use" 列指的是该行类别中任何一个函数的最大使用量。在第一行,中断,表示任何标记为中断的函数的最大堆栈深度为 48 字节。在你未调用的函数中,可能被函数指针引用,或者可能被用作任务入口函数,单个最深的堆栈是 424 字节深。最后,您的程序入口(因此,从重置开始使用主堆栈)的最大深度为 704 字节。

"Total Use" 列汇总了每个类别中所有项目的堆栈使用情况。因此,对于中断,这是所有中断堆栈使用的总和,并且在 Cortex-M3 上很有用,因为中断可以嵌套。如果每个中断触发和嵌套,此值为您提供您希望在中断堆栈上看到的函数调用的最大深度,减去核心堆栈为您提供的寄存器。对于未调用函数,这个数字用处不大,因为预计未调用函数会嵌套并同时全部堆叠起来。最后,您的程序入口,因为只有其中一个,所以在所有(一个)程序入口点中的总使用量为 704 字节。

如果您要确定应该使用的筹码量大小,那么此摘要并不是那么有用。由于大量使用未调用函数,您要么有 IAR 无法解析的大量间接调用(通过函数指针或跳转表),要么有大量 RTOS 任务。对于间接调用,有一个 IAR pragma 指示它可能调用哪些函数,这将使堆栈分析更加准确。对于 RTOS 任务,您将需要在映射文件中进一步查看,以了解各个任务入口函数所需的堆栈大小。

如果您只是想看看分配了多大的堆栈,您可以在映射文件的其他部分查找 CSTACK 定义,它会列出大小。