2

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

*******************************************************************************
*** 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 帮助中搜索但不清楚。

提前致谢

4

1 回答 1

2

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

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

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

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

于 2015-07-10T15:20:27.477 回答