0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机Fault遇到故障了应该怎么办

Q4MP_gh_c472c21 来源:strongerHuang 作者:strongerHuang 2021-11-08 16:59 次阅读

我们平时的项目,可能会遇到死机的情况,通过在线调试,或者打印消息,可能会发现,怎么进入了 HardFault_Handler 中断呢?

这种“硬故障”是我们常见的一种故障,导致硬故障的原因也有很多。本文针对 Cortex-M3 说说Fault故障相关的内容。

Fault故障种类

Fault故障的种类有很多,拿本文Cortex-M3来说,主要有:

HardFault:硬故障

MemManage:存储器管理故障

BusFault:总线故障

UsageFault:用法故障

7f9cb336-3f77-11ec-9195-dac502259ad0.png

比如,在stm32f10x_it.c源代码中,有这样的中断入口:

void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */ while (1) { }} void MemManage_Handler(void){ /* Go to infinite loop when Memory Manage exception occurs */ while (1) { }} void BusFault_Handler(void){ /* Go to infinite loop when Bus Fault exception occurs */ while (1) { }} void UsageFault_Handler(void){ /* Go to infinite loop when Usage Fault exception occurs */ while (1) { }}

Fault故障描述

每一种Fault故障的产生,都肯定是有一定原因的,如果你代码产生了Fault故障中断,说明代码某些地方引起了Fault故障。

1、HardFault:硬故障

通过截图的描述,你会发现硬故障是一种“不可编程”的故障,因为存储器管理故障、总线故障、用法故障如果不能得到执行,就为上访为硬故障。

7f9cb336-3f77-11ec-9195-dac502259ad0.png

比如:比如在取向量时产生的总线故障也按会硬故障进行处理。所以,你会发现出现故障,很多时候都是硬故障。

硬故障状态寄存器描述:

804ec274-3f77-11ec-9195-dac502259ad0.png

通过状态寄存器,你会发现产生硬故障的原因有以上几种。 2、MemManage:存储器管理故障 存储器管理故障通常与MPU(内存保护单元)有关,之前给大家分享过MPU相关的文章《什么是Cortex-M内核的MPU?》。 通常就是我们说的“内存越界”就会导致存储器管理故障,细说引起该故障的诱因有:

访问了 MPU 设置区域覆盖范围之外的地址

往只读 region 写数据

用户级下访问了只允许在特权级下访问的地址

存储器管理故障状态寄存器:

8084ce00-3f77-11ec-9195-dac502259ad0.png

通过状态寄存器,你会发现引起该故障的一些原因。 3、BusFault:总线故障 总线故障,顾名思义就是对“总线”操作出现问题,导致的故障。 比如:当 AHB 接口上正在传送数据时,如果回复了一个错误信号(error response),则会产生总线故障。 产生总线故障的场合:

取指,通常被称作“预取流产”

数据读/写,通常被称作“数据流产”

触发总线故障的动作:

中断处理起始阶段的堆栈 PUSH 动作。称为“入栈错误”

中断处理收尾阶段的堆栈 POP 动作。称为“出栈错误”

80c00c04-3f77-11ec-9195-dac502259ad0.png

同样,通过总线故障状态寄存器了解产生的原因:

8104de60-3f77-11ec-9195-dac502259ad0.png

4、UsageFault:用法故障 用法故障相对不常见,出现该故障通常是进行了“未对齐访问操作”,其他导致该故障问题很少见。 比如:执行了未定义的指令、除数为0(编译器都会避免)、无效的中断返回等这些情况比较少见。 用法故障状态寄存器:

8190f256-3f77-11ec-9195-dac502259ad0.png

如何应对故障

不知道大家平时有没有对这些进行有效避免?这里简单说几点应对故障的措施:

1、通过故障状态寄存器的值来判定程序错误

在故障中断函数中,读取故障的状态(上面描述了状态寄存器),比如硬故障:

void HardFault_Handler(void){//读取状态寄存器,打印状态寄存器,判断什么原因引起故障printf("状态x信息"); while (1) { }}

如果不想系统处于死机状态,可以在中断里面做软复位。

2、提前对代码进行分析、预判

比如:通过代码静态分析工具,对代码进行分析、查找bug。前不久才分享过一篇文章:推荐几个代码静态分析工具

3、其他诊断方法

之前给大家分享过一篇文章《针对Cortex-M调试诊断 HardFault 的错误追踪库》可以有效诊断本文说的这种“硬故障”。 先写到这里,还有更多更好的方法,欢迎大家留言补充。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6037

    文章

    44557

    浏览量

    635171
  • CAN总线
    +关注

    关注

    145

    文章

    1951

    浏览量

    130752

原文标题:超实用!单片机Fault故障常见应对办法

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机出现故障怎么维修

    单片机出现故障时,维修过程需要系统地检查和诊断,以确定故障的根本原因,并采取相应的修复措施。以下是一个详细的单片机维修指南,旨在帮助威廉希尔官方网站 人员或爱好者有效地解决
    的头像 发表于 10-17 17:57 1040次阅读

    我用的是multisim14.0,因为是初学者,仿真电路的时候找不到合适的模型,应该怎么办

    我用的是multisim14.0,因为是初学者,仿真电路的时候找不到合适的模型,应该怎么办? 比如我电路用的是AO3400的NMOS,但是在multisim14.0软件自带的元件库里面没找到类似的,开启电压是1.5v的nmos,请教大家,
    发表于 08-23 10:59

    大电流一体成型电感有噪音怎么办

    电子发烧友网站提供《大电流一体成型电感有噪音怎么办.docx》资料免费下载
    发表于 07-30 12:30 0次下载

    如何入门嵌入式?怎么才算是掌握单片机

    大一应该学习最重要的 C 语言,51 单片机,大二学 51 单片机也可以,高数也应该好好学下,考研或者以后的工作中会有用的。
    的头像 发表于 04-28 14:45 651次阅读

    stm8系列单片机在IAR环境下怎样配置G口?

    stm8系列单片机,在IAR环境下,怎样配置G口? 例如:不小心把外断的红外接收或按键的引脚接到G口,比如STM8S105或207(48脚封装的),P35、P36脚(PG0、PG1),但IAR的环境里没有G口的设置,怎么办
    发表于 04-23 07:02

    工控主板发生故障怎么办

    工控主板发生故障怎么办?前几天有个客户问了我这个问题,大部分情况下出现的故障并不可怕,主要是用户粗心大意造成的。那今天小编就来讲解一下工控主板一般会出现故障的主要原因及判断方法:
    的头像 发表于 04-11 18:19 879次阅读

    电容负极熔断怎么办

    在现代科技发展的时代,电容器在各个领域都扮演着重要的角色。然而,由于各种原因,电容器的负极可能会发生熔断的情况。那么,当电容器的负极熔断时,我们应该怎么办呢?
    的头像 发表于 04-10 14:15 521次阅读
    电容负极熔断<b class='flag-5'>怎么办</b>

    单片机RAM不够用怎么解决?

    来自一位用户的咨询,麻烦帮忙解答。越详细越好,有图有真相。如有相关的视频、文档也可以辅助说明,谢谢。 单片机RAM不够用怎么办单片机都有RAM,如果我们一下子定义一大堆的变量,使
    发表于 02-02 07:35

    linux用gdb调试遇到函数调用怎么办

    linux用gdb调试遇到函数调用怎么办? 在Linux上使用GDB调试时,遇到函数调用是一个常见的情况。函数调用可能涉及到多个函数、多个文件,这就需要我们仔细审查代码,理解函数之间的关系和参数传递
    的头像 发表于 01-31 10:33 716次阅读

    怎么办?晶振没有信号输出

    怎么办?晶振没有信号输出  晶振作为电子设备中常见的元器件之一,在电子系统中起到时钟信号供应的重要作用。然而,有时我们可能会遇到晶振没有信号输出的问题,这会严重影响设备的正常运行。本文将针对这一
    的头像 发表于 01-25 13:51 1059次阅读

    修复辊压机轴承位磨损怎么办

    电子发烧友网站提供《修复辊压机轴承位磨损怎么办.docx》资料免费下载
    发表于 01-23 09:52 0次下载

    wifi无互联网连接怎么办?解决wifi无法访问互联网怎么办的方法

    wifi无互联网连接怎么办?解决wifi无法访问互联网怎么办的方法  在现代社会中,WiFi已经成为了我们生活中必不可少的一部分。然而,有时我们可能会遇到WiFi无法访问互联网的问题,这给我们的学习
    的头像 发表于 01-17 11:17 3.4w次阅读

    变频器输出的直流24V电源输出了故障怎么办

    变频器输出的直流24V电源输出了故障怎么办? 变频器是工业生产中常用的电器设备,它通过改变电力的频率,控制电机的转速和运行。然而,变频器输出的直流24V电源故障可能会给生产过程带来严重的影响。在
    的头像 发表于 01-15 16:15 3509次阅读

    ADuC824正弦波转方波时频带要比较宽时怎么办

    正弦波转方波时频带要比较宽时怎么办呢!我用lm393做了一个过零比较器给单片机(aduc824)识别(频率计)但是在低频时监测不到。在小于200hz的时候不可以,到300khz又不行了。不知道是在
    发表于 01-15 06:42

    风机轴磨损怎么办

    电子发烧友网站提供《风机轴磨损怎么办.docx》资料免费下载
    发表于 01-07 11:04 0次下载