电子产业一站式赋能平台

PCB联盟网

搜索
查看: 192|回复: 0
收起左侧

嵌入式 C 语言运行时的错误处理机制

[复制链接]

531

主题

531

帖子

3068

积分

四级会员

Rank: 4

积分
3068
发表于 2024-11-22 17:50:00 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师
  T+ U! ~$ M) v: X% Z关注我,一起变得更加优秀!( O# m3 u: Z/ @5 O
嵌入式软件工程师在编写 C 语言应用程序的时候,经常会遇到程序运行时跑飞的情况,程序运行时产生错误,多半是程序员在编写代码时,没有预判好发生错误的地方,并且没有设计好合适的错误处理机制。
& |' h' H& n$ F9 c3 }) c4 ^在嵌入式C语言编程中,错误处理机制是确保系统稳定性和可靠性的关键部分,能确保系统在已知的风险和错误条件下正常运行。2 I* k, r8 ^2 d/ `" V. b9 `" q
以下分享一些常用的错误处理方法:
( k+ Z9 g+ o- o; g9 A" G1、断言 (Assertions)
+ _( p0 N7 @) }断言用于在开发阶段捕获程序中的逻辑错误。通过 assert 宏,可以在条件不满足时终止程序并输出错误信息,这有助于在开发阶段及早发现问题。
. q3 g5 z" _: W& S2 e- h! i- B强烈建议使用断言机制对函数传参的参数合法性进行判断,很多芯片的SDK包的函数传参都采用了有效的断言机制,以防止参数不合法带来不必要的麻烦。% \) ^2 k3 n& n- K5 e3 w2 ]4 X

i0o3osqr4ge6408255906.png

i0o3osqr4ge6408255906.png
  s' E1 S; S/ E- S) l
2、错误码 (Error Codes)
. I9 g! C; \0 \' j. r, J通过返回错误码来指示函数执行的结果。调用者可以根据错误码采取相应的措施,这是一种灵活且适用于多种应用场景的错误处理方式。0 \: A5 k' h+ z7 p! f" A$ a( Y2 {
对于有返回值的函数接口调用,错误码包含了非常丰富的调试信息,当某个函数接口调用异常时,通常先根据错误码进行有效分析。! L$ s' p8 b1 B/ x

fuvhjjjbp5t6408256006.png

fuvhjjjbp5t6408256006.png
; q( m; b& n3 h" ?' f
3、中断服务程序 (Interrupt Service Routines, ISR)
3 z8 w* Y: R8 x$ g! P' y在嵌入式系统中,中断是处理异常情况的常用方法。ISR用于处理硬件中断,并确保系统在异常情况下仍能进入中断服务程序进行相应处理。
% \/ `" d# h- h+ R1 E  R/ T通常是CPU运行程序时,内部硬件或总线出现错误而触发中断,对于MCU应用可以使用 cm_backtrace 组件进行栈回溯排查,以发现错误发生的地方。
# _' N4 y0 i/ v

zcpsk15dsqm6408256106.png

zcpsk15dsqm6408256106.png

8 K: H7 C6 R4 B: Y5 l4、看门狗定时器 (Watchdog Timer)
2 |1 W# \2 h# o. m( K, q" y! y0 x看门狗定时器用于检测和恢复系统故障,通常可以使用CPU的内部看门狗,或使用外部看门狗芯片,系统在正常运行时需要定期重置看门狗定时器。. r- r( i. \9 ~7 ~6 a8 t
如果某些错误原因,导致程序逻辑不能及时重置定时器(俗称:喂狗),看门狗就会触发系统软复位或外部RST引脚复位,这有助于防止系统因软件错误而陷入死循环。- V! D4 ~( B2 r+ A6 {$ Y+ g

z0dknst4rml6408256206.png

z0dknst4rml6408256206.png
: Q; C% m0 C' l) V/ m

7 o' o5 X3 A( v" w3 i( L5 A

msxebyerfbk6408256306.png

msxebyerfbk6408256306.png

6 r4 q# e4 g3 a- L& H5、日志记录 (Logging)
) L- l4 A$ y' p# y* e1 H在应用软件运行时,如果产品上面有容量较大的非易失性存储器,可以把运行时的错误日志记录到存储器里面。: m5 D" V% Z4 p% u: V) J
记录程序运行时的错误日志,这种方式有助于出错时的调试和维护,开发人员不用时刻在机器旁边进行程序运行监视,存储的错误日志还可以通过串口或调试接口输出,这对于出现错误后的分析和问题解决非常重要。
0 ]: J+ ]% T0 x8 x3 B0 T

sjjqvifpmci6408256406.png

sjjqvifpmci6408256406.png
( X4 u' o9 Z0 k. }5 g2 P4 K
6、错误传递* m0 @8 o3 G. P% \! v/ A3 m( q
C 语言通常使用返回值来标志函数是否执行成功,调用者通过检查返回值以判断函数执行情况。此外,也可以通过全局状态标志或局部跳转(goto)来处理错误。
8 t5 h  w, L7 i" V: w- z3 t对于goto语句需要谨慎使用,在局部函数内某个环节运行出错,使用goto语句可以直接跳转到错误处理节点,但大范围使用goto跳转,可能会破坏代码的运行结构与完整性。
8 m8 x# {2 c2 U5 Y  ?8 W
* v0 Q0 U. J0 T9 T

ljygacmdjg46408256507.png

ljygacmdjg46408256507.png

) Q# X9 C$ {) Q4 r8 ~5 c不同的错误处理机制,有对应不同的业务应用场景和系统要求,建议 C 语言程序开发者根据具体情况进行具体分析,没有一概而论完美的方法。
5 I! q: r: Z% n- w) L6 U: z9 Y但为了提升嵌入式系统整体的稳定性和可靠性,在嵌入式 C 语言程序里面引入合适的错误处理机制,是非常值得且有必要的。5 t( y( P/ t" O$ J3 s- u

  o' Q+ C5 K$ l' m4 f

eejwfys2zzk6408256607.png

eejwfys2zzk6408256607.png
1 K- I3 k; B0 Q% L

1 p" {  u5 t4 ]4 F
# J! I) G+ V7 ]1 A& \$ D: c
-END-8 Y( e- e$ z/ z/ G/ w0 r
往期推荐:点击图片即可跳转阅读
. s2 c" ^2 R6 {/ y% e+ o# L

7 @3 ?  Z0 `% u7 s- y  [                                                       
6 R1 W2 V3 v7 n. E8 {                                                                4 R% P0 N1 A: k9 M/ X( n+ S
                                                                        4 @& Y6 b2 a2 S% S: F
                                                                               
' Z. o& }8 v! i' M4 d6 \) l8 y

4kmx1fut2zg6408256707.jpg

4kmx1fut2zg6408256707.jpg

( ]# F+ K6 Q2 M( w. a                                                                                . b* _2 H& {. @. X5 l$ B5 s
                                                                                        有哪些不推荐使用的嵌入式 C 语言语法特性?( L. _9 I# `& O7 g/ K+ }
                                                       
* @$ \' [- l1 m' M                                                               
/ s) X( {- h- w# @; l5 O5 p                                                                       
& Q* D4 p/ q9 m8 p! f                                                                                " i% F/ k. y/ m+ L$ @1 e

yoici31rnup6408256807.jpg

yoici31rnup6408256807.jpg

9 a3 b( A. ]& O, ?% Z" {3 }                                                                                5 t" I9 q, k* }$ r7 s% J
                                                                                        今年快过完了,明年准备进厂搞嵌入式工控,提前了解各方行业信息!
' S0 f$ }; x+ X                                                                ' u1 |, R4 Y0 G! h: Z+ m
                                                                       
# L0 Q) N* K' ]4 R/ n9 Q                                                                               
; I8 ~: X, X  t1 z. Q2 {

ijnaykh4uoc6408256907.jpg

ijnaykh4uoc6408256907.jpg
1 y8 x6 h3 B) p: {7 e( G8 e
                                                                               
0 T4 @9 Q4 T) O. y- e- O; }                                                                                        基于全志T113-i平台,嵌入式Linux 快速启动,5.2秒成功进入应用界面!
% @- B, d$ B* E7 p                                                                               
/ w' i7 E0 \3 Y! ~# {% ?6 C/ }, V                                                                       
+ d' r! C6 p0 k! I+ r                                                               
" _( i2 |  q5 S2 [! d                                                        我是老温,一名热爱学习的嵌入式工程师+ e" ]  {* ]5 ^1 [% X1 P3 p4 _
关注我,一起变得更加优秀!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表