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

STM32出现HardFault_Handler故障的缘由主要有两个方面:指针

一、内存溢出或者访问越界。这个须要本身写程序的时候规范代码,遇到了须要慢慢排查。调试

二、堆栈溢出。增长堆栈的大小。blog

出现问题时排查的方法:ip

一、添加软件断点,一旦在调试过程当中出现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打开异常发生的报告,查看发生异常的缘由。io

 

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


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

(2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也能够直接双击)变量

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

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

相关文章
相关标签/搜索