关于stm32 HardFault_Handler 异常的处理死机

发布者:乘风翻浪最新更新时间:2019-03-24 来源: eefocus关键字:stm32  HardFault_Handler  处理死机 手机看文章 扫描二维码
随时随地手机看文章

在系统开发的时候,出现了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进入异常


关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

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


关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

c.查找问题


关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

d.找出出错的函数


关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

e.解决问题


关于stm32 <wbr> <wbr>HardFault_Handler <wbr>异常的处理 <wbr>死机,估计这是网上最全的吧

f  一些思考

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

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


关键字:stm32  HardFault_Handler  处理死机 引用地址:关于stm32 HardFault_Handler 异常的处理死机

上一篇:STM32意外复位问题调试
下一篇:解决STM32 HardFault_Handler错误记录

推荐阅读最新更新时间:2024-03-16 16:26

STM32——GPIO设置:快速点亮第一个LED灯
简介 不同的开发板的原理图结构也不尽相同,笔者在这里使用野火的MINI-V3(F103VET6)简易开发板对GPIO口的设置做一个简单的介绍,并实现按键控制LED灯的亮灭。方便读者可以快速熟悉并灵活应用。 原理图分析 首先我们来看一下发光二极管部分和按键部分的原理图。 下面是按键的原理图部分: 在这里,我们将使用KEY1(PA0)来控制红灯PB5的亮灭。由原理图可知,其控制LED灯的PB5引脚为低电平时,灯亮。当KEY1按下时,PA0引脚由之前的低电平转为高电平(3V3)。明确了目的之后我们就可以分析GPIO口并进行设置了。 GPIO设置 经过上述的功能明确之后,我们将其分为两大类,分别是输入类(如按键)和输出类(LED灯
[单片机]
<font color='red'>STM32</font>——GPIO设置:快速点亮第一个LED灯
STM32和ROS的串口通信
1 前言 之前有不少小伙伴,因为不知道如何使用这里分享的代码、或者是对系统结构不太清楚等等,导致调用不成功的,这里我深表歉意。下面我会对整个通信方案的部署进行详细的说明,确保每一个看到这篇文章的小伙伴,都能解决自己的问题。 2 本方案解决的问题 解决以STM32做ROS机器人底层驱动的串口通信问题、其他需要stm32和ros通信的小伙伴也可以使用。 -1- 介绍 1 最终协议的样子 我这里实现的STM32和ROS的串口通信协议如下图: STM32端和ROS端都有一个数据发送函数和一个数据接收函数,发送和接收的内容就是如上图所示的数据包,该数据包含有数据头(55aa)、数据尾(0d0a)、校验(crc8),
[单片机]
<font color='red'>STM32</font>和ROS的串口通信
STM32外设之GPIO
一、GPIO是什么? 全称:General-purpose input/output(通用型输入输出) 操作要点: 1. 使能 GPIO 端口时钟。 2. 初始化 GPIO 目标引脚为推挽输出模式。 3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。 二、使用步骤 1.GPIO功能与模式 1.输入浮空 :输入模式施密特触发器打开及GPIO端口内部上下拉开关打开, 并且状态不确定。 2.输入上拉:输入模式施密特触发器打开及GPIO端口内部上拉开关关闭,默认为高电平。 3.输入下拉 :输入模式施密特触发器打开及GPIO端口内部下拉开关关闭,默认为低电平。 4.模拟输入 : 模拟输入施密特触
[单片机]
<font color='red'>STM32</font>外设之GPIO
STM32基础8--通用定时器(PWM控制LED)
从STM32基础7--通用定时器,STM32通用定时器可以产生PWM波形,从而控制LED亮度。下面我们更加详细的了解一下,PWM对LED的控制。 PWM控制LED硬件电路 在下面的原理图中,可以看到LED0与LED1连接到STMF407的PF9与PF10引脚上。在电路中,当PF9,PF10分别为低电平的时候,LED0与LED分别导通,也就是这个电路中,PWM周期的低电平周期,LED会被导通。 PWM周期与LED闪烁 在STM32F407中,当我们使用PWM1模式时,进行如下的设置。 当我们使用逻辑分析仪(LA)抓取,可以得到如波形,也就是说Pulse设置的为低电平的时间长度。当我们下载程序进开发板时,发现LED
[单片机]
<font color='red'>STM32</font>基础8--通用定时器(PWM控制LED)
STM32第一个demo与软件设置
所使用软件版本为:Keil MDK4.12 单片机 型号为: STM32F103C8T6 STM32第一个demo 1.建立文件夹 GPIO_TEST存放整个工程项目,在该项目文件夹下建立子文件夹存放不同类别的文件。 Obj:存放工程文件 Out:存放编译输出文件 Sorce:存放源代码文件 2.新建工程 打开KEIL3,这个时候显示的应该是上次使用过的工程。 在其中新建工程,把该工程存放在刚刚建立的Obj子文件夹下。 点击保存后弹出选择器件窗口,选择选择使用器件型号。 点击确定后弹出: 这个时候选择“是”,工程建立成功。 3.工程管理 这
[单片机]
<font color='red'>STM32</font>第一个demo与软件设置
STM32使用Jlink烧写与boot合并烧写的方法
1 概述 本文主要描述STM32的bootloader及应用程序HEX文件的合并,以及相应的烧写方法。 2 适用范围 1. 相关的开发人员 2. 需要烧写的其他人员 3 创建烧写使用的HEX文件 3.1 Hex文件的获取 通过对ECU-R以及Bootloader程序的编译获得我们所需要的两个hex文件。ECU-R对应的HEX文件名为STM32_RTT_F107RC.hex,Bootloader对应的Hex文件名为Project.hex。如下图所示: 3.2 Hex文件的合并 由于现在ECU-R的程序包括Bootloader和应用程序两个部分,但是为了减少生产中的工作量,需要将两个HEX文件合并为1个H
[单片机]
STM32 SPI通信时钟极性和相位设置
通过 SPI_CR1 寄存器中的 CPOL 和 CPHA 位,可以用软件选择四种可能的时序关系。 CPOL(时钟极性)位控制不传任何数据时的时钟电平状态。此位对主器件和从 器件都有作 用。如果复位 CPOL,SCK 引脚在空闲状态处于低电平。如果将 CPOL 置 1,SCK 引脚在 空闲状态处于高电平。 如果将 CPHA(时钟相位)位置 1,则 SCK 引脚上的第二个边沿(如果复位 CPOL 位,则 为下降沿;如果将 CPOL 位置 1,则为上升沿)对 MSBit 采样。即,在第二个时钟边沿锁存 数据。如果复位 CPHA 位,则 SCK 引脚上的第一个边沿(如果将 CPOL 位置 1,则为下降 沿;如果复位 CPOL 位,则为
[单片机]
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
基于<font color='red'>STM32</font>模拟UART串口通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved