|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在日常的单片机开发中,不可避免会遇上死机的现象,让人摸不着头脑,更严重的是死机并不能轻易复现的情况,下面我就说一些我在开发过程中遇到过的情况。) Q6 X+ l5 g; ^
. n: g# F* R, v$ G4 Q( d+ E
变量溢出或变量未初始化- a- [- D3 W9 p, x
这里的变量溢出指的是变量定义的数据类型,变量溢出肯定会造成程序在运行过程中出现异常,但经我验证,并不一定会造成死机。作为一名合格的C程序员,我们应该把数据定义合适,不会超出,也不会浪费内存空间。" k/ i) Y# u( [* u' j
' S: K, p! o! i" q程序逻辑' o0 m5 z' Q; V$ }( ?! C
有时候看上去的死机情况,是程序的逻辑有问题,造成了工作起来像死机一样,这时可以分析出现死机的环境因素,异常的功能表现,条件允许还可以做运行途中的数据采集,结合各种因素分析程序的问题,有时代码看起来执行过程没问题,实际上某个步骤并没想象中那么简单,要保证正常运行必须进行特殊处理。2 ?8 ^: o4 m0 A, a. {
u3 i$ X% _" A- d2 \6 Z9 p% t9 S. C数组溢出( L& D5 K( M( [4 v2 O
在定义数组变量时,我们都有初始化一个数组长度变量,这个长度必须符合程序运行需要,若定义少了,溢出部分的功能肯定出现问题,稍有过之,就会造成死机。还有,定义长度合适,但在数组存放数据时,没有对数据长度进行必要的判断,造成数组溢出,是一定会死机的。* r/ I' W' e( }5 l0 r) ~
4 N$ A4 J' k' ]! ?指针错误
3 J! q! F) |* x% t8 \) s. u" ]* ]这个我平时并未遇到过,但从理论分析,指针错误是会造成死机的。
8 [$ D& I" ^) v8 d+ c5 F( B1 l5 O' ?" C9 |" M+ O! z1 j: a! D
中断
/ Q5 u- O/ G; K4 p- w: F& R& y中断造成死机的因素还是蛮多的,这个也跟不同单片机的内部中断设置有关。第一种,打开了实际上没有使用的中断。当没用到的中断被误触发后,就会造成异常。第二种,没有真正地消除中断标志位。在中断服务函数中一定要保证所有相关的中断标志位被清除。第三种,中断使能位没有处理好。
# B/ O- Z' f, ^其中,我遇到过第二种情况,那个单片机的通信接收错误会对应产生接收错误中断标志位,与通信接收中断共用一个中断服务函数,而我把接收错误标志的清除放在了主循环的几个位置上。这个处理造成了接收错误中断标志位其实并没有得到绝对的清除,引起该中断标志一直触发中断,这时程序就以超低速运行,这是一种“假死”的情况。% x; {$ S& i. Q: H& b
; G2 V# `$ V4 m7 @. G8 h
死循环
0 P, x5 n# u3 c2 f9 A B程序一直待在while(x);里面出不来,正常情况下,x是会变成0的,但一直为1就会出不来。在实际开发中,一般的处理是寄存器外设相关的像内部时钟起振,AD采样这种还是保留while(外设进行中,未完成);的写法,因为实在不行还有看门狗,但在逻辑处理时,往往采用do……while(x);结构,在一段时间后break;出去循环体。
! e9 t a+ i* ^
+ L9 M( o3 ?: k看门狗$ n' w0 p) f6 r4 K
开发过程中,我们都会打开看门狗,每个mcu的内部看门狗框图并不一样,需按照对应的框图结构进行配置,像有些单片机有窗口看门狗,有些单片机使用硬件看门狗。可能也会有取消看门狗功能的,就要注意是否关闭了所有看门狗。! \. ~! N o# n/ `* O' v4 e
& v& o9 k) C: D5 n9 n6 q" m低压
6 _( W, }# C$ D我们知道电子设备在电压不足的情况下会出现异常,所以现在MCU都有低压复位功能。可是,一般产品不是5V,3.3V直接供电的,像通过7805稳压供电的,是不会出现的单片机供电电压不足的情况的。
7 h+ j3 e' O5 E5 A+ l* j1 c8 D5 A! A$ h/ n, `/ _" C: { F) M
堆栈不够; V5 D; ^/ ~( u2 U
在程序中尽量避免多级的调用,不然单片可能没有足够的堆栈区。. d. `8 o( [6 D
% r1 B# b2 E! m4 y( t中断变量处理不妥5 b/ K4 j' X) j% a: O% V. n
对于在中断中修改的全局变量,使用volatile关键字。在读取中断变量时,先关闭全局中断,读完之后再打开全局中断。- [- `8 W' q4 [( x! f- x
% u0 _+ \" Y$ p+ c" B0 O0 x6 }
8 X7 q/ r# [4 T- }) T! O" a |
|