分享

keil MDK hardfault调试步骤

 华灯初放l 2018-07-19

方法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地址即可定位产生异常的命令。
这里写图片描述

这里写图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多