首先,在程序中我设置了一个hardfault:

然后运行程序程序复位,通过log打印可以看到通用寄存器的值:

我们主要看lr的值,然后debug调试程序,打开keil的Disassembly窗口,在View菜单中,
拖动鼠标找到0x800d7b1这个位置(大概位置就可以)出现hardfault的地方就在lr地址后面的地址出的代码:

我们双击D7B2这个地址,代码跳转到这个函数中,仔细检查这个函数没有问题,推测可能是调用此函数的地方出现了问题:

可以看到第一张图中我们设置的hardfault测试,给这个函数传入的参数是一个-1,那么就是这里导致的hardfault,-1传入就是一个很大的值,而这个函数中要取buf里的值,这就导致buf越界了从而产生hardfault.

当程序触发hardfault时,通过Log查看通用寄存器值,特别是LR。在Keil Disassembly窗口找到LR对应的代码位置,发现可能出问题的函数。通过检查函数调用,发现在给特定函数传递-1作为参数时,导致了越界访问buf,从而引发了hardfault。
2697

被折叠的 条评论
为什么被折叠?



