当代码在运行过程中进入到Hardfault时,若想要定位造成Hardfault的代码位置,则不能让芯片复位或者断电上电,要让芯片一直卡死在Hardfault当中,这时用JLINK连接上芯片,打开SEGGER的J-LINK Commander工具,输入connect
指令连接芯片,选择SWD接口。
连接完成后能读取Core ID等信息。
输入h
指令将芯片halt住,此时能读到以下的信息。
在这里可以看到代码运行到什么地方,以及此时的堆栈情况。
生成.asm文件的方法,Keil5→Options for Target...→User,在"After Build/Rebuild"中输入fromelf --text -a -c -o "$L@L.asm" "#L"
后,编译即可。
输入mem32 <Addr>, <NumBytes>
读取内存信息,再配合生成的.asm文件锁定Hardfault的大概的位置。
对于堆栈溢出造成的Hardfault需要分析堆栈的情况,由Keil编译生成的bin文件的前4个字节为栈顶(小端模式),减去MSP(栈底)可以计算出运行过程中所使用的栈空间大小,如果溢出了则需要修改启动文件中的栈空间大小。
网友评论