電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 40|回復(fù): 0
收起左側(cè)

嵌入式 C 語言運(yùn)行時(shí)的錯(cuò)誤處理機(jī)制

[復(fù)制鏈接]

462

主題

462

帖子

1055

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1055
跳轉(zhuǎn)到指定樓層
樓主
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師# @% S1 O6 z9 D( `, C- A1 f) q
關(guān)注我,一起變得更加優(yōu)秀!' \! f6 ^. I4 P+ h" I6 t, `
嵌入式軟件工程師在編寫 C 語言應(yīng)用程序的時(shí)候,經(jīng)常會(huì)遇到程序運(yùn)行時(shí)跑飛的情況,程序運(yùn)行時(shí)產(chǎn)生錯(cuò)誤,多半是程序員在編寫代碼時(shí),沒有預(yù)判好發(fā)生錯(cuò)誤的地方,并且沒有設(shè)計(jì)好合適的錯(cuò)誤處理機(jī)制。) k% m3 p8 J. N) l; c4 o; m
在嵌入式C語言編程中,錯(cuò)誤處理機(jī)制是確保系統(tǒng)穩(wěn)定性和可靠性的關(guān)鍵部分,能確保系統(tǒng)在已知的風(fēng)險(xiǎn)和錯(cuò)誤條件下正常運(yùn)行。: [" W9 I: q' v1 i$ l) x* e
以下分享一些常用的錯(cuò)誤處理方法:2 ]  W: m+ J( n+ ^! L7 F
1、斷言 (Assertions)
2 W+ D1 o5 i4 o( X/ l斷言用于在開發(fā)階段捕獲程序中的邏輯錯(cuò)誤。通過 assert 宏,可以在條件不滿足時(shí)終止程序并輸出錯(cuò)誤信息,這有助于在開發(fā)階段及早發(fā)現(xiàn)問題。3 {. @. X2 l. K4 O$ C$ o
強(qiáng)烈建議使用斷言機(jī)制對(duì)函數(shù)傳參的參數(shù)合法性進(jìn)行判斷,很多芯片的SDK包的函數(shù)傳參都采用了有效的斷言機(jī)制,以防止參數(shù)不合法帶來不必要的麻煩。8 g) K, i* \5 Z

( P( R7 w6 w6 X+ A; q  j2、錯(cuò)誤碼 (Error Codes)+ H8 M5 x7 ~4 G- y
通過返回錯(cuò)誤碼來指示函數(shù)執(zhí)行的結(jié)果。調(diào)用者可以根據(jù)錯(cuò)誤碼采取相應(yīng)的措施,這是一種靈活且適用于多種應(yīng)用場(chǎng)景的錯(cuò)誤處理方式。
! K& x: h0 i5 A, A7 Q對(duì)于有返回值的函數(shù)接口調(diào)用,錯(cuò)誤碼包含了非常豐富的調(diào)試信息,當(dāng)某個(gè)函數(shù)接口調(diào)用異常時(shí),通常先根據(jù)錯(cuò)誤碼進(jìn)行有效分析。
- i. |. K+ M* i/ b4 T
8 U9 X* w% ~; ^6 j; o3、中斷服務(wù)程序 (Interrupt Service Routines, ISR)
$ e- Y2 r+ k5 V& _# R- h# x2 e在嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在異常情況下仍能進(jìn)入中斷服務(wù)程序進(jìn)行相應(yīng)處理。; p2 A' d" m8 a$ }) i. \; W% I
通常是CPU運(yùn)行程序時(shí),內(nèi)部硬件或總線出現(xiàn)錯(cuò)誤而觸發(fā)中斷,對(duì)于MCU應(yīng)用可以使用 cm_backtrace 組件進(jìn)行棧回溯排查,以發(fā)現(xiàn)錯(cuò)誤發(fā)生的地方。
- f+ w( a  S# |  p* A% O+ S% K 8 F# e& @( G4 P; e2 ?+ @' c
4、看門狗定時(shí)器 (Watchdog Timer); a1 E) z6 h2 F* |
看門狗定時(shí)器用于檢測(cè)和恢復(fù)系統(tǒng)故障,通?梢允褂肅PU的內(nèi)部看門狗,或使用外部看門狗芯片,系統(tǒng)在正常運(yùn)行時(shí)需要定期重置看門狗定時(shí)器。1 ?: A  t3 W" j
如果某些錯(cuò)誤原因,導(dǎo)致程序邏輯不能及時(shí)重置定時(shí)器(俗稱:喂狗),看門狗就會(huì)觸發(fā)系統(tǒng)軟復(fù)位或外部RST引腳復(fù)位,這有助于防止系統(tǒng)因軟件錯(cuò)誤而陷入死循環(huán)。
8 p# D# T% W! m6 o8 A" e& c+ E
7 W- s8 K0 u2 Q5 \4 J1 v
5 Y: H1 P- Y- h+ Y/ j % \* Z! q3 o0 |
5、日志記錄 (Logging)- ~3 o! `; q+ ]+ ^; N
在應(yīng)用軟件運(yùn)行時(shí),如果產(chǎn)品上面有容量較大的非易失性存儲(chǔ)器,可以把運(yùn)行時(shí)的錯(cuò)誤日志記錄到存儲(chǔ)器里面。7 p( t8 d, K$ `% \. Q( A- v5 c
記錄程序運(yùn)行時(shí)的錯(cuò)誤日志,這種方式有助于出錯(cuò)時(shí)的調(diào)試和維護(hù),開發(fā)人員不用時(shí)刻在機(jī)器旁邊進(jìn)行程序運(yùn)行監(jiān)視,存儲(chǔ)的錯(cuò)誤日志還可以通過串口或調(diào)試接口輸出,這對(duì)于出現(xiàn)錯(cuò)誤后的分析和問題解決非常重要。% |: J  Z* E& o  z6 c. e3 a
% P& G; G2 [  B4 R6 b3 }
6、錯(cuò)誤傳遞9 ^% P. }8 ^; I5 C/ x  [
C 語言通常使用返回值來標(biāo)志函數(shù)是否執(zhí)行成功,調(diào)用者通過檢查返回值以判斷函數(shù)執(zhí)行情況。此外,也可以通過全局狀態(tài)標(biāo)志或局部跳轉(zhuǎn)(goto)來處理錯(cuò)誤。
5 J7 `0 C. d1 @+ T8 G4 [對(duì)于goto語句需要謹(jǐn)慎使用,在局部函數(shù)內(nèi)某個(gè)環(huán)節(jié)運(yùn)行出錯(cuò),使用goto語句可以直接跳轉(zhuǎn)到錯(cuò)誤處理節(jié)點(diǎn),但大范圍使用goto跳轉(zhuǎn),可能會(huì)破壞代碼的運(yùn)行結(jié)構(gòu)與完整性。0 r9 K) K) _# T$ I' Y0 a% I6 K0 |  ]1 j

, H& @; C$ ^' I  s' |3 d/ } , P) _  a( _' I; L6 b0 s1 _
不同的錯(cuò)誤處理機(jī)制,有對(duì)應(yīng)不同的業(yè)務(wù)應(yīng)用場(chǎng)景和系統(tǒng)要求,建議 C 語言程序開發(fā)者根據(jù)具體情況進(jìn)行具體分析,沒有一概而論完美的方法。
) v: }( |6 S4 y3 K但為了提升嵌入式系統(tǒng)整體的穩(wěn)定性和可靠性,在嵌入式 C 語言程序里面引入合適的錯(cuò)誤處理機(jī)制,是非常值得且有必要的。
" T6 O, R5 E$ b, D7 A$ x* A+ s/ \6 V" q1 a' M# V( o

2 ]6 [2 ^- X# w( J8 ^+ i8 S
; n+ p( U4 y4 Q. V( q/ d
1 F$ C% {. C- T0 N/ b
-END-
" e. }1 n& _# R# m+ p往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀) l. j- o2 [) H8 }
4 {3 c! B% ~+ ?" \
                                                       
5 H# V1 J: n: |7 K: {+ z                                                               
+ E6 ~$ I# y. }& i* y                                                                        ' y. N0 V& Z) ]- W( ^9 y& Z
                                                                                . a. b% r2 M2 Y( U2 P

. w+ c1 p& u" ~                                                                               
$ l; G8 D; p# v. U1 `2 l! M                                                                                        有哪些不推薦使用的嵌入式 C 語言語法特性?
. J- V5 a, X( R, \2 P( b) @2 `                                                        5 U) e2 ~& ?: H! S0 Z
                                                                ' y# {6 g: p# E5 f; W6 t4 ?5 j
                                                                       
9 c/ U7 x" d5 n8 T; \2 p) O                                                                               
+ _* w0 X0 m& U# |4 n6 x : y" W# [5 w, s- L/ `" v+ y. q
                                                                               
, b: i$ n# P5 |                                                                                        今年快過完了,明年準(zhǔn)備進(jìn)廠搞嵌入式工控,提前了解各方行業(yè)信息!( T2 d! s# Y! c  E( t3 o% `
                                                                " L# X! u2 H: }4 E
                                                                        . x- _' h$ n, Z! s) Z$ y! d6 [
                                                                                0 T$ u; A8 z7 P# T2 U

  e; }4 s$ O. X                                                                               
% c# M! l. d* k4 N, D4 y                                                                                        基于全志T113-i平臺(tái),嵌入式Linux 快速啟動(dòng),5.2秒成功進(jìn)入應(yīng)用界面!
) g5 }) l! b  ?1 O                                                                               
, T7 {* x6 r2 j% s% I3 j                                                                        & M4 B7 u; Q+ a( @3 X# G
                                                                1 x$ W5 b3 e0 E/ T* C4 F
                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師' S: o4 w& q% A% m( c1 n% [  ~
關(guān)注我,一起變得更加優(yōu)秀!

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表