HardFault_Handler异常(死机)的处理

2023-05-16

在系统开发的时候,出现了HardFault_Handler硬件异常,也就是死机,尤其是对于调用了os的一系统,程序量大,检测堆栈溢出,以及数组溢出等,找了半天发现什么都没有的情况下,估计想死的心都有了。如果有些程序开始的时候一切没有问题,但是运行几个小时候,会发现死机了,搞个几天下来估计蛋都碎了一地吧。。。

一般来说运行操作系统  是以下几个问题

1.开始的时候给ucos分配的堆栈太小了,随着项目做多了,这类问题一般很容易解决

#define TASK_IO_SIZE  300

#define TASK_IO_PRIO 6

OS_STK  TASK_IO_STK[TASK_IO_SIZE];

比如修改300到 1000,做开发的时候 如果ram允许,尽量大些,免的麻烦

2.数组溢出

这类问题一般在通信中,接受数据的时候,特别是长度不定的时候

比如协议为    :开始 功能码 长度 数据1  数据2 。。结束

长度决定了后面的数据多少,在分配接受缓冲的时候  ,突然来了个错误的长度比如255

但是我们分配buffer[100],只定义了100,这样数组就溢出了 

所有在放数据之前要对长度进行判断是否合理,以后 如果有长度 或者索引就要想到溢出。。

3.使用了非法的指针 ,比如空指针 ,编译对的 但是运行就错了

u8 *p = null;

*p = 1;        把0地址的数据强制设置为1,  不错才怪

4.使用 OS_ENTER_CRITICAL();

使用了 OS_ENTER_CRITICAL(); 却忘了OS_EXIT_CRITICAL(); 退出临界区

特别是在这个函数OS_ENTER_CRITICAL();  调用了子函数 也有的这类情况,很容易忘记关闭的这样就造成了“死机现象”

因此如果调用的话  建议在函数中加入OS_CPU_SR  cpu_sr = 0u;局部变量 在管理临界区  os的内核程序也是这么用的 ,而且要注意,临界区一般用于全局变量的写操作,时间要非常快的,任务中的变量可以不用添加 。

常见的就上面几种了,说说硬件异常了 怎么来发现,这个才是主要的

举个例子:

a.仿真,运行程序的时候点红色X进入异常


 

b.调出堆栈窗口,也就是黑匣子


 

c.查找问题

d.找出出错的函数


e.解决问题

f  一些思考

很久之前在研究stm32 库源码的时候  发现基本上  每个函数进入之前都做了参数的检测,当初还觉得检查不检查貌似没什么大的作用,自己使用的时候注意就好了,现在是不是改变看法了吗?编程的时候很多问题,在参数检查的时候被过滤掉了,这样在开发大型项目的时候,可以给您免去很多不必要的麻烦,反而会提供开发效率哦

当然网上也有很多,检查寄存器LR SP等地址 来反推出最后运行的汇编函数调用地址的,但是肯定没有上面的直观。                                                                                                                             

11) Call Stack + Locals 窗口

局部变量

Call Stack + Locals 窗口被合并在一个集成窗口中,每当程序停止时会显示调用栈和当前函数的所有局部变量。

如果可能,局部变量的值会显示,否则显示 < not in scope >。菜单中的View/Call Stack Window 用来切换 Call Stack + Locals 窗口显示或隐藏。

运行并停止 Blinky,点击 Call Stack + Locals 选项卡。

下图展示了Call Stack + Locals 窗口。 



窗口中显示了当前活动函数的名称和局部变量列表。随同每个函数的名字会显示它被哪个函数或中断/异常调用。 
当函数退出时,会从列表上移除。 
最早调用的函数会出现在列表的底端。 
这个列表只有在程序停止运行时有效。

点击 Step In 图标 或按 F11 键。

当单步运行到不同的函数时,观察它们在窗口上显示的变化。如果陷入到Delay 函数的循环当中,可以用Step Out 或Ctrl+F11 键快速退出。

点击几次 Step In,观察其他函数。

右键点击一个函数名,尝试 Show Callee Code 和 Show Caller Code 选项。 


 

点击 Step Out 图标 退出所有函数,返回 main()。

提示: 如果单步调试(Step In)不工作,点击Disassembly 窗口使它成为焦点,可能需要点击一行反汇编代码来执行汇编级别的单步运行。如果焦点在源代码窗口上,则是执行 C 语言代码级别的单步运行。

提示: 可以在程序停止运行时,通过 Call Stack + Locals 窗口来修改变量的值。

提示: 上述是标准的“Stop and Go”调试过程。ARM Coresight 调试技术还可以做很多更强大的事情,比如在程序运行中显示并实时更新全局或静态变量,而不需要修改程序。由于局部变量通常存储在 CPU 寄存器中,不能在程序运行时实时显示,需要转换成全局或静态变量使得作用域不会消失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HardFault_Handler异常(死机)的处理 的相关文章

  • spring-oauth2 登录成功处理程序

    有没有办法使用 spring oauth2 添加登录成功处理程序 我尝试使用基本身份验证过滤器 但它仅过滤客户端凭据而不是用户凭据 或者我是否需要创建自定义用户身份验证管理器 TIA 该解决方案适用于密码流 也适用于我不确定的其他解决方案
  • 如何在 Erlang 中处理 SIGINT?

    感谢 Google 和大量教程 我知道如何用 Java Python Ruby Perl 和 Lisp 创建自定义信号处理程序 我无法在线找到如何在 Erlang 中为 SIGINT SIGTERM HUP 等创建处理程序 你不能 操作系统
  • 检测 Paypal 订阅取消

    我编写了一个简单的贝宝订阅系统 用户可以在其中输入他们的信息 单击按钮 然后开始订阅 我想知道如何知道用户何时取消订阅 我已经看到 txn type subscr cancel 但我不知道如何使用它 因为 paypal 不会再次调用我的处理
  • 从 Java 游戏中删除对象(Eclipse)

    让我们开始吧 我有一个 处理程序 类 它充满了 getter 和 setter 并且其中包含添加和删除对象的代码 它看起来像这样 public void addObject GameObject object this object add
  • 防止执行“继承的”信号处理程序

    当许多派生组件频繁使用该功能时 在 基本 组件中定义信号处理程序非常漂亮 但是 在 QML 中 在派生组件中安装新的处理程序does not替换原来的处理程序 它只是堆叠在它的上面 由于处理程序对于每个信号来说并不是唯一的 它们只是连接 并
  • 从服务访问 UI 线程处理程序

    我正在 Android 上尝试一些新的东西 我需要访问 UI 线程的处理程序 我知道以下几点 UI线程有自己的处理程序 和活套 任何消息都会被放置 进入UI的消息队列 线 Looper 获取事件 并将其传递给处理程序 处理程序处理消息并 将
  • 单击按钮启动计时器

    我是 Android 编程新手 但我了解 Java 我的问题是 Android 中的计时器如何工作 我读过最好使用处理程序 我想做的是 您单击一个按钮 计时器就会启动 到单击按钮的那一刻 我一切都清楚了 但如何启动计时器 Android 中
  • 如何在 WinForms 中等待信号同时监听事件?

    Case 1 这是我的设置 internal class MyClass private ApiObject apiObject private bool cond1 private bool cond2 internal MyClass
  • 在后台线程中运行处理程序消息

    我想在后台线程中运行一些 Runnable 我想使用Handler 因为它方便延迟 我的意思是 handler post runnable delay Where runnable应该运行在背景线 是否可以创建这样的Handler 某处是否
  • 存储和恢复事件处理程序

    请帮助修复我的功能 存储一个元素的事件并将其删除 然后重新安装 我不知道问题出在哪里 该函数只会删除element的事件 不会恢复 请帮忙修复 HTML a href a a a href b a JS a hover function a
  • 当我抛出异常时,内存会被释放吗?

    我正在与一些同事争论当你在动态分配的类中抛出异常时会发生什么 我知道malloc被调用 然后是类的构造函数 构造函数永远不会返回 那么会发生什么malloc 考虑以下示例 class B public B cout lt lt B B lt
  • Android - 延迟加载图像

    我正在尝试伪造某种进度条 我有 X 张图片并想要一张ImageView以一定的延迟向他们展示 我尝试过做这样的事情 for i 2 i
  • 找不到记录器的处理程序

    我是Python新手 我正在尝试登录 python 我遇到了找不到记录器的处理程序尝试通过记录器实例打印一些警告时出错 下面是我尝试过的代码 import logging logger logging getLogger logger lo
  • Python 日志记录:为什么 __init__ 被调用两次?

    我正在尝试将 python 日志记录与配置文件和自己的处理程序一起使用 这在某种程度上是有效的 真正让我困惑的是 init 被叫两次并且 del 被调用一次 当我删除整个配置文件内容并直接在代码中创建处理程序时 init 被调用一次并且 d
  • Android:从静态处理程序类调用非静态方法

    鉴于此代码 public class MainActivity extends FragmentActivity implements ActionBar TabListener public static final int MESSAG
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • 具有线程安全性的 eventbus 最佳实践

    我的应用程序具有用户交互活动和后台服务 这是修改数据模型的唯一地方 后台服务监听用户所做的操作以及来自网络的传入消息 因此 可能会出现并发问题 我尝试使用处理程序来防止这些问题 对于事件层 我使用 greenrobots Eventbus
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 如何在条件持续时在Mysql中选择行

    我有这样的事情 Name Value A 10 B 9 C 8 意思是 这些值是按降序排列的 我需要创建一个新表 其中包含占总值 60 的值 所以 这可能是一个伪代码 set Total sum value set counter 0 fo
  • 将参数传递给 http.HandlerFunc

    我正在使用 Go 的内置 http 服务器pat http github com bmizerany pat响应某些 URL mux Get products http HandlerFunc index func index w http

随机推荐

  • 2016年底总结

    一年又过去了 xff0c 在此简单说说这一年的收获和感受吧 一 说说考试 今年参加了两场考试 xff0c 一个是注册电气工程师 xff08 供配电 xff09 考试 xff0c 另外一个是一级建造师考试 两个考试均在9月份进行 xff0c
  • JS实现浏览器打印、打印预览

    目前正在做浏览器端采用JS方式实现打印这么一个功能 xff0c JS打印实现的方法很多 xff0c 但是兼容各个浏览器实现打印预览的功能有些棘手 xff0c 现将实现的内容及遇到的问题记录下来 xff0c 希望有大牛看到所提的问题后可以给予
  • STM32流水灯

    这个是根据51的基础上改的 一看就懂 直接在main c编辑就行 而不用去弄什么固件库 寄存器 这个是8个灯 然后设置A0 A7口为Output 推挽输出 就行 直接在user的main c中写就好 USER CODE BEGIN Head
  • PX4Ubuntu16.04环境搭建

    一 在虚拟机上安装一个新的ubuntu16 04系统 二 打开PX4的GITHUB主页 https github com PX4 Firmware 1 按照教程 这些脚本已经在干净的Ubuntu LTS 16 04和Ubuntu LTS 1
  • ucosII 信号量使用总结(举例讲解)

    概述 信号量用于 xff1a 1 控制共享资源的使用权 xff08 满足互斥条件 xff09 2 标志某时间的发生 3 使2个任务的行为同步 OSSemCreate 赋初值 OSSemCreate INT16U cnt xff0c cnt为
  • 用supervisor管理进程报错 “exit status 1 not expected”

    查看supervisor的日志发现报错 xff1a tail f var log supervisor supervisord log exited cyberwing domain numbercard exit status 1 not
  • Linux下core文件产生的一些注意问题

    前面转载了一篇文章关于core文件的产生和调试使用的设置 xff0c 但在使用有一些需要注意的问题 xff0c 如 在什么情况 才会正确地产生core文件 列出一些常见问题 xff1a 一 xff0c 如何使用core文件 1 使用core
  • windows10+ubuntu16.04双系统安装教程--UEFI安装方法

    本人github其他资料地址 xff1a https github com Bubble water deeplearning 一 ubuntu 1 1 ubuntu 系统镜像链接 1 2 刻录ubuntu 系统镜像 1 3 安装教程 往下
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • C++语言HTTP协议解析器

    httpParser 项目地址 xff1a https github com yuesong feng httpParser C 43 43 版本的 HTTP 协议解析器 xff0c 可自动识别 request 与 response 请求
  • Docker push 命令

    https www jianshu com p 1c8b96cf1f13 Docker hub注册用户 到官网注册账号 xff1a https hub docker com 在本地Linux登录docker xff1a docker 64
  • docker 配置国内镜像地址

    https www cnblogs com cocoajin p 15513348 html 为docker配置国内镜像地址 xff0c 用于在pull镜像下载加速 1 创建配置文件daemon json 在目录 etc docker da
  • Dockerfile的使用

    dockerfile中的指令 构建镜像 docker build t 仓库地址 仓库名称 镜像名称 标签 在dockerfile目录下构建 文件名为Dockerfile FORM span class token comment 指定基础镜
  • ROS小车记录系列(二)IMU采集、过滤,与odom数据融合,发布新的odom话题

    xff08 二 xff09 IMU采集 过滤 xff0c 利用EKF将IMU与odom融合 xff0c 发布新的odom话题 A ROS采集节点B imu tools过滤imu数据C 使用 robot pose ekf 对imu和odom进
  • java开发——时间类型和时间格式转换

    项目开发过程中 xff0c 有时候需要将时间的形式进行变换 xff0c 时间的输入和输出不一致的转换 xff0c 本文用于记录常用到的方法 首先对sdf format a sdf parse a 两个类型进行区分 sdf format a
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • Linux(centos 7) 环境安装MySQL5.7

    mysql安装包 链接 xff1a 百度网盘 请输入提取码 提取码 xff1a b8w4 环境准备 安装好的centos 7系统 root 用户登录Linux 在根目录下创建 soft目录 上传mysql安装包到 soft目录 xff0c
  • Linux桌面基础:X Window System——Xorg

    一 前言 Unix Like 操作系统不是只能进行服务器的架设而已 xff0c 在美编 排版 制图 多媒体应用上也是有其需要的 这些需求都需要用到图形接口 xff08 Graphical User Interface GUI xff09 的
  • 位姿估计之PnP算法

    最近实验室学习安排是了解Pnp问题解法 xff0c 于是就在网上找了各种文章学习 xff0c 在此进行总结 xff0c 给我卷 xff01 xff01 xff01 1 什么是PnP问题 xff1f PnP 全称Perspective n P
  • HardFault_Handler异常(死机)的处理

    在系统开发的时候 xff0c 出现了HardFault Handler硬件异常 xff0c 也就是死机 xff0c 尤其是对于调用了os的一系统 xff0c 程序量大 xff0c 检测堆栈溢出 xff0c 以及数组溢出等 xff0c 找了半