|
我是老溫,一名熱愛學習的嵌入式工程師( 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$ `
i0o3osqr4ge6408255906.png (260.54 KB, 下載次數: 2)
下載附件
保存到相冊
i0o3osqr4ge6408255906.png
2024-11-22 23:19 上傳
) 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
fuvhjjjbp5t6408256006.png (205.11 KB, 下載次數: 1)
下載附件
保存到相冊
fuvhjjjbp5t6408256006.png
2024-11-22 23:19 上傳
. 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 ]
zcpsk15dsqm6408256106.png (197.96 KB, 下載次數: 1)
下載附件
保存到相冊
zcpsk15dsqm6408256106.png
2024-11-22 23:19 上傳
/ 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
z0dknst4rml6408256206.png (154.54 KB, 下載次數: 3)
下載附件
保存到相冊
z0dknst4rml6408256206.png
2024-11-22 23:19 上傳
$ w- V2 K9 ~& ?
5 I7 w; q) q3 h/ ?, W. R8 ~
msxebyerfbk6408256306.png (54.33 KB, 下載次數: 3)
下載附件
保存到相冊
msxebyerfbk6408256306.png
2024-11-22 23:19 上傳
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 [
sjjqvifpmci6408256406.png (103.04 KB, 下載次數: 3)
下載附件
保存到相冊
sjjqvifpmci6408256406.png
2024-11-22 23:19 上傳
& 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
ljygacmdjg46408256507.png (162.13 KB, 下載次數: 1)
下載附件
保存到相冊
ljygacmdjg46408256507.png
2024-11-22 23:19 上傳
. _; 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
eejwfys2zzk6408256607.png (769.97 KB, 下載次數: 2)
下載附件
保存到相冊
eejwfys2zzk6408256607.png
2024-11-22 23:19 上傳
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
4kmx1fut2zg6408256707.jpg (118.39 KB, 下載次數: 1)
下載附件
保存到相冊
4kmx1fut2zg6408256707.jpg
2024-11-22 23:19 上傳
+ |" \& 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
yoici31rnup6408256807.jpg (219.91 KB, 下載次數: 1)
下載附件
保存到相冊
yoici31rnup6408256807.jpg
2024-11-22 23:19 上傳
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
ijnaykh4uoc6408256907.jpg (152.47 KB, 下載次數: 0)
下載附件
保存到相冊
ijnaykh4uoc6408256907.jpg
2024-11-22 23:19 上傳
; 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)秀! |
|