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

相关推荐
d111111111d1 天前
STM32外设学习--TIM定时器--输入捕获---测频方法。
stm32·单片机·学习
光子物联单片机1 天前
C语言基础开发入门系列(八)C语言指针的理解与实战
c语言·开发语言·stm32·单片机·mcu
BreezeJuvenile2 天前
外设模块学习(8)——HC-SR04超声波模块(STM32)
stm32·单片机·嵌入式硬件·学习·超声波测距模块·hc-sr04
安庆平.Я2 天前
STM32——定时器
stm32·单片机·嵌入式硬件·定时器
NEU-UUN2 天前
1.2.STM32简介——全程手敲板书
stm32·单片机·嵌入式硬件
应用市场2 天前
基于STM32的多模态智能门锁系统设计与实现
stm32·单片机·嵌入式硬件
xiaohai@Linux2 天前
STM32在LVGL上实现移植FatFs文件系统(保姆级详细教程)
stm32·单片机·嵌入式硬件·lvgl·fatfs
Jerry丶Li2 天前
二十二、STM32的ADC(二)(ADC单通道)
stm32·单片机·嵌入式硬件
星辰pid2 天前
STM32基于OLED的多级菜单(控制步进/无刷电机/舵机,含FLASH存储数据掉电不丢失)
stm32·单片机·嵌入式硬件
逆小舟2 天前
【STM32】中断
stm32·单片机·嵌入式硬件