STM32的HardFault错误处理技巧

写程序肯定会有bug,比如访问无效内存,堆栈溢出。

在stm32中,这些bug都会被hardfault handler给捕获,那么如果我们能在这个 hardfault handler 的中间做一些操作,能够还原这个错误发生的现场啊,我们就可以很快的去定位这个问题的所在。

什么是 HardFault?

  • HardFault 是 Cortex-M 系列内核中的一种严重异常,它通常意味着程序出现了严重的运行时错误,CPU无法继续正常执行,只能进入 HardFault Handler进行处理。
  • 触发HardFault的原因很多,比如:
    • 访问无效内存;
    • 栈溢出;
    • 执行非法指令;
    • 未能处理的错误升级为HardFault;
    • ..........

hardfault是 cortex-m这个系列内核中间定义的一种严重的异常,它通常意味着程序出现了非常严重的运行错误,CPU已经无法正常的继续执行了,触发这个 hardfault 的原因非常多:比如说这个访问无效内存,还有这个栈溢出,或者是执行非法指令,或者是一些其他的未能处理的错误也可以升级为 hardfault,比如说用法错误或者是总线错误

在这个 hardfault 中间能做些什么?可以在这个 hardfault handler 中间,因为它就像一个中断一样,我们这个错误一发生就像一个跳转中断一样,我们就会跳转到这个 hardfault handler 中,然后我们就可以在这个 hardfault handler 中间呢,我们留下这个程序崩渍之前最后的一个现场,有了这个程序崩溃前最后的现场,他可以去非常精准的帮我们去定位这个bug

LR和PC是最重要的线索,它直接指向了这个程序崩溃前所运行的那个指令

这个hardfault handler 是如何保留这个错误现场的呢?

实际上就是 cortex m 内核的一个硬件上的机制,hardfault 发生的时候,这个硬件会自动的将一些寄存器推入栈,也就是说它是不需要你软件进行操作的

可以看到R0-R14等的寄存器的值都会被放到堆栈中,这样我们其实就可以在 hardfault handler 中去获取这个堆栈中间的内容,去还原这个最后的现场

实际代码

这里去做一个错误的操作,这里去取这个0x56785678这个地址的值,然后复制给 test ,那这个值肯定是访问不了的啊,那我去取这个地址的值,一定会引发这个 hardfault,然后我们在这个 hardfault 中间可以做一些处理

这几条汇编指令就是判断用的 MSP 还是用的 PSP,比如说我们运行这个裸机程序,一般就会只用到这个 MSP,也就是这个主堆栈。如果你运行这个 freeRTOS 这样的操作系统,那如果他是执行这个操作系统内核的代码的话,他就会使用这个 MSP,如果运行你这个用户线程的代码的话,它就会使用 PSP

首先我们要去找堆栈的数据,那么我现在就要知道当前用的是那个堆栈,实际上我就是用这几条指令去判断一下当前用的哪个堆栈,假设现在是判断成是使用的MSP 堆栈就会把这个 MSP赋值给这个R0,那这个 R0 里面的值呢相当于就是作为一个参数传递给这个hardfault_handler_c这个函数,因为R0 寄存器一般就是用来传参的,然后他相当于就是把这个参数传递成了函数的参数这个指针hardfault_args

然后我们可以把这个指针当成一个数组,取这个数组里面的数值,也就是相当于可以去从这个堆栈的栈顶,去把堆栈里面的一些数值给取出来,那实际上就是被这个硬件给推入栈的那些寄存器R0-R14,这些都是被硬件自动保存下来的,就可以通过一个 printf 打印出来

全速运行可以看到打印的这些值,可以看到PC寄存器的值,就是我们刚刚发生错误的那个指令的那个地址

相关推荐
xuxg200511 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT12 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen13 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠15 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
辰哥单片机设计18 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦19 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报19 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
czwxkn20 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响20 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
BackCatK Chen1 天前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制