单片机Hard fault 产生原因和错误跟踪的方法

news2024/11/19 7:41:27

一、单片机 Hard fault产生的原因

Hard fault产生的原因有两方面,硬件方面和软件方面。

①硬件方面常见原因: 

电源设计有错误,造成器件供电不稳; 

电源质量不好,纹波,噪声过大; 

器件接地不良; 

对于带有 Vcap 引脚的器件,管脚处理不当; 

电路中有强干扰源,对器件造成干扰; 

②软件方面常见原因: 

使用了空指针; 

对地址偏移量的计算有误; 

数组越界导致程序出错; 

动态内存使用不当,导致访问了已释放的内存地址; 

通过地址访问了已失效的局部变量; 

一般因为硬件造成 Hard Fault 错误的可能性较低,大多数都是软件原因造成的。所以遇到硬件中断错误,基本就是通过软件来排查。

二、CmBacktrace软件包

CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:

①支持的错误包括:断言(assert) 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)

②故障原因自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;

③输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;

④支持裸机及以下操作系统平台:RT-Thread UCOS FreeRTOS(需修改源码)

⑤根据错误现场状态,输出对应的 线程栈 或 C 主栈;

⑥故障诊断信息支持多国语言(目前:简体中文、英文);

⑦适配 Cortex-M0/M3/M4/M7 MCU;

⑧支持 IAR、KEIL、GCC 编译器; 

如何移植 

准备工作 

①查看 \demos 目录下有没有合适自己的 Demo ,如有类似,则建议在其基础上修改 ;

②明确操作系统/裸机平台及 CPU 平台 ;

③将 \src 下的全部源文件添加至产品工程中,并保证源码目录被添加至头文件路径 ;

④cmb_fault.s 汇编文件(点击查看)可以选择性添加至工程,添加后需要把项目原有的 HardFault_Handler 注释掉 

⑤把 cm_backtrace_init 函数放在项目初始化地方执行 

⑥将 cm_backtrace_assert 放在项目的断言函数中执行,具体使用方法参照下面的 API 说明 

⑦如果第 4 步骤没有将 cmb_fault.s 汇编文件启用,则需要将 cm_backtrace_fault 放到故障处理函数(例如:HardFault_Handler )中执行,具体使用方法参照下面的 API 说明 配置说明 配置文件名:cmb_cfg.h ,针对不同的平台和场景,用户需要自自行手动配置,常用配置如下:

add48978c5fd86cfac53d19ec4b74ec6.png

注意:以上部分配置的内容可以在 cmb_def.h 中选择,更多灵活的配置请阅读源码。

三、addr2line工具

addr2line (它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。

如何获得 addr2line,Linux 系统一般会集成这个工具,本文重点介绍 Windows 系统下如何获取该工具。方法很多,我这里仅介绍两种方式。

第一种:安装 MinGW(网上教程很多,自行搜索),安装后在其安装目录的 bin 文件夹里会包含 addr2line.exe ,此时只用保证环境变量 path 中包含该路径即可;

第二种(XP 平台除外):在本项目的 tools 文件夹中已存放 addr2line.exe ,可以将其直接拷贝至 C:\Windows 下,或者将 CmBacktrace 仓库的 tools 文件夹路径添加至到环境变量 path 中,这样都能保证命令行工具能正常使用 addr2line 命令。

四、实际测试

基于rt-thread的bsp工程测试。使用env工具添加软件包,如下图

66843bb2ed28dc314a6f87caa6f89f7a.png

重新生成工程,看到软件包已经添加。

ca3aa0a3b46f1c616b53dba867543472.png

使用方法,系统自动初始化了函数int rt_cm_backtrace_init(void),也可以不使用自动初始化函数改为手动调用初始化。

直接编译,无错误,下载到测试板进行测试,测试指令

cmb_test DIVBYZERO
[2023-06-20 09:41:46.648]
TX:cmb_test DIVBYZERO


[2023-06-20 09:41:47.852]
RX:cmb_test DIVBYZERO
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
tshell    20  running 0x00000098 0x00001000    04%   0x00000007 000
tidle0    31  ready   0x00000048 0x00000400    10%   0x00000009 000
main      10  suspend 0x00000084 0x00000800    12%   0x00000013 000
 Firmware name: rtthread, hardware version: 1.0, software version: 1.0 Fault on thread tshell ===== Thread stack information =====   addr: 20002bf0    data: 00000000   addr: 20002bf4    data: 00000008   addr: 20002bf8    data: 20001b6a   addr: 20002bfc    data: 08002f41   addr: 20002c00    data: 00000000   addr: 20002c04    data: 20001b6a   addr: 20002c08    data: 20001b73   addr: 20002c0c    data: 00000000   addr: 20002c10    data: 00000000   addr: 20002c14    data: 00000000   addr: 20002c18    data: 00000000   addr: 20002c1c    data: 00000000   addr: 20002c20    data: 00000000   addr: 20002c24    data: 00000000   addr: 20002c28    data: 00000000   addr: 20002c2c    data: 20001b6a   addr: 20002c30    data: 00000012   addr: 20002c34    data: deadbeef   addr: 20002c38    data: deadbeef   addr: 20002c3c    data: deadbeef   addr: 20002c40    data: deadbeef   addr: 20002c44    data: 08006437   addr: 20002c48    data: 00000000   addr: 20002c4c    data: 0000000d   addr: 20002c50    data: 200005c0   addr: 20002c54    data: 08004ba5   addr: 20002c58    data: 23232323 ==================================== =================== Registers information ====================   R0 : 00000000  R1 : 08003fe8  R2 : 08003fe8  R3 : 80808000   R12: 01010101  LR : 08003f37  PC : 08003f36  PSR: 61000000 ============================================================== Usage fault is caused by Indicates a divide by zero has taken place (can be set only if DIV_0_TRP is set) Show more call stack info by run: addr2line -e rtthread.axf -a -f 08003f36 08003f36 08002f40 08006436 08004ba4

测试结果,如上。

使用powershell输入指令,将目录切换到工程输出的可执行文件下。

ffe03696a6ba7547f86bd3ccff54f297.png

再执行addr2line指令

addr2line -e rt-thread.axf -a -f 08003f36 08003f36 08002f40 08006436 08004ba4

87d54c338182b6d9e1085c08912cbb94.png

根据提示可查看相应的代码即可。

欢迎关注个人公众号:嵌入式学习与实践

参考:

https://www.gd32mcu.com/data/documents/userManual/AN028_CN_Rev1.0.pdf


https://www.gd32mcu.com/data/documents/userManual/AN020_CN_Rev1.0.pdf


https://gitee.com/RT-Thread-Mirror/CmBacktrace


https://www.bilibili.com/video/BV1LB4y1Q78a/?vd_source=f58225e38b5a8bc42ab3351918ec20e5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货分享|HOOPS Web平台和Polygonica进行增材制造的云CAM服务示例

这篇文章提供了一个示例项目,展示了使用 Machineworks Polygonica 和 HOOPS Web 平台进行增材制造的云 CAM 服务。该项目作为一个示例,说明了如何在服务器端使用 Polygonica 与 HOOPS Communicator 和 Exchange 来开发云服务。 它涵盖了增材制造 CAM 的…

Android问题笔记-Android Studio编译报错:2 files found with path.....

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

看物联网技术ZETA如何帮助场馆实现数智化管理升级?

背景介绍: 江宁足球训练基地位于南京江宁区上坊镇境内,是江苏省女足及青少年足球发展基地。该基地总占地面积为333300平方米,其中房屋建筑面积有19000平方米,健身房350平方米,拥有9个标准足球场,曾承办多场甲级足球赛…

Java多线程与并发

1、JDK版本的选择 选择JDK8、JDK11进行讲解的原因:Oracle长期支持 2、进程和线程的区别 进程和线程的由来 3、进程与线程的区别 进程是资源分配的最小单位,线程是cpu调度的最小单位. 所有与进程相关的资源,都被记录在PCB(进程控制块)中。进程是抢占…

day08 教你用英语过海关

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家 😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人,一起加油进…

基于深度学习FasterRCNN模型Restnet50 的生活垃圾智能分类(准确率达84%)-含python工程全源码

目录 前言总体设计系统整体结构图系统流程图 运行环境1. 硬件环境2. Python 环境 模块实现1. 数据预处理2. 数据加载3. 模型构建4. 模型训练及保存5. 模型加载与调用 系统测试1. 模型准确率2. 分类别准确率 工程源代码下载其它资料下载 前言 本项目基于Faster R-CNN模型&#…

mmrotate框架基本使用

1、如何将类交给mmrotate框架容器管理 容器:框架中现有基本容器包括DATASETS, BACKBONES, LOSSES, DETECTORS。初始化容器:Registry(‘backbone’)中’backbone’为容器初始化配置文件。#/mmdet/models/builder.py 部分代码 from mmcv.utils import Re…

【Lisp】【Python】在CAD中用插件获取选中字块的文字,在rhino中批量生成图层

文章目录 1 get_selected_text.lsp1.1 使用方法LISP代码解析1.2 动图 2 Rhino中使用PythonScript批量建立图层.py2.1 直接生成2.2 带颜色生成 2.3 动图展示 1 get_selected_text.lsp 1.1 使用方法 用记事本复制以下代码,改文件名为get_selected_text.lsp (defun c:…

springboot高校宿舍报修管理系统-计算机毕设 附源码83946

springboot高校宿舍报修管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实…

【AI绘图 丨 Stable_diffusion 系列教程四】— Window 环境 | Stable Diffusion入门教程 及安装(全篇)

👉腾小云导读 最近,AI图像生成引人注目,它能够根据文字描述生成精美图像,这极大地改变了人们的图像创作方式。Stable Diffusion作为一款高性能模型,它生成的图像质量更高、运行速度更快、消耗的资源以及内存占用更小&a…

MATLAB+JAVA的混合开发

近期项目中需要使用matlab跟java做混合开发。主要记录一下,此次开发遇到的问题点。 环境:使用的matlab版本是 R2018b。 当前状况:MATLAB代码已经编写好,且运行成功。需要打成jar包才可以被java调用。 步骤一: 按照…

OpenJdk 和 oracleJdk

OpenJDK的网站(https://jdk.java.net/)通常仅显示最新的几个版本,对于更早的版本,可能不再在主页面上列出。这是因为随着时间的推移,Java社区通常会专注于支持和维护最新的版本,并鼓励开发者尽可能地使用最…

开源软件介绍——国内和国际主要开源社区

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来看一看国内和国际上有哪些主要开源社区。 开源社区的定义 开源社区又称为开放源代码社区,一般由拥有共同兴趣爱好的人组成。根据相应的开源软件许可证协议公布软件源代码的网络平台&a…

【深度学习】5-2 与学习相关的技巧 - 权重的初始值

在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。本节将介绍权重初始值的推荐值,并通过实验确认神经网络的学习是否会快速进行。 可以将权重初始值设为0吗 后面我们…

搜索引擎的个性化搜索:为何搜索结果因人而异

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言搜索引擎的工作原理…

uniapp uView2 字体加载错误提示处理(字体离线方案)

最近老是收到有人反馈 uView2的字体图标报错,具体错误提示如下图 这个报错的原因有2种情况 at.licdn.com 网站维护,无法加载;国内这些小程序平台的开发工具日常抽风,代码能跑,但就是报错,简直离谱&#x…

漏洞复现 D-Link DCS 密码泄露漏洞

0x01 漏洞描述 D-link DCS是一款网络摄像机,工作温度为0-50℃。D-link DCS系统存在密码泄露漏洞,攻击者通过漏洞可以获取后台权限。 0x02 漏洞复现 fofa:app“D_Link-DCS-4622” 1.使用poc进行账号密码查看,得到密码登录即可 …

网络安全是什么?怎么学

网络安全基础 安全的定义: 1)一种能够识别和消除不安全因素的能力; 2)安全是一个持续的过程网络安全是一门涉及计算机科学、网络技术、通信技术、密码技术、信息安全技术、应用数学、数论、信息论等多种学科的综合性科学。 网络…

Redis原理 - 数据结构的底层实现

原文首更地址,阅读效果更佳! Redis原理 - 数据结构的底层实现 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-datastruct-underlying-implementation.html 动态字符串SDS #基本概念 Redis 中保存的 Key 是字符串,V…

C国演义 [第六章]

第六章 最长递增子序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长连续递增序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长递增子序列 力扣链接 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&am…