c - map 文件中 STM32 的 IAR 堆栈使用情况

标签 c stm32 iar map-files

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

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

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

有人可以帮助我理解“最大使用量”和“总使用量”的含义吗?堆栈的实际大小是多少?是 48+704+424 还是 112+704+25424 ?堆栈是否包含未调用函数的数据?我在IAR帮助中搜索但不清楚。

提前致谢

最佳答案

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

“总使用量”列是每个类别中所有项目的堆栈使用量的总和。因此,对于中断来说,这是所有中断堆栈使用量的总和,并且在 Cortex-M3 上很有用,因为中断可以嵌套。如果每个中断触发并嵌套,该值将为您提供您期望在中断堆栈上看到的函数调用的最大深度,减去内核为您堆栈的寄存器。对于未调用的函数,这个数字不太有用,因为预计未调用的函数不会嵌套并同时堆栈。最后,由于您的程序入口只有一个,因此所有(一个)程序入口点的总使用量为 704 字节。

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

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

关于c - map 文件中 STM32 的 IAR 堆栈使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31264513/

相关文章:

C 从 FILE* 打印文件路径

c - STM32:将地址映射存储在数组中

C++常量关键字异常行为

c - "#pragma calls"和条件编译

c - STM32F4 SPI配置SPI_Init导致assert_failed循环

c - IAR 中的值 <unavailable>

c - bsd gcc 预处理器宏 ##x## 没有提供有效的预处理标记

c - 如何在linux中通过C程序打开新终端

c++ - CMake 将共享库链接到静态库

macos - CS32F103C8T6 blue-pill 克隆 - 无法从 AC6 SystemWorkbench 闪存