1、 文档目标
用于排查使用MDK进入开发过程中,是否是因为堆栈溢出导致出现HardFault_Handler硬件中断。
2、 问题场景
HardFault_Handler硬件中断是在对ARM芯片进行开发过程中遇到的最难处理的中断信号(图2-1)。硬件中断出现基本上是由内存溢出、访问越界和堆栈溢出。对于内存溢出、访问越界这两个原因需要自行根据代码的情况去排查。堆栈溢出情况可以通过下面的方法去确认堆栈溢出的大概位置,便于缩小范围,尽快排查问题出现的位置。

图2-1
3、软硬件环境
1)、软件版本:Keil MDK 5.38a
2)、电脑环境:Windows 11
3)、外设硬件:无
4、解决方法
1)、当发现出现硬件中断后,需要在HardFault_Handler函数中设置断点。
2)、当程序停止到断点处后,通过Register窗口中Internal的Stack确认堆栈指针类型是什么?图4-2显示的就是MSP。

图4-2
3)、然后,确认Banked中MSP指针的值。(如图4-3)

图4-3
4)、然后,通过图示的位置打开Memory 1窗口。在Memory 1窗口中的Address中输入MSP的值(如图4-4)。在输出结果中找到以“08”开头的地址信息。这个就是具体代码的位置。

图4-4
5)、然后,在Disassembly窗口中,右键打开菜单找到Show Disassembly at Address(如图4-5-1),在打开的Show code at Address窗口中以0x为开头的方式输入在Memory1中确认的地址信息(如图4-5-2),然后,就可以跳转到对应的代码位置。然后,根据跳转的代码位置去确认堆栈溢出的位置即可。

图4-5-1

图4-5-2