假设IDE环境为Keil,芯片为STM32F103。
在stm32f10x_it.c中,添加软件断点,一旦调试时出现Hard Fault则会在停在__breakpoint(0)处。
[cpp] view
plaincopyprint?
-
-
void HardFault_Handler(void)
-
{
-
-
if (CoreDebug->DHCSR & 1) { //check C_DEBUGEN == 1 -> Debugger Connected
-
__breakpoint(0); // halt program execution here
-
}
-
while (1)
-
{
-
}
-
}
当进入Hard
Fault断点后,菜单栏Peripherals >Core Peripherals >Fault
Reports打开异常发生的报告,查看发生异常的原因。
上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)
(2)在Call Stack的HardFault_Handler上右键Show Caller
Code(有的Keil版本也可以直接双击)
这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。
再说明2点:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]
在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常
Refrences:
[1] Application Note
209. Using Cortex-M3 and Cortex-M4 Fault
Exceptions.
[2] Cortex-M3权威指南