当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/490533.html

相关文章:

  • Tekever-固定翼无人机系统:模块化垂直起降、远程海上无人机、战术 ISR 无人机
  • Kafka Queue: 如何严格控制消息数量
  • 大兴建设网站wordpress 托管主机
  • 国外html响应式网站网站开发高级证
  • 苍穹外卖--04--Redis 缓存菜品信息、购物车
  • 大淘客网站如何做seowordpress o2o主题
  • 机器学习催化剂设计专题学习
  • (六)机器学习之图卷积网络
  • 告别刀耕火种:用 Makefile 自动化 C 语言项目编译
  • 【安卓开发】【Android】做一个简单的钢琴模拟器
  • C#控制反转
  • 【Java 开发日记】什么是线程池?它的工作原理?
  • 黄页网站数据来源wordpress 最新漏洞
  • 如何评价3D高斯泼溅(3DGS)技术为数字孪生与实时渲染带来的突破性进展?
  • 技术解析:如何将NX(UG)模型高效转换为3DXML格式
  • 阿里云智能建站网络类黄页
  • SAP MIR7 模拟过账没有这个按钮
  • Redis 分布式锁实战:解决马拉松报名并发冲突与 Lua 原子性优化
  • 光刻胶化学基础:聚合物分子量分布对分辨率的影响与控制,以及国内技术突破
  • Lua C API 中的注册表介绍
  • 广州做网站哪家公司最好wordpress html调用php
  • 神经网络之计算图
  • Hatch 故障排除指南
  • 神经网络之计算图分支节点
  • 【表格对比分析】Java集合体系、Java并发编程、JVM核心知识、Golang go-zero微服务框架
  • 【任务管理软件】实用工具之ToDoList 9.0.6 详细图文安装教程:高效任务管理的完美起点
  • Linux中zonelist分配策略初始化
  • hadoop的三副本数据冗余策略
  • 岳阳网站建设企业足球比赛直播app下载
  • React 三元运算符页面切换:完整进出流程