找回密码
 注册
关于网站域名变更的通知
查看: 483|回复: 2
打印 上一主题 下一主题

单片机死机常见原因分享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-18 10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
在日常的单片机开发中,不可避免会遇上死机的现象,让人摸不着头脑,更严重的是死机并不能轻易复现的情况,下面我就说一些我在开发过程中遇到过的情况。
# F1 \5 O4 j+ y) J2 D4 V7 \: h/ J# ~  N: X. l; n
变量溢出或变量未初始化' u' M7 p" Z% Y  q$ [
这里的变量溢出指的是变量定义的数据类型,变量溢出肯定会造成程序在运行过程中出现异常,但经我验证,并不一定会造成死机。作为一名合格的C程序员,我们应该把数据定义合适,不会超出,也不会浪费内存空间。
- {3 n# _& K# I. }
/ k' l) ?) l" `# O) w( V- M程序逻辑
) ~5 W) m5 d& k6 i) W有时候看上去的死机情况,是程序的逻辑有问题,造成了工作起来像死机一样,这时可以分析出现死机的环境因素,异常的功能表现,条件允许还可以做运行途中的数据采集,结合各种因素分析程序的问题,有时代码看起来执行过程没问题,实际上某个步骤并没想象中那么简单,要保证正常运行必须进行特殊处理。$ j7 G1 V, W0 K8 Z& ?& ~
; q/ h6 F* d# w' K. j* g
数组溢出
4 M; W" X/ P$ n6 u1 S在定义数组变量时,我们都有初始化一个数组长度变量,这个长度必须符合程序运行需要,若定义少了,溢出部分的功能肯定出现问题,稍有过之,就会造成死机。还有,定义长度合适,但在数组存放数据时,没有对数据长度进行必要的判断,造成数组溢出,是一定会死机的。& V0 d3 r9 i/ l- O3 g" P7 g
* S9 I. c  f1 f9 l6 d
指针错误. k% o# b* \  d' l, r6 L
这个我平时并未遇到过,但从理论分析,指针错误是会造成死机的。
  ?: j0 p3 o& z! e9 N  p( a8 \% r2 v3 J! O/ o
中断7 b0 u) G: N7 X: m" t' x+ @: d" _
中断造成死机的因素还是蛮多的,这个也跟不同单片机的内部中断设置有关。第一种,打开了实际上没有使用的中断。当没用到的中断被误触发后,就会造成异常。第二种,没有真正地消除中断标志位。在中断服务函数中一定要保证所有相关的中断标志位被清除。第三种,中断使能位没有处理好。* |* }' g6 a3 _
其中,我遇到过第二种情况,那个单片机的通信接收错误会对应产生接收错误中断标志位,与通信接收中断共用一个中断服务函数,而我把接收错误标志的清除放在了主循环的几个位置上。这个处理造成了接收错误中断标志位其实并没有得到绝对的清除,引起该中断标志一直触发中断,这时程序就以超低速运行,这是一种“假死”的情况。4 V) m2 M9 ]& P& @1 k
$ W* n/ j& S8 g
死循环8 Z: o$ f: |- ]  x& \' f* x: Y
程序一直待在while(x);里面出不来,正常情况下,x是会变成0的,但一直为1就会出不来。在实际开发中,一般的处理是寄存器外设相关的像内部时钟起振,AD采样这种还是保留while(外设进行中,未完成);的写法,因为实在不行还有看门狗,但在逻辑处理时,往往采用do……while(x);结构,在一段时间后break;出去循环体。
7 g! D) S" A, a/ J' G8 `3 s$ e6 Z. g5 D: L/ Q
看门狗
2 U- r$ n5 V% ?! D# {$ q开发过程中,我们都会打开看门狗,每个mcu的内部看门狗框图并不一样,需按照对应的框图结构进行配置,像有些单片机有窗口看门狗,有些单片机使用硬件看门狗。可能也会有取消看门狗功能的,就要注意是否关闭了所有看门狗。, J% Y% \! m1 P4 m" H. \. B9 o. G
7 [% O5 C! ^7 M" N
低压4 [5 H- G. [& N8 d
我们知道电子设备在电压不足的情况下会出现异常,所以现在MCU都有低压复位功能。可是,一般产品不是5V,3.3V直接供电的,像通过7805稳压供电的,是不会出现的单片机供电电压不足的情况的。
" K2 b5 \# w$ ^6 q+ a, h. S$ C
! z) u& S. q/ B' {/ y$ H堆栈不够
; b! A2 ~) W2 v# r8 G/ x2 j在程序中尽量避免多级的调用,不然单片可能没有足够的堆栈区。+ f0 K( o. ]. X" [

2 Y1 q9 D" i3 ~# G2 Z3 A9 {9 E中断变量处理不妥
' e& ~( ?5 L  f对于在中断中修改的全局变量,使用volatile关键字。在读取中断变量时,先关闭全局中断,读完之后再打开全局中断。& [& q% t8 W+ X1 x

$ Q' |9 ]9 U- K5 E+ z5 Y6 e3 E, e- G6 @' [

该用户从未签到

2#
发表于 2021-9-18 11:08 | 只看该作者
中断造成死机的因素还是蛮多的,这个也跟不同单片机的内部中断设置有关

该用户从未签到

3#
发表于 2021-9-18 13:27 | 只看该作者
数组长度定义少了,溢出部分的功能肯定出现问题,稍有过之,就会造成死机
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-10 01:01 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表