|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在日常的单片机开发中,不可避免会遇上死机的现象,让人摸不着头脑,更严重的是死机并不能轻易复现的情况,下面我就说一些我在开发过程中遇到过的情况。
, ^4 j' z3 }+ w; ]3 u. X3 I* y/ f# d4 m* n' [
变量溢出或变量未初始化+ w/ ^; \& W. y! B2 [- x5 _
这里的变量溢出指的是变量定义的数据类型,变量溢出肯定会造成程序在运行过程中出现异常,但经我验证,并不一定会造成死机。作为一名合格的C程序员,我们应该把数据定义合适,不会超出,也不会浪费内存空间。* ?# O% H. o0 J5 S. R( H% g
2 ?4 t: d# o B程序逻辑
* F- }3 C6 F# e3 r" P有时候看上去的死机情况,是程序的逻辑有问题,造成了工作起来像死机一样,这时可以分析出现死机的环境因素,异常的功能表现,条件允许还可以做运行途中的数据采集,结合各种因素分析程序的问题,有时代码看起来执行过程没问题,实际上某个步骤并没想象中那么简单,要保证正常运行必须进行特殊处理。8 O @( X6 Z. \ U' }7 E/ B# P
. _# `7 I- F4 U4 a4 C9 p( r S数组溢出
1 l- R2 F& q8 |/ ]( O在定义数组变量时,我们都有初始化一个数组长度变量,这个长度必须符合程序运行需要,若定义少了,溢出部分的功能肯定出现问题,稍有过之,就会造成死机。还有,定义长度合适,但在数组存放数据时,没有对数据长度进行必要的判断,造成数组溢出,是一定会死机的。
/ s/ v9 `6 E* E- A
+ C' c: k" X( e j指针错误
|9 I" r9 ]( f8 h+ n这个我平时并未遇到过,但从理论分析,指针错误是会造成死机的。* g! s) h* ~$ W2 v3 y6 N9 G
* D) ]8 ~9 C& o# v1 N3 _
中断
* x9 g8 H1 G- ~& H中断造成死机的因素还是蛮多的,这个也跟不同单片机的内部中断设置有关。第一种,打开了实际上没有使用的中断。当没用到的中断被误触发后,就会造成异常。第二种,没有真正地消除中断标志位。在中断服务函数中一定要保证所有相关的中断标志位被清除。第三种,中断使能位没有处理好。
+ o% L( n5 G% f0 k0 Y# x其中,我遇到过第二种情况,那个单片机的通信接收错误会对应产生接收错误中断标志位,与通信接收中断共用一个中断服务函数,而我把接收错误标志的清除放在了主循环的几个位置上。这个处理造成了接收错误中断标志位其实并没有得到绝对的清除,引起该中断标志一直触发中断,这时程序就以超低速运行,这是一种“假死”的情况。+ x) v/ k H) q2 M. H; W/ D
( p% J! ~* u6 G M1 n% [0 h死循环, ~. ?: H! \) B
程序一直待在while(x);里面出不来,正常情况下,x是会变成0的,但一直为1就会出不来。在实际开发中,一般的处理是寄存器外设相关的像内部时钟起振,AD采样这种还是保留while(外设进行中,未完成);的写法,因为实在不行还有看门狗,但在逻辑处理时,往往采用do……while(x);结构,在一段时间后break;出去循环体。4 t5 i `/ r1 \
, ^& ?0 S L: U) Q5 `1 F
看门狗# ]5 J" ^! U5 h' g. b, s i
开发过程中,我们都会打开看门狗,每个mcu的内部看门狗框图并不一样,需按照对应的框图结构进行配置,像有些单片机有窗口看门狗,有些单片机使用硬件看门狗。可能也会有取消看门狗功能的,就要注意是否关闭了所有看门狗。
3 \( z/ {/ O$ Z& A( d: p( J/ S" X1 z8 o
7 A$ F! ]; {; I/ w1 H1 G/ z低压# \6 I, X: d1 W* g+ {$ S' ]
我们知道电子设备在电压不足的情况下会出现异常,所以现在MCU都有低压复位功能。可是,一般产品不是5V,3.3V直接供电的,像通过7805稳压供电的,是不会出现的单片机供电电压不足的情况的。1 ]8 D5 L8 L& u
# t8 Z. u1 V' m" W; h
堆栈不够
5 I5 d& p: S& j4 P$ z. [! |在程序中尽量避免多级的调用,不然单片可能没有足够的堆栈区。
4 D. G j- G E0 D- {+ m
' B$ d, y6 q: v% m中断变量处理不妥
8 T. O* _ |7 T/ c. B对于在中断中修改的全局变量,使用volatile关键字。在读取中断变量时,先关闭全局中断,读完之后再打开全局中断。4 J5 h3 g0 x6 i! r) \0 ? F
" J9 o7 v9 z- P* }+ V
! z+ Z$ [+ z8 F8 O. y4 f" c1 t( T! Z
|
|