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

单片机死机常见原因分享

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
在日常的单片机开发中,不可避免会遇上死机的现象,让人摸不着头脑,更严重的是死机并不能轻易复现的情况,下面我就说一些我在开发过程中遇到过的情况。
6 j, B9 l9 t3 K& D2 g5 t3 O- y7 U2 ~; W- `+ p9 ?( a
变量溢出或变量未初始化
9 B: c" l( Y/ \" x5 v6 q  g这里的变量溢出指的是变量定义的数据类型,变量溢出肯定会造成程序在运行过程中出现异常,但经我验证,并不一定会造成死机。作为一名合格的C程序员,我们应该把数据定义合适,不会超出,也不会浪费内存空间。  V5 N' F. J7 A: y6 {1 R! A% i2 d& t

7 F6 e: }. H5 `, \* K" U程序逻辑; s( Q8 l- F7 v* h
有时候看上去的死机情况,是程序的逻辑有问题,造成了工作起来像死机一样,这时可以分析出现死机的环境因素,异常的功能表现,条件允许还可以做运行途中的数据采集,结合各种因素分析程序的问题,有时代码看起来执行过程没问题,实际上某个步骤并没想象中那么简单,要保证正常运行必须进行特殊处理。
& g! f& r! q* H
  l/ \" X. {( I/ B; W: ?0 ^% `数组溢出3 K' V/ U' f5 c( r
在定义数组变量时,我们都有初始化一个数组长度变量,这个长度必须符合程序运行需要,若定义少了,溢出部分的功能肯定出现问题,稍有过之,就会造成死机。还有,定义长度合适,但在数组存放数据时,没有对数据长度进行必要的判断,造成数组溢出,是一定会死机的。. h9 {* X3 l& c: @6 ?/ e# ?2 N

: }( r2 m# u2 o  ?6 ]指针错误6 R5 ]2 G! ~. [: i; N
这个我平时并未遇到过,但从理论分析,指针错误是会造成死机的。- d1 ?+ r3 U  X0 T- W+ r
% @; i' J8 N7 p
中断
7 r1 ?: y4 {  @( ]中断造成死机的因素还是蛮多的,这个也跟不同单片机的内部中断设置有关。第一种,打开了实际上没有使用的中断。当没用到的中断被误触发后,就会造成异常。第二种,没有真正地消除中断标志位。在中断服务函数中一定要保证所有相关的中断标志位被清除。第三种,中断使能位没有处理好。* I1 E: r) [0 \) q
其中,我遇到过第二种情况,那个单片机的通信接收错误会对应产生接收错误中断标志位,与通信接收中断共用一个中断服务函数,而我把接收错误标志的清除放在了主循环的几个位置上。这个处理造成了接收错误中断标志位其实并没有得到绝对的清除,引起该中断标志一直触发中断,这时程序就以超低速运行,这是一种“假死”的情况。
- `/ v* f+ \7 q7 A# ?9 q2 M9 ~: F- E, e/ T
死循环9 a6 y' p: Q" U" B& ~
程序一直待在while(x);里面出不来,正常情况下,x是会变成0的,但一直为1就会出不来。在实际开发中,一般的处理是寄存器外设相关的像内部时钟起振,AD采样这种还是保留while(外设进行中,未完成);的写法,因为实在不行还有看门狗,但在逻辑处理时,往往采用do……while(x);结构,在一段时间后break;出去循环体。- i1 p- M9 m/ `  p
9 E4 f' ]  G% h$ s% z9 U& K9 v. V5 l
看门狗
  W6 @6 Y+ Q5 I1 A; \$ @  M开发过程中,我们都会打开看门狗,每个mcu的内部看门狗框图并不一样,需按照对应的框图结构进行配置,像有些单片机有窗口看门狗,有些单片机使用硬件看门狗。可能也会有取消看门狗功能的,就要注意是否关闭了所有看门狗。
% u1 d, B6 Z1 F! Z* F; R
/ g# ~7 h  \2 U4 ^2 r, t1 r3 ^; v低压3 R: c' R/ ~2 v1 ?5 \4 Z
我们知道电子设备在电压不足的情况下会出现异常,所以现在MCU都有低压复位功能。可是,一般产品不是5V,3.3V直接供电的,像通过7805稳压供电的,是不会出现的单片机供电电压不足的情况的。
( F5 k& j- m! {" A+ k! P: T' ]( B# C; Y+ P
堆栈不够
! g3 A9 {5 s* ]$ \在程序中尽量避免多级的调用,不然单片可能没有足够的堆栈区。
4 _4 c5 H+ q8 |8 a1 F; ^
' y# q: B! o$ P% r% h+ v中断变量处理不妥! b3 d4 R) W- n: u+ c6 b! ^% |
对于在中断中修改的全局变量,使用volatile关键字。在读取中断变量时,先关闭全局中断,读完之后再打开全局中断。4 D$ K) m6 {' m+ f
6 f3 e6 n: y+ j6 \+ a' n, j7 a! j' E
3 @: s: {9 T" g5 Q( d- c1 d! b

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 13:43 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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