keil MDK hardfault调试步骤

来源:互联网 发布:可以买数据的公司 编辑:程序博客网 时间:2024/06/07 11:13

hardfault

Cortex-M3/4的Fault简介
(http://blog.csdn.net/wang_yf_/article/details/53436041%20fault%E8%AF%A6%E8%A7%A3)、

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

这里写图片描述

原创粉丝点击