stm32 HardFault_Handler调试及问题查找方法

原文地址:http://www.51hei.com/bbs/dpj-39846-1.html


STM32出现HardFault_Handler故障的原因

  主要有两个方面:
  1. 内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。
  2. 堆栈溢出。增加堆栈的大小。

STM32出现HardFault_Handler故障的排查方法:

方法一

  发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。
  
  注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)

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

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

再说明2点:

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

Refrences

  [1] Application Note209. Using Cortex-M3 and Cortex-M4 FaultExceptions.
  [2] Cortex-M3权威指南

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年10月8日
下一篇 2017年10月8日

相关推荐