您的位置 首页 新品

关于stm32 HardFault_Handler 反常的处理 死机

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

在体系开发的时分,呈现了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等地址 来反推出最终运转的汇编函数调用地址的,可是必定没有上面的直观。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/259952.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部