STM32 ~ MDK环境下调试程序 HardFault_Handler 相关

STM32出现HardFault_Handler故障的原因主要有两个方面:

1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

2、堆栈溢出。增加堆栈的大小。

出现问题时排查的方法:

1、添加软件断点,一旦在调试过程中出现Hard Fault 则会停在__breakpoint(0)处。

void HardFault_Handler(void)  
{  
   
   if (CoreDebug->DHCSR & 1)
   { 
      //check C_DEBUGEN == 1 -> Debugger 
      Connected  
      __breakpoint(0);  // halt program execution here         
    }  
    while (1)  
    {  
    }  
}  

  当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的原因。

 

上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。


相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)

(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也可以直接双击)

这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。

补充:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2]在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常

 

posted @ 2018-02-01 14:17  Burden  阅读(399)  评论(0编辑  收藏  举报