keil MDK hardfault调试步骤

hardfault

Cortex-M3/4的Fault简介
(http://blog.csdn.net/wang_yf_/article/details/53436041 fault详解)、

方法1:调试步骤

###1,添加断点###
在进入hardfault后进入断点。

/** 
  * @brief  This function handles Hard Fault exception. 
  * @param  None 
  * @retval None 
  */  
void HardFault_Handler(void)  
{  
  /* Go to infinite loop when Hard Fault exception occurs */  
  if (CoreDebug->DHCSR & 1) {  //check C_DEBUGEN == 1 -> Debugger Connected  
      __breakpoint(0);  // halt program execution here         
  }  
  while (1)  
  {  
  }  
}  

###2,查看具体fault种类###
通过菜单栏Peripherals >Core Peripherals >Fault Reports打开fault reports
这里写图片描述
###3,查看使用的是哪个堆栈###
查看LR的值可以知道进入hardfault时候程序用的是哪个堆栈。(图片仅示意位置)
这里写图片描述
这里写图片描述
###4,根据堆栈查找PC的值###
根据上面步骤可以确定使用的堆栈,然后根据M3/4的入栈顺序可以知道:栈里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。在PC以前都是通用寄存器,所以通常查到的第一个地址就是PC的地址,也就是进入异常前要执行的命令。如果详细计算的话堆栈地址加上20也就是0x14就是PC的地址。要注意的是地址在寄存器中的顺序。例如下图:
1)堆栈地址:0x200122F8+0x14=0x2001230c
2)PC的值:9d 19 00 08 转换成地址:0x0800199d
这里写图片描述
###5,根据PC的值查找语句命令###
在反汇编窗口中点击右键,选中show disassembly at address 在窗口中输入PC地址即可定位产生异常的命令。
这里写图片描述

这里写图片描述

方法2:调试步骤

再仿真状态下,调出Call Stack Window,观察进入断点前,堆栈保存了哪些参数,可以清楚的看出来。
这里写图片描述
Call Stack 窗口可以显示出当前堆栈和函数局域变量值。当进入断点时,通过这个窗口就可以看出来进入异常时函数所保存的变量,并且还可以查询调用这个变量的语句。非常好用。!!!!

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值