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

PCB聯盟網

搜索
查看: 107|回復: 0
收起左側

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

[復制鏈接]

485

主題

485

帖子

1623

積分

三級會員

Rank: 3Rank: 3

積分
1623
跳轉到指定樓層
樓主
發(fā)表于 2024-11-22 17:50:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是老溫,一名熱愛學習的嵌入式工程師( b* U/ V  A( J% D
關注我,一起變得更加優(yōu)秀!4 x; B+ U# J0 F7 F* u" C$ i1 T4 i
嵌入式軟件工程師在編寫 C 語言應用程序的時候,經常會遇到程序運行時跑飛的情況,程序運行時產生錯誤,多半是程序員在編寫代碼時,沒有預判好發(fā)生錯誤的地方,并且沒有設計好合適的錯誤處理機制。
& W: j9 J  c' ~8 v在嵌入式C語言編程中,錯誤處理機制是確保系統穩(wěn)定性和可靠性的關鍵部分,能確保系統在已知的風險和錯誤條件下正常運行。
: `  [8 c  k" x7 h2 G* M0 b以下分享一些常用的錯誤處理方法:( t+ O. L4 [4 w/ k- G
1、斷言 (Assertions)! C5 X2 ]# v* B! n  M
斷言用于在開發(fā)階段捕獲程序中的邏輯錯誤。通過 assert 宏,可以在條件不滿足時終止程序并輸出錯誤信息,這有助于在開發(fā)階段及早發(fā)現問題。
! B) C' E: N4 S2 K3 \強烈建議使用斷言機制對函數傳參的參數合法性進行判斷,很多芯片的SDK包的函數傳參都采用了有效的斷言機制,以防止參數不合法帶來不必要的麻煩。
: _" h: _' r0 b$ `
) P! P, E" C: Q. q" }& ~/ y3 q2、錯誤碼 (Error Codes)' {( w$ E8 G! s- S' }- _: a# c
通過返回錯誤碼來指示函數執(zhí)行的結果。調用者可以根據錯誤碼采取相應的措施,這是一種靈活且適用于多種應用場景的錯誤處理方式。
" t" N2 L6 ^; O# N4 L對于有返回值的函數接口調用,錯誤碼包含了非常豐富的調試信息,當某個函數接口調用異常時,通常先根據錯誤碼進行有效分析。
) {: P/ h% N( Y7 D8 Z . y# [7 j7 P8 q$ I, \
3、中斷服務程序 (Interrupt Service Routines, ISR)
& W6 Q0 p0 a, t& q# y$ r  |0 S" W: X在嵌入式系統中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統在異常情況下仍能進入中斷服務程序進行相應處理。
. i# J( A2 F* N4 H3 T通常是CPU運行程序時,內部硬件或總線出現錯誤而觸發(fā)中斷,對于MCU應用可以使用 cm_backtrace 組件進行;厮菖挪,以發(fā)現錯誤發(fā)生的地方。/ F3 }* `& @9 C7 t+ W7 v/ Q6 ]
/ W9 X0 |2 [$ ?- {6 k( L) s
4、看門狗定時器 (Watchdog Timer)1 X+ U( f% B+ b' m3 f
看門狗定時器用于檢測和恢復系統故障,通?梢允褂肅PU的內部看門狗,或使用外部看門狗芯片,系統在正常運行時需要定期重置看門狗定時器。
5 L/ @- ^7 v' [' @1 Y如果某些錯誤原因,導致程序邏輯不能及時重置定時器(俗稱:喂狗),看門狗就會觸發(fā)系統軟復位或外部RST引腳復位,這有助于防止系統因軟件錯誤而陷入死循環(huán)。8 L7 X. s+ b0 ~6 p, x2 f2 F
$ w- V2 K9 ~& ?

5 I7 w; q) q3 h/ ?, W. R8 ~ 3 Z0 g! f  b0 L
5、日志記錄 (Logging)$ `9 w' N* d" @* G! e! [
在應用軟件運行時,如果產品上面有容量較大的非易失性存儲器,可以把運行時的錯誤日志記錄到存儲器里面。
: c9 F$ a/ N" |( M8 ~8 P7 U4 H記錄程序運行時的錯誤日志,這種方式有助于出錯時的調試和維護,開發(fā)人員不用時刻在機器旁邊進行程序運行監(jiān)視,存儲的錯誤日志還可以通過串口或調試接口輸出,這對于出現錯誤后的分析和問題解決非常重要。
7 b9 Y; B) i3 {6 Q3 [ & V! k& `" N3 K& A8 m! _5 C% F# B
6、錯誤傳遞9 B- \+ W/ t9 h, ]
C 語言通常使用返回值來標志函數是否執(zhí)行成功,調用者通過檢查返回值以判斷函數執(zhí)行情況。此外,也可以通過全局狀態(tài)標志或局部跳轉(goto)來處理錯誤。) F( _1 X4 X& O, n) e! u/ Z
對于goto語句需要謹慎使用,在局部函數內某個環(huán)節(jié)運行出錯,使用goto語句可以直接跳轉到錯誤處理節(jié)點,但大范圍使用goto跳轉,可能會破壞代碼的運行結構與完整性。
/ I$ l' N, F. F0 q. O; @4 p/ ^6 b& S
. _; v0 V, d1 i$ @) Y4 w
不同的錯誤處理機制,有對應不同的業(yè)務應用場景和系統要求,建議 C 語言程序開發(fā)者根據具體情況進行具體分析,沒有一概而論完美的方法。
. F% Z% g4 ]& E+ A% J但為了提升嵌入式系統整體的穩(wěn)定性和可靠性,在嵌入式 C 語言程序里面引入合適的錯誤處理機制,是非常值得且有必要的。6 q/ A  W% y' K4 X# [8 O
" |' |* ?- L7 P( k8 Y

8 f' O. i8 N- G& ^/ q
+ a+ [# L) C0 s0 P+ H3 L6 o; Q) q

" K5 h; g0 X. I. A-END-' g% @* c/ X0 l' A( f) i2 y
往期推薦:點擊圖片即可跳轉閱讀
: `; U+ d) ?2 b* l( S: u9 ?+ X! C

- S* Q- ~, q) P  P9 F9 {5 ^8 P                                                       
, [* u9 h6 A- B( o6 Y                                                               
) S- x& i! [1 p: z- L+ y/ b0 @! Z                                                                       
! B$ u9 z# s8 M% U                                                                               
$ L1 j* d( q. B! b) t* Z5 d; W + |" \& g7 M  U/ V( |/ r& t
                                                                               
) n. g. {2 l  O# N: H6 S                                                                                        有哪些不推薦使用的嵌入式 C 語言語法特性?
$ z9 y2 S; H6 n" ?, k1 e! `                                                       
( v6 p$ m% R# }9 C  c                                                               
" @1 i% v' p( A8 d                                                                        9 G4 b: ^$ b9 L3 _* d
                                                                                3 Z" t+ K$ R% k

9 z2 O" N1 R0 @3 X8 V                                                                               
8 E6 o* o8 ~; I0 Y2 ~                                                                                        今年快過完了,明年準備進廠搞嵌入式工控,提前了解各方行業(yè)信息!
* ?; ]  c0 H7 }                                                                , i  t4 }9 M8 c; _- h# s, Q
                                                                        % b4 |  L$ W" [$ X* P1 b
                                                                               
1 K! V7 b/ r9 S1 A% ?& ~* @) Q3 s
; d* C& t2 O" p' d9 u* O$ L                                                                               
( {" A+ E8 b1 y1 F                                                                                        基于全志T113-i平臺,嵌入式Linux 快速啟動,5.2秒成功進入應用界面!
* z. J& |& m- h                                                                               
7 }8 j7 r' P# l7 W                                                                       
& f# \4 E( C" q" b4 S- S4 ?9 j5 N! l                                                               
1 e* x5 V4 J1 E: F, v* `                                                        我是老溫,一名熱愛學習的嵌入式工程師
  t7 V& `) {& A2 [  h3 c& l關注我,一起變得更加優(yōu)秀!
回復

使用道具 舉報

發(fā)表回復

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

本版積分規(guī)則


聯系客服 關注微信 下載APP 返回頂部 返回列表