TA的每日心情 | 开心 2022-12-9 15:13 |
---|
签到天数: 10 天 [LV.3]偶尔看看II
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是跑飞,最后费了好长时间,花了很大功夫才找到问题原因,由此总结了单片机程序跑飞的三种现象、原因及解决方法。
1 z! a6 ^* K) Z5 N" }
$ W: m0 r5 x1 w1 R1 数组越界/溢出" f! I* O9 y* I& U% d
& w4 X' b8 @7 n: I; |2 r; l* k现象:% Z. @- ^/ n( T, J- V
' c: A' T2 J& O$ ^5 b. h 单片机程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序跑飞。
+ }* ?( u3 R; j* O6 a4 Q
! r# s$ x, _9 O3 j原因:
9 p* Q) y% l* |* A* D `: S' S3 q% i# T" U- y3 @
数组越界(数组溢出),函数中定义的数组元素的个数小于程序中实际使用的数组元素的个数,例如在函数中定义了一个数组ucDataBuff[10],这个数组只有10个元素,但是在函数中却有这样的语句ucDataBuff[10]=0x1a,这个语句是给数组的第11个元素赋值,:由于定义的数组只有10个元素,从而导致赋值语句中不知道把0x1a放到什么地方,从而导致程序跑飞。$ }& N9 m% m R( T; {3 _
5 z& R& |- b' Q0 N1 L4 `
解决方法:$ m6 G: u2 [' z! E& q
- j* C& k& k) k" @* [0 l T
如果在调试程序时,发现程序总是在函数执行完毕时跑飞,多数情况是发生了数组越界(数组溢出)的错误,仔细检查函数中调用的数组是否存在越界(溢出)的情况。
0 M* _: z" X/ _! y2 E# T% C" ~6 p, O/ a" B5 ]
2 中断服务程序缺失
" M. \9 w1 C0 s' t" F# ]( B9 t, \* ~1 u2 |6 w. k& O- M1 c% O
现象:
/ x5 }8 _" s; {; N/ ~5 w& Q% S% W: k7 e- g0 w) l3 m% y/ k% h( H
程序运行过程中总是跑飞。
, A* V2 F& {- b7 K, X+ d0 Q/ P2 {3 N" Q; u, L! H7 A
原因:7 j! ?# U4 D a! q$ H
( d1 H1 {! s5 Q' h, p# n, c 程序中打开了某个中断,但是却没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。
+ G' R% v+ h9 P0 N& l: b# c
9 {, b, |- B4 ]: F0 u5 L解决方法:
% C( {1 N' B/ i- B$ x' p. y2 ^0 H4 X/ R% ~! ?) @- ~
检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。
; \4 P; \4 Z# s7 K+ W2 z
, n W# A2 z5 Y3 看门狗复位# }3 E4 {9 N6 { `
! [6 \- D9 K1 w1 B& s2 Z
现象:
1 s P3 g' u" \0 E0 _ {
* |, x7 F% @6 o- X, }) {$ G 在执行一段较为耗费时间的程序时,程序跑飞,并且总是跳到复位位置处。
- ^; p5 w6 T" _9 _# k8 u9 x8 \7 }* g0 N' u" l# T0 ^
原因:6 w) f# ^; y; r( d( ]! K
% \/ @! p2 Q6 P4 P' q$ L9 z b 程序中使用了看门狗,但是没有及时“喂狗”,从而导致看门狗复位,使程序直接跳到复位位置。
0 A* U, F% a" }* \9 M- _* g/ z3 |4 _& b5 _ G1 @8 D
解决方法:
, _+ G+ _7 O) q3 ^
+ V% x: [/ F6 `2 z 根据程序运行时间,尤其是一定要计算清楚最耗时的那段程序的运行时间,然后准确设置看门狗的复位时长,定时“喂狗”,尤其是如果有死循环的情况,一定要在死循环中记得“喂狗”。* `9 [% C# [" w u
, h8 y% n$ _ {! q4 y5 W V% x O找国产替代芯片,上道合顺大数据
5 J- u( _8 U& a; W# U' l! u5 z
! n# O7 G+ p- \8 i3 U
; ^ o8 B$ w6 E6 H, y
; B4 }; [8 r" ^/ b+ F! s |
|