我不太明白固件映射文件中有关堆栈使用情况的一些细节的含义。 我在 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/