TA的每日心情 | 开心 2023-5-15 15:14 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
经常接触单片机的朋友,肯定遇到过单片机程序跑飞的问题。由于程序较为复杂,所以一旦出现跑飞的现象就比较难以查找错误出现的地方,网络上对错误的解释和解决方法也比较五花八门,并不方便查找。小编特意帮大家整理了关于单片机程序跑飞死机的原因,大家快来看看能不能在其中找到自己想要答案吧。
' r$ _$ m* f. n+ Y0 O' b# P$ U5 `
6 _7 L* [- H$ h单片机程序死机,跑飞了
0 w, t9 u2 i! B0 F3 n可以从以下几个方面查找原因:
2 x' Q- ?7 x3 _- }* y
3 ^7 u: q2 ^0 [3 ^1 C. s1、意外中断
! u( w: B- m3 e2 \1 U, N7 U* X2 g; ]0 H, [- ^4 f W
是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。- H: J3 B$ V- u/ o) \; k
* k# e( M6 ^% O" o2、中断变量处理不妥
& J+ i7 K" U0 n6 _( e7 {/ I, F% R' {2 _! ^9 v( \
若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile;其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断,否则出现造成数据乱套。
% r( ^1 \8 ]; c' V8 r/ A& a' V; f* E4 y. Z
3、地址溢出,常见错误为指针操作错误
& T4 y- z1 Y- X$ _4 I4 V' Z# R
6 J% ]! V: Q6 h0 G+ p/ `9 o- ^- A* M$ S着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。4 T; i a/ a+ S/ O
* j3 [3 M9 J6 i: ~: g# F& A9 ?0 q2 ^4、无条件的死循环5 b0 l6 F7 m* e, k# N
6 B% ?$ J/ M H比如使用while(x),等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。- r9 W! [4 X, E+ A" m) H
7 I+ z0 U* A% u, T3 S
5、看门狗没有关闭
; h. q& T8 u# \: g; q( r0 v" x# |
有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机。这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗。2 C; b7 k% w* W- e; _
- B( L& [4 m3 T6、堆栈溢出- p; s$ V+ ~5 G2 e: U1 z! p
; d, S) d1 z+ P" {. `9 p# l/ w+ W最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。& S' ~9 V9 F8 l2 d
% I% z5 o3 H+ C7 b4 R
通过本篇文章,大家是否找到了自己想要的问题解决方法了呢?就算没有找到,本篇文章也能帮助大家在一定程度上预防跑飞现象的发生。. R8 }. d# j( t: B. x
|
|