大家在用STM32的时候有没有遇到过HardFault的问题呢:

下面针对这个问题做个小总结。

现象还原:在debug模式下进行仿真调试,全速运行再停止运行,程序会跑到 HardFault_Handler函数中,产生 HardFault,即硬错。其产生的原因大概有如下几类:

(1)数组越界操作;

(2)内存溢出,访问越界;

(3)堆栈溢出,程序跑飞;

(4)中断处理错误;

针对HardFault问题的定位,网上有几种方法,大概都是围绕着:在debug模式下,查看一些地址,分析寄存器、函数调用栈等,这是很让人头疼的事情。这里分享一种简单的、直观的HardFault错误定位的方法,使用开源库:CmBacktrace 。这个库之前已经有介绍过了,这篇笔记我们来实践一下。

CmBacktrace简介

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

  • 支持的错误包括:断言(assert)故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
  • 故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
  • 适配 Cortex-M0/M3/M4/M7 MCU;
  • 支持 IAR、KEIL、GCC 编译器;

移植及使用(keil)

CmBacktrace 源码地址:

https://github.com/armink/CmBacktrace

把cm_backtrace文件夹复制到我们的工程目录下,并添加至keil工程中,并添加头文件、勾选C99模式:

此时,编译会产生几个错误:

那是因为有些预处理宏没有找到,打开、修改cmb_cfg.h文件的内容。cmb_cfg.h文件默认内容为:

我们修改后的cmb_cfg.h内容变为:

这时候编译还会有一个错误,cmb_fault.c与stm32f10x_it.c中的HardFault_Handler函数重定义:

需要把stm32f10x_it.c中的HardFault_Handler函数屏蔽掉:

这时候就可以编译通过了。下面我们来看看这个库的效果。

测试函数:

然后在主函数中调用测试函数:

下载运行程序:

可以看到,列出的信息很详细,包括出错原因。按照它的提示,我们运行命令:

addr2line -e stm32f10x_demo.axf -a -f 0800162a 080016b7 08001719

运行这个命令需要用到addr2line.exe工具,这个工具在CmBacktrace源码目录下的tools文件夹中:

有32bit和64bit两个版本,根据我们的环境选择,并拷贝到我们的keil工程目录下可执行文件.axf所在的文件夹中:

在这个文件中进入到cmd窗口,方法:按下Shift键的同时点击鼠标右键:

运行上面那条命令:

可以看到addr2line.exe工具给我们定位出了错误相关的代码行号,我们看看对应行的代码是什么:

可见,对应的行号正是出错的地方。

可以看到,使用这个CmBacktrace 库能帮助我们有效、快速地定位到HardFault之类的错误。addr2line命令后面跟着几个地址就是错误相关的地址,这几个地址可以牵扯的内容很深,如果我们不使用CmBacktrace 库,我们可能就得自己去分析这些偏底层的内容了,相关知识可阅读:《Cortex-M3/M4权威指南》。

以上就是本次的笔记分享,如有错误欢迎指出!谢谢

cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享相关推荐

  1. cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用经验分享

    大家在用STM32的时候有没有遇到过HardFault的问题呢: 下面针对这个问题做个小总结. 现象还原:在debug模式下进行仿真调试,全速运行再停止运行,程序会跑到 HardFault_Handl ...

  2. cfree运行程序错误的原因_Python入门教程 | 第 8 章 错误、调试和测试

    第八章 错误.调试和测试 在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误 ...

  3. cfree运行程序错误_C/C++程序调试和内存检测

    程序出现错误很正常,一个优秀的程序员必须学会调试,发现错误并改正.减少程序错误最有效的方法是:在敲代码之前,多花点时间思考,如何构造程序,数据结构和算法,尽量把细节提前写下来,可以尝试着在纸上写出核心 ...

  4. cfree运行程序错误_Java 错误和异常汇总

    在Java中,根据错误性质将运行错误分为两大类:错误和异常. Java中的所有异常都是由Throwable类的子类生成的对象,所有的异常类都是Throwable类的子类或子类的子类.Throwable ...

  5. java.exe应用程序出错_EXPLORER.EXE应用程序错误的原因和解决办法

    在使用电脑到时候经常会碰到EXPLORER.EXE应用程序错误,很多人找不到具体原因就乱杀毒和重装系统,这样既浪费时间又麻烦,有时还不一定能解决问题,下面我爱电脑网小编收集导致EXPLORER.EXE ...

  6. 如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M7系列MCU进行SWD接口调试

    该篇幅介绍如何使用FT2232H适配器和开源调式工具OpenOCD对ARM Cortex M系列MCU进行SWD接口调试? 如何连接FT2232HL Debuger Adapter和目标板的的SWD调 ...

  7. cfree下面显示运行程序错误_Matlab系列之程序调试

    学完了程序优化,再来个程序调试,关于MATLAB的编程基础我觉得也就差不多可以了,之后应该就是对数组.矩阵进行更加具体的操作,对数学函数进一步的了解等等,之后可以算是对MATLAB的进阶了吧,突然有点 ...

  8. 使用JDK自带的工具jstack找出造成运行程序死锁的原因

    Java多线程编程也是Java面试中经常考察的内容.刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来.如何分析造成Java多线程的原因呢?很多时候我们在怀疑 ...

  9. c-free5.0运行程序错误_web前端之异常/错误监控

    为什么要异常/错误监控 我们都知道有程序难免就会有异常/错误,当我们代码越来越多的时候异常/错误出现的几率也就会多,虽然我们会有测试,但是测试用例并不能覆盖所有可能,所以程序在生产上运行的时候进行异常 ...

最新文章

  1. android studio配置系列 - 收藏集 - 掘金
  2. 2021-08-04 jpg和png批量转化8位到24位,相互转化!
  3. 边缘计算 — 与 5G
  4. linux操作命令等积累
  5. 如何学习HTML语言
  6. Win8Metro(C#)数字图像处理--2.31灰度拉伸算法
  7. UVa-10382 Watering Grass **
  8. sweetalert插件的使用
  9. tomcat使用方法大全
  10. 力扣-面试题 02.06. 回文链表
  11. Asp.Net分页生成页码超链接方法
  12. java模拟洗衣机程序,JAVA洗衣机仿真程序实验报告及代码
  13. 疫情地图 | 低代码制作全国重点管控地区行政区地图(截至4月16日)
  14. trie树模板(前缀树)
  15. Java笔记(韩顺平Java基础7-8章)
  16. C语言指针 *p++和*++p及++*p的区别
  17. 数据科学系列:plotly可视化入门介绍
  18. Unity 物体(Rigibody组件)碰撞穿透、碰撞抖动
  19. 测评5款电脑上可以用的epub阅读器
  20. app上架被拒的各种原因

热门文章

  1. 使用分发服务器的作用
  2. python之SQLAlchemy ORM
  3. 数据库修复Part1:创建自己的测试corrupt数据库
  4. java异常处理图片_Java处理图片时出现异常
  5. HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
  6. Windows 安装redis
  7. 5.2 感知机和多层网络
  8. Apache Common常用jar包
  9. 使用pyinstaller打包django3.2
  10. linux centos7不能ssh免密登录自己的问题解决