你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机程序跑飞死机的原因

[复制链接]
gaosmile 发布时间:2020-3-27 10:58
经常接触单片机的朋友,肯定遇到过单片机程序跑飞的问题。由于程序较为复杂,所以一旦出现跑飞的现象就比较难以查找错误出现的地方,网络上对错误的解释和解决方法也比较五花八门,并不方便查找。小编特意帮大家整理了关于单片机程序跑飞死机的原因,大家快来看看能不能在其中找到自己想要答案吧。5 a. m5 M1 @5 ~$ s) [9 @; E

( L6 f4 n& b. U6 d0 n单片机程序死机,跑飞了' ?) B+ Z& l( C3 y' p
可以从以下几个方面查找原因:

  K- a- z5 c+ e5 k/ p3 ?7 o" k+ @$ ?2 Y. j1 l( Y
1、意外中断
0 \, [( N3 E* Q- r* r
& i! _  `; I: w" E4 |& q
是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。
# R9 p4 c1 O9 K2 d! ~" n3 s
2 O; z3 }( Z! P. u! m4 _5 g
2、中断变量处理不妥
& O9 f6 m1 ]% \2 Z) C8 j: p/ u" T0 X% G5 V$ S/ l- Y
若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile;其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断,否则出现造成数据乱套。5 ]- B) h) s2 {

5 x3 `+ ^# ?# B, ]* f5 r$ ^( `
3、地址溢出,常见错误为指针操作错误
" v/ g* Y( D3 V6 T" G4 \7 R- p- m, h2 J
着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
8 V# i( C6 Q: M9 ^0 p# [4 _+ n5 s/ k, e) [" I; h$ F% x+ ]
4、无条件的死循环' x4 g7 O* r4 Q* Y; T7 t

" r2 K( \. R9 V+ Q. T3 S1 v% F8 q比如使用while(x),等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。8 A: c' ]+ {1 ?
% h" u4 R4 B/ \1 H& {3 A6 s
5、看门狗没有关闭
( v7 a  d: Z. L& a7 E' w) Q
& R9 E9 S/ p; o8 C) Y
有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机。这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗。& l. e" F, v; W9 U$ M
- r; r$ |; q) I6 i2 b
6、堆栈溢出
% _9 N6 D% q0 d7 D1 a% s
1 }- @: b/ g  m& k* f% [最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。
* `7 e% j2 Y6 r  V$ V2 O* D. Y6 A9 p: y* F# _3 Z0 c
通过本篇文章,大家是否找到了自己想要的问题解决方法了呢?就算没有找到,本篇文章也能帮助大家在一定程度上预防跑飞现象的发生。

$ p& B8 B' Q" |9 _
赞 收藏 评论0 发布时间:2020-3-27 10:58

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版