zoukankan      html  css  js  c++  java
  • 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跳转到了不合法的内存地址产生异常

  • 相关阅读:
    Linux 打包文件 及 备份数据库
    YII事务
    MySQL两种存储引擎: MyISAM和InnoDB 简单总结
    mysql锁表查询和解锁操作
    Yii+MYSQL锁表防止并发情况下重复数据的方法
    B/S和C/S的区别及应用【转】
    Yii2.0的乐观锁与悲观锁
    【事务】脏读、不可重复读、幻读解释
    利用非阻塞的文件排他锁
    自定义实例化class
  • 原文地址:https://www.cnblogs.com/einstein-2014731/p/8398790.html
Copyright © 2011-2022 走看看