我是老温,一名热爱学习的嵌入式工程师& z* d' [1 h; h8 u, B& M
关注我,一起变得更加优秀!- f9 b s, A! E3 ?
嵌入式软件工程师在编写 C 语言应用程序的时候,经常会遇到程序运行时跑飞的情况,程序运行时产生错误,多半是程序员在编写代码时,没有预判好发生错误的地方,并且没有设计好合适的错误处理机制。
5 r, S8 `- n+ k7 r% e G在嵌入式C语言编程中,错误处理机制是确保系统稳定性和可靠性的关键部分,能确保系统在已知的风险和错误条件下正常运行。
# F4 k+ h! \. z o, q/ P+ x以下分享一些常用的错误处理方法:
2 P& {$ H% E# N$ R8 y9 b, f ]6 z1、断言 (Assertions)
, u+ ]5 d4 }' V* p断言用于在开发阶段捕获程序中的逻辑错误。通过 assert 宏,可以在条件不满足时终止程序并输出错误信息,这有助于在开发阶段及早发现问题。- B& O* A* x! V. _( ~/ @/ v5 A6 Z
强烈建议使用断言机制对函数传参的参数合法性进行判断,很多芯片的SDK包的函数传参都采用了有效的断言机制,以防止参数不合法带来不必要的麻烦。4 w; x' Z3 N l+ U6 i! P
i0o3osqr4ge6408255906.png
: q! \! @% l) {6 i7 q3 F
2、错误码 (Error Codes)- }- v. L* @) o! P
通过返回错误码来指示函数执行的结果。调用者可以根据错误码采取相应的措施,这是一种灵活且适用于多种应用场景的错误处理方式。* }, ]: l8 @- x, n
对于有返回值的函数接口调用,错误码包含了非常丰富的调试信息,当某个函数接口调用异常时,通常先根据错误码进行有效分析。; z K1 i% q/ m j! p* {( G8 \4 l
fuvhjjjbp5t6408256006.png
1 { a* I% M: n' n* Z& g3、中断服务程序 (Interrupt Service Routines, ISR)
0 K% u* s' x$ L& M o: j7 q" m在嵌入式系统中,中断是处理异常情况的常用方法。ISR用于处理硬件中断,并确保系统在异常情况下仍能进入中断服务程序进行相应处理。3 j* @5 Y5 X( z5 F3 X
通常是CPU运行程序时,内部硬件或总线出现错误而触发中断,对于MCU应用可以使用 cm_backtrace 组件进行栈回溯排查,以发现错误发生的地方。- y/ v8 s; A; C i$ ?
zcpsk15dsqm6408256106.png
4 N' K* |: K: ]; m* C% r9 p4、看门狗定时器 (Watchdog Timer)
- n- X+ I, w9 i. s. F0 }2 X看门狗定时器用于检测和恢复系统故障,通常可以使用CPU的内部看门狗,或使用外部看门狗芯片,系统在正常运行时需要定期重置看门狗定时器。1 p8 G( u8 r' Z% s# n
如果某些错误原因,导致程序逻辑不能及时重置定时器(俗称:喂狗),看门狗就会触发系统软复位或外部RST引脚复位,这有助于防止系统因软件错误而陷入死循环。3 z- Q+ }$ ?+ D: y
z0dknst4rml6408256206.png
) v6 I4 q |% r2 N+ B6 a L
- l" y- L2 K# ~& Z/ D
msxebyerfbk6408256306.png
) i! R) t) I0 W8 s3 x$ Q. _0 {5、日志记录 (Logging)6 F. |! |3 p: [2 I2 B9 @; e
在应用软件运行时,如果产品上面有容量较大的非易失性存储器,可以把运行时的错误日志记录到存储器里面。
+ `6 \6 C( W2 v" B- o0 E# U$ o( S记录程序运行时的错误日志,这种方式有助于出错时的调试和维护,开发人员不用时刻在机器旁边进行程序运行监视,存储的错误日志还可以通过串口或调试接口输出,这对于出现错误后的分析和问题解决非常重要。- K0 {+ Y8 B: x/ P
sjjqvifpmci6408256406.png
* O4 x& D/ R2 M4 o7 K
6、错误传递2 e- d" z4 w/ k g9 y9 `
C 语言通常使用返回值来标志函数是否执行成功,调用者通过检查返回值以判断函数执行情况。此外,也可以通过全局状态标志或局部跳转(goto)来处理错误。! r* H- e) x" r ]/ A
对于goto语句需要谨慎使用,在局部函数内某个环节运行出错,使用goto语句可以直接跳转到错误处理节点,但大范围使用goto跳转,可能会破坏代码的运行结构与完整性。& H: P, l! d' t1 A% @
7 r U8 n/ R. L2 ]! v
ljygacmdjg46408256507.png
/ A- G& h( |" j D# ?$ W不同的错误处理机制,有对应不同的业务应用场景和系统要求,建议 C 语言程序开发者根据具体情况进行具体分析,没有一概而论完美的方法。
) r+ h( [$ J1 }( Z$ f! M但为了提升嵌入式系统整体的稳定性和可靠性,在嵌入式 C 语言程序里面引入合适的错误处理机制,是非常值得且有必要的。
[. U& E7 k8 t. Z
: W, ?$ h7 L9 t6 g A& [- f3 `
eejwfys2zzk6408256607.png
, p; p: T+ U3 P7 a6 \
6 \" c/ W+ S& B& k ?0 Q2 c- [5 a+ W2 T' [ [1 N4 t% t- D
-END-
7 D1 s! q( t' {2 N) T9 M. a往期推荐:点击图片即可跳转阅读+ M. b- [4 [* F; P4 c; A0 F7 w
0 X. @8 Q, G, ?4 @ [
. n' ?2 s0 ~, ^" o j7 U+ \ 8 Z n; s0 y2 l- A8 o- |; q: r6 M
5 I% j$ a" G9 S7 I 5 e. W p( V! m& N6 ~7 h" |1 h3 b
4kmx1fut2zg6408256707.jpg
9 Z$ i/ X- ^. K/ h% E
$ e l% k0 I: h) ]: d1 ` g
有哪些不推荐使用的嵌入式 C 语言语法特性?- t& r$ V+ r3 w4 e+ n! y- B- i
5 h- G% y- d- D; o
+ E* ^/ h% m2 T5 [- I% n) j) Z) y
7 i8 k9 u( R$ i+ f; M
8 c5 r) a: e* I- w# C1 u1 A' }& v
yoici31rnup6408256807.jpg
4 S5 l- T, M9 B7 D- V
6 L8 m, R% @$ K- Q, D& d+ Q 今年快过完了,明年准备进厂搞嵌入式工控,提前了解各方行业信息!
/ l5 ~+ f; X; d- r% _4 J& K" R 3 T- V# Y+ Y! L& n: D* s, @
( S' {1 A! t5 A+ K) `! L) B 8 b* h) J0 c/ a C
ijnaykh4uoc6408256907.jpg
/ {5 W i, P) k
0 B6 W! z+ W; W/ d' j
基于全志T113-i平台,嵌入式Linux 快速启动,5.2秒成功进入应用界面!5 }2 l( Y. C# G$ Y+ T' m5 q
: a' f8 y, d9 s6 s% a1 v
: ?; R8 {9 G" \. }3 E/ {/ t" ` & y ~; z, Z" F# H V& M
我是老温,一名热爱学习的嵌入式工程师4 ^$ Z$ n: ]% A9 Y: }
关注我,一起变得更加优秀! |