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

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

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

嵌入式 C 語言運行時的錯誤處理機制

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

三級會員

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-22 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師& J; W% _* Y% d1 U
關(guān)注我,一起變得更加優(yōu)秀!! A+ j- }  f3 Z, }3 `
嵌入式軟件工程師在編寫 C 語言應(yīng)用程序的時候,經(jīng)常會遇到程序運行時跑飛的情況,程序運行時產(chǎn)生錯誤,多半是程序員在編寫代碼時,沒有預(yù)判好發(fā)生錯誤的地方,并且沒有設(shè)計好合適的錯誤處理機制。
' {8 X: X* S  t0 B& {; w( O) ~; c在嵌入式C語言編程中,錯誤處理機制是確保系統(tǒng)穩(wěn)定性和可靠性的關(guān)鍵部分,能確保系統(tǒng)在已知的風(fēng)險和錯誤條件下正常運行。( A1 D6 x, p4 g( L* _# A: B5 \
以下分享一些常用的錯誤處理方法:4 d* g2 L6 f6 [. R
1、斷言 (Assertions)' s9 M& K% e: v2 y
斷言用于在開發(fā)階段捕獲程序中的邏輯錯誤。通過 assert 宏,可以在條件不滿足時終止程序并輸出錯誤信息,這有助于在開發(fā)階段及早發(fā)現(xiàn)問題。( X' d/ K* w. j* a& v
強烈建議使用斷言機制對函數(shù)傳參的參數(shù)合法性進行判斷,很多芯片的SDK包的函數(shù)傳參都采用了有效的斷言機制,以防止參數(shù)不合法帶來不必要的麻煩。# ]. [! l& o; Q; Z9 I7 f* ?( l9 L- ^& O
, H0 |. b, I. A7 R7 }+ y. v0 e2 C
2、錯誤碼 (Error Codes)6 P+ P3 ]4 g: [- h4 q& I, a
通過返回錯誤碼來指示函數(shù)執(zhí)行的結(jié)果。調(diào)用者可以根據(jù)錯誤碼采取相應(yīng)的措施,這是一種靈活且適用于多種應(yīng)用場景的錯誤處理方式。3 k6 q2 }. j5 S7 O: h
對于有返回值的函數(shù)接口調(diào)用,錯誤碼包含了非常豐富的調(diào)試信息,當(dāng)某個函數(shù)接口調(diào)用異常時,通常先根據(jù)錯誤碼進行有效分析。; C- p7 Y8 ^3 O) M

+ S  ?- d! X, M2 u3、中斷服務(wù)程序 (Interrupt Service Routines, ISR)" V# _2 a% o- ]! x- Y4 E3 }
在嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在異常情況下仍能進入中斷服務(wù)程序進行相應(yīng)處理。
5 [" V; s& Z* ?- m: j2 r通常是CPU運行程序時,內(nèi)部硬件或總線出現(xiàn)錯誤而觸發(fā)中斷,對于MCU應(yīng)用可以使用 cm_backtrace 組件進行;厮菖挪椋园l(fā)現(xiàn)錯誤發(fā)生的地方。
* Q8 ?8 k8 J9 J2 ~8 b# f% v 5 Q) E! \% n* g9 S$ n
4、看門狗定時器 (Watchdog Timer)2 }& I/ j; K: L! Q) X# \
看門狗定時器用于檢測和恢復(fù)系統(tǒng)故障,通?梢允褂肅PU的內(nèi)部看門狗,或使用外部看門狗芯片,系統(tǒng)在正常運行時需要定期重置看門狗定時器。3 \& H/ r( Y9 z3 O8 v- v  g  p
如果某些錯誤原因,導(dǎo)致程序邏輯不能及時重置定時器(俗稱:喂狗),看門狗就會觸發(fā)系統(tǒng)軟復(fù)位或外部RST引腳復(fù)位,這有助于防止系統(tǒng)因軟件錯誤而陷入死循環(huán)。
5 t6 b5 Y& ?9 A8 V& S( o. k7 y
/ o3 ?9 [- N; L; [; X! ]; Q5 W0 }/ ~4 G0 A

1 z* @1 w* V# l4 X- y& k' V5、日志記錄 (Logging)
7 B9 D$ L4 Y0 |! ]) B/ J  c在應(yīng)用軟件運行時,如果產(chǎn)品上面有容量較大的非易失性存儲器,可以把運行時的錯誤日志記錄到存儲器里面。/ H2 P" g5 q0 f: d
記錄程序運行時的錯誤日志,這種方式有助于出錯時的調(diào)試和維護,開發(fā)人員不用時刻在機器旁邊進行程序運行監(jiān)視,存儲的錯誤日志還可以通過串口或調(diào)試接口輸出,這對于出現(xiàn)錯誤后的分析和問題解決非常重要。
0 H1 K# \$ J) U8 V$ a- }  l9 C
: w# d' j9 F( U. K0 g2 J6、錯誤傳遞
5 [% {8 a& Z4 WC 語言通常使用返回值來標(biāo)志函數(shù)是否執(zhí)行成功,調(diào)用者通過檢查返回值以判斷函數(shù)執(zhí)行情況。此外,也可以通過全局狀態(tài)標(biāo)志或局部跳轉(zhuǎn)(goto)來處理錯誤。; I, S) E# e2 D+ m; C$ x% n8 h
對于goto語句需要謹(jǐn)慎使用,在局部函數(shù)內(nèi)某個環(huán)節(jié)運行出錯,使用goto語句可以直接跳轉(zhuǎn)到錯誤處理節(jié)點,但大范圍使用goto跳轉(zhuǎn),可能會破壞代碼的運行結(jié)構(gòu)與完整性。
% |0 S! Y( r$ Q8 I3 |2 C
, [* h' F7 k! V! ?$ g 0 ]1 K/ s7 K( Y' M0 f+ _$ t- ?
不同的錯誤處理機制,有對應(yīng)不同的業(yè)務(wù)應(yīng)用場景和系統(tǒng)要求,建議 C 語言程序開發(fā)者根據(jù)具體情況進行具體分析,沒有一概而論完美的方法。
2 E7 Q" c* u, D* E' l但為了提升嵌入式系統(tǒng)整體的穩(wěn)定性和可靠性,在嵌入式 C 語言程序里面引入合適的錯誤處理機制,是非常值得且有必要的。5 @) W' b% B  O) ^8 f0 N
, k* y! o, Z6 x& d% q- H0 G
5 V; L/ ^9 ?7 R9 V
" c; L; @1 V4 v/ f) ?9 G+ O3 L3 [; u% f
/ O$ O5 N3 L) a5 t$ ^1 W0 r( Z
-END-2 n5 g% z0 N3 ]0 c' ^
往期推薦:點擊圖片即可跳轉(zhuǎn)閱讀
3 t) r: x/ n" G0 F( z

7 k0 W0 Q* k. ~# U! y                                                        $ q8 C& \/ U6 ?  j, }
                                                               
! Z( T- M. Y5 b4 H                                                                       
& d$ g! u* H' P& a                                                                               
9 R7 w* S8 I  M6 E
& D! a) h/ `6 Z" R  D3 q) |                                                                                & A: |$ t4 ~5 M5 e) v7 V
                                                                                        有哪些不推薦使用的嵌入式 C 語言語法特性?, k- j% k; [5 j0 b" X: y2 d
                                                       
7 T1 D5 ^) A6 j* i                                                               
+ M( O0 |- r4 o) ]0 f                                                                        4 _/ M; ~) V0 m% u4 g( Q
                                                                               
' t1 S: l6 q: v. _3 @! n% g * k9 T, F! i) s, M5 z
                                                                               
: @1 F, y: A" h, M+ Z, \% Z1 g                                                                                        今年快過完了,明年準(zhǔn)備進廠搞嵌入式工控,提前了解各方行業(yè)信息!0 Y) \% E9 a- c8 I) m' T
                                                                & Z4 ~& o( N" l' [- d
                                                                       
, _7 x5 k' c/ M, O9 n3 B# U) [& P  E                                                                                1 }" i4 C: A, O. \7 m8 ~& t( _
4 N6 k; p4 c5 \3 i( }; S$ I
                                                                               
9 e7 l1 V% y) g4 d5 E: ^. a. ~$ _& c                                                                                        基于全志T113-i平臺,嵌入式Linux 快速啟動,5.2秒成功進入應(yīng)用界面!
7 B* {6 s3 ~$ [+ s8 c* T& t                                                                               
4 [  C# C# y4 e                                                                       
2 g  `* A+ ]8 i( t9 D* [9 M7 @                                                               
+ B$ }. z- J( @6 e8 A                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師
6 Q, Q5 }: i: d% Y$ {關(guān)注我,一起變得更加優(yōu)秀!
回復(fù)

使用道具 舉報

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

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


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