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寄存器的值,就是我们刚刚发生错误的那个指令的那个地址

相关推荐
idcardwang21 分钟前
xl9555-IO拓展芯片
stm32·单片机·嵌入式硬件
Y1rong24 分钟前
STM32之EXTI
stm32·单片机·嵌入式硬件
兆龙电子单片机设计29 分钟前
【STM32项目开源】STM32单片机智能语音家居控制系统
stm32·单片机·嵌入式硬件·物联网·开源·自动化
意法半导体STM321 小时前
【官方原创】SAU对NSC分区的影响 LAT1578
stm32·单片机·嵌入式硬件·mcu·信息安全·trustzone·stm32开发
SmartRadio1 小时前
MK8000(UWB射频芯片)与DW1000的协议适配
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·dw1000
LDR0061 小时前
芯片电路的引脚标识代表什么?
stm32·单片机·嵌入式硬件
猪八戒1.03 小时前
中断(按键、SYSTICK、串口)
stm32·单片机·嵌入式硬件
chem41113 小时前
STM32 ISP下载
stm32·单片机·接口隔离原则
BreezeJuvenile3 小时前
ADC_案例练习:独立模式单通道转换
stm32·单片机·adc·hal·寄存器·单通道采集
zd8451015003 小时前
stm32f407 电机多轴联动算法
stm32·单片机·算法