【Arm】如何通过Arm DS的Map文件查看堆栈调用情况

1、 文档目标

通过Arm DS生成的Map文件,查看工程的堆栈使用情况。


2、 问题场景

在对于工程进行调试和测试的时候,工程师通常需要了解目前工程的堆栈使用情况,是否有函数或者变量占用了过多的堆栈空间。或者在对于一些错误进行排查的时候也需要查看堆栈的使用情况。除了可以查看callgraph文件外,也可以通过Map文件进行查看。


3、软硬件环境

1)、软件版本:Arm DS 2023.0

2)、电脑环境:Windows 11

3)、外设硬件:无


4、解决方法

1)、Arm DS要生成Map文件需要在Properties窗口中,C/C++ Build->Setting->Arm Linker 6->Additional Information配置中,勾选Generate image map(--map)。并且在最下面的Redirect diagnostics output to file(--list)后面的输入框中输入map文件的文件名(如图4-1)。

如果需要查看全局变量的堆栈使用情况,需要勾选上List stack usage of global symbols这个选项。


图4-1


2)、重新构建工程后,就可以在工程目录下面看到map文件的生成了。(如图4-2)


图4-2


3)、在Map文件的Image Stack Usage Information.部分就可以看全局变量的堆栈情况了(如图4-3)


Maximum stack usage for Image.(Image部分的最大堆栈使用量)


Maximum Stack Usage for svcRtxKernelStart 0xe8 bytes.(svcRtxKernelStart的最大堆栈使用率0xe8字节)

Call chain for maximum stack usage(最大堆栈使用的调用链:):

svcRtxKernelStart => osRtxThreadStartup => svcRtxThreadNew => osRtxMemoryAlloc => MemBlockPtr(最大调用链)


........


Maximum Stack Usage for LED_Initialize 0x70 bytes.(LED_Initialize的最大堆栈使用率为0x70字节。)

Call chain for maximum stack usage(最大堆栈使用的调用链):

LED_Initialize => HAL_GPIO_Init(最大调用链)


图4-3