历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | 关于stm32 HardFault_Handler 异常的处理死机

2019-03-24 来源:eefocus

在系统开发的时候,出现了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等地址 来反推出最后运行的汇编函数调用地址的,但是肯定没有上面的直观。


推荐阅读

史海拾趣

问答坊 | AI 解惑

在VS2005+PB6.0的编译环境下调试HelloCE程序出错

提示 “WM_HIBERNATE”:未声明的标识符 代码如下: //====================================================================== // HelloCE - A simple application for Windows CE // // Written for the book Programming Windows CE // ...…

查看全部问答>

16f877 sim仿真 现金求助

pic16f877 通过编程仿真 由Sim-Emu 6.01 Configurator v2.1 写入手机号码的相关参数后得到: 一张十合一的可以自动切换imsi的sim卡 这个卡可以用于iphone 这个网址可以提供相应的知识准备 http://www.weiphone.com/viewthread.php?tid=4272& ...…

查看全部问答>

如何在EVC下使用CxImage

在VC6.0下,可以正常使用,然而在EVC4.0下,却总是编译不过...…

查看全部问答>

CE平台上的ISR!!!

那位写过CE平台上的中断服务程序! 请指点一二呀。我对这不懂,谢谢了…

查看全部问答>

发个好用的LCD1602最简程序

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 我的LCD1602是三个控制线的即:RS,RW,E 在论坛里本来有这个显示例程,但我下进我的LCD1602后不显,后来我从网上找到一个觉得不错特来分享   原地址:…

查看全部问答>

淘宝发现两个好东西,不知道其它地方可以买到吗?

msp430超值系列的单片机 达利尔官方只要6块钱。 然后它有28到32个引脚。资源也丰富 更重要的是,它支持两线仿真     我很想买几块,就是运费要20,舍不得。不知道别的地方有卖的吗?  …

查看全部问答>

防止驱动电源“掉链子”——LED照明测试技术分析

LED照明具有节能、环保、长寿命、易控制、免维护等特点。然而颇具讽刺意味的是,我们常常听闻由于LED驱动电源本身的寿命直接拖累LED照明灯具变得并不“长寿”,极大地增加了维护/使用成本;或者驱动电源的效率不高导致LED照明灯具的能效转换比并不 ...…

查看全部问答>

大家一起学习PIC单片机之二(独立键盘蜂鸣器提示)

 大家好,本人是PIC单片机新手,但是我很勤奋,我买的ND118-877APIC实验开发板,里面有实例,但是没有源代码,本人自己写代码大家一起交流,希望能陆续写下去,本人QQ476857290 希望大家学习指导。本节学习 8位独立按键蜂鸣器提示   ...…

查看全部问答>

cpld产生一定形式方波的问题

cpld时钟50M,怎么产生下图所示的周期性方波?还有采用什么方法产生周期为1s的方波信号占用硬件资源更少? …

查看全部问答>

stm32 串口通信地址唤醒问题

stm32串口通信支持地址唤醒,但是地址位只有4位,也就是说最多连接16个..在很多情况下都不够用。 除此以外还有其他问题,比如,对于1号地址,接收的数据必须以0x81开头,但是如果给2号地址发送: 82 05 05 81 02 02 那么一号机就会收到81 02 02. ...…

查看全部问答>