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

相关推荐
DIY机器人工房6 小时前
简单理解:什么是EMC 整改?
stm32·单片机·嵌入式硬件·面试题·emc·diy机器人工房
偶像你挑的噻16 小时前
11-Linux驱动开发-I2C子系统–mpu6050简单数据透传驱动
linux·驱动开发·stm32·嵌入式硬件
强化学习与机器人控制仿真18 小时前
RSL-RL:开源人形机器人强化学习控制研究库
开发语言·人工智能·stm32·神经网络·机器人·强化学习·模仿学习
bai54593618 小时前
STM32 PWM驱动LED呼吸灯
stm32·单片机·嵌入式硬件
btzhy1 天前
STM32单片机:基本定时器应用:单脉冲模式(STM32L4xx)
stm32·单片机·嵌入式硬件·基本定时器应用:单脉冲模式
文sir.1 天前
温湿度采集系统(stm32+mqtt+Onenet云平台+esp8266)
stm32·单片机·嵌入式硬件·mqtt·onenet·云平台·esp8266
DIY机器人工房1 天前
嵌入式面试题:你有没有用过直接基于TCP协议,不借助HTTP、MQTT这类上层协议的项目经历?
stm32·单片机·嵌入式硬件·面试题·diy机器人工房
编程小白菜1231 天前
STM32L051单片机485Ymode升级后程序不能正常运行问题
stm32·嵌入式硬件
NEU-UUN1 天前
5.1.STM32-EXTI外部中断——全程手敲板书
stm32·单片机·嵌入式硬件
qq_401700412 天前
RS485基本原理,电路、防雷、layout及设计要点
stm32·单片机