MCU HardFault_Handler调试方法

一.获取内核寄存器的值

1.在MDK的DEBUG模式下,当程序出现跑飞后,确定卡死在HardFault_Handler中断处

  1. 通过Register窗口读取LR寄存器的值来确定当前系统使用堆栈是MSP还是PSP
LR寄存器值 堆栈寄存器
0xFFFFFFF9 MSP寄存器
0xFFFFFFFD PSP寄存器

如下图所示,当前程序使用的是PSP堆栈寄存器

二、查看堆栈寄存器保存的值

  1. 通过Register窗口确定MSP或PSP的地址
    如下图所示,当前程序卡死时使用的堆栈寄存器为:PSP寄存器,地址为:0x20010318
  2. MSP、PSP堆栈寄存器介绍
    由于异常发生时,内核将r0、r1、r2、r3、r12、r14(lr)、pc、xprs寄存器依次入栈
    r14(lr):保存的是产生异常中断前内核执行的指令地址
    r15(pc):保存的内核正在执行的指令地址

    3 查看堆栈寄存器的保存值
    将上面PSP寄存器的地址(0x20010318)输入到MDK的Memory窗口中得到的数据如下,第六个数为lr寄存器的保存值

三、定位lr寄存器地址的函数名

  1. 在工程编译后的map文件中,根据lr的地址确定运行函数,如下图所示在产生异常中断前,最后执行的地址为0x0801D727在函 prvAddCurrentTaskToDelayedList中,
  2. 分析产生异常中断的原因

四、获取lr寄存器保持地址的方法

  1. 通过MDK在线调试如上面介绍的流程
  2. 通过jlink工具使用命令行也可以完成上述过程的定位
    JLink Commander调试方法
相关推荐
LCG米8 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga12 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡15 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
硅基手札17 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学19 小时前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_20 小时前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY0920021 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式1 天前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎1 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王2 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件