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

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

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

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

[復(fù)制鏈接]

485

主題

485

帖子

1623

積分

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

Rank: 3Rank: 3

積分
1623
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-22 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師5 F9 S' u2 c) g+ k5 W+ F
關(guān)注我,一起變得更加優(yōu)秀!
: p, I" `; g( \# w% |5 m5 T嵌入式軟件工程師在編寫 C 語(yǔ)言應(yīng)用程序的時(shí)候,經(jīng)常會(huì)遇到程序運(yùn)行時(shí)跑飛的情況,程序運(yùn)行時(shí)產(chǎn)生錯(cuò)誤,多半是程序員在編寫代碼時(shí),沒(méi)有預(yù)判好發(fā)生錯(cuò)誤的地方,并且沒(méi)有設(shè)計(jì)好合適的錯(cuò)誤處理機(jī)制。* V. w! O+ U$ M0 H
在嵌入式C語(yǔ)言編程中,錯(cuò)誤處理機(jī)制是確保系統(tǒng)穩(wěn)定性和可靠性的關(guān)鍵部分,能確保系統(tǒng)在已知的風(fēng)險(xiǎn)和錯(cuò)誤條件下正常運(yùn)行。7 \: F- j+ Q7 L9 u+ }$ X# ?
以下分享一些常用的錯(cuò)誤處理方法:- r' X: N& j) L* }5 Z/ b' C% b
1、斷言 (Assertions)
  `' P! Y7 b# y7 G8 P) V5 z) I斷言用于在開發(fā)階段捕獲程序中的邏輯錯(cuò)誤。通過(guò) assert 宏,可以在條件不滿足時(shí)終止程序并輸出錯(cuò)誤信息,這有助于在開發(fā)階段及早發(fā)現(xiàn)問(wèn)題。
5 {5 ?2 m1 M, F$ a2 F強(qiáng)烈建議使用斷言機(jī)制對(duì)函數(shù)傳參的參數(shù)合法性進(jìn)行判斷,很多芯片的SDK包的函數(shù)傳參都采用了有效的斷言機(jī)制,以防止參數(shù)不合法帶來(lái)不必要的麻煩。3 s% E3 A$ X3 j' d- d1 e; |

, b0 f. g0 k9 K+ S2、錯(cuò)誤碼 (Error Codes)
, L, Q4 M1 _8 G通過(guò)返回錯(cuò)誤碼來(lái)指示函數(shù)執(zhí)行的結(jié)果。調(diào)用者可以根據(jù)錯(cuò)誤碼采取相應(yīng)的措施,這是一種靈活且適用于多種應(yīng)用場(chǎng)景的錯(cuò)誤處理方式。
: f" O: T1 J& y1 K% b& o2 [" Q對(duì)于有返回值的函數(shù)接口調(diào)用,錯(cuò)誤碼包含了非常豐富的調(diào)試信息,當(dāng)某個(gè)函數(shù)接口調(diào)用異常時(shí),通常先根據(jù)錯(cuò)誤碼進(jìn)行有效分析。
( ]0 N7 z" H; \* b . b2 F8 F9 I) O
3、中斷服務(wù)程序 (Interrupt Service Routines, ISR)$ z. ]" O6 ^1 j1 O* b/ Z
在嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在異常情況下仍能進(jìn)入中斷服務(wù)程序進(jìn)行相應(yīng)處理。  E: H* c+ I7 e6 [7 p# t$ ^, |
通常是CPU運(yùn)行程序時(shí),內(nèi)部硬件或總線出現(xiàn)錯(cuò)誤而觸發(fā)中斷,對(duì)于MCU應(yīng)用可以使用 cm_backtrace 組件進(jìn)行;厮菖挪椋园l(fā)現(xiàn)錯(cuò)誤發(fā)生的地方。
  r' k8 C: u- f  ?. R+ X; V
" r  s4 a8 a' c! @7 M+ K; u6 d4、看門狗定時(shí)器 (Watchdog Timer)  y7 H3 Z8 U) ^: Q  h. @9 W% F. `. u
看門狗定時(shí)器用于檢測(cè)和恢復(fù)系統(tǒng)故障,通?梢允褂肅PU的內(nèi)部看門狗,或使用外部看門狗芯片,系統(tǒng)在正常運(yùn)行時(shí)需要定期重置看門狗定時(shí)器。
9 g. I% c& _- H1 ^% P6 t  n如果某些錯(cuò)誤原因,導(dǎo)致程序邏輯不能及時(shí)重置定時(shí)器(俗稱:喂狗),看門狗就會(huì)觸發(fā)系統(tǒng)軟復(fù)位或外部RST引腳復(fù)位,這有助于防止系統(tǒng)因軟件錯(cuò)誤而陷入死循環(huán)。
3 E) G3 `+ I5 ]' b: i4 [ ' g+ u( S# W  Q0 T! ?: b8 K
5 N, P) l' F; \$ j

- [4 z6 u" @8 Y* ]. W4 h7 X! }6 u5、日志記錄 (Logging)5 J  |/ O5 T2 \; w3 p) v4 w% Q; Q
在應(yīng)用軟件運(yùn)行時(shí),如果產(chǎn)品上面有容量較大的非易失性存儲(chǔ)器,可以把運(yùn)行時(shí)的錯(cuò)誤日志記錄到存儲(chǔ)器里面。
+ m5 k; I2 ?/ z$ J記錄程序運(yùn)行時(shí)的錯(cuò)誤日志,這種方式有助于出錯(cuò)時(shí)的調(diào)試和維護(hù),開發(fā)人員不用時(shí)刻在機(jī)器旁邊進(jìn)行程序運(yùn)行監(jiān)視,存儲(chǔ)的錯(cuò)誤日志還可以通過(guò)串口或調(diào)試接口輸出,這對(duì)于出現(xiàn)錯(cuò)誤后的分析和問(wèn)題解決非常重要。: [& m0 Q6 i$ I- ~& \0 u
9 X: L5 S+ r6 g$ J# ?( `
6、錯(cuò)誤傳遞
1 c. j% s& \1 x' dC 語(yǔ)言通常使用返回值來(lái)標(biāo)志函數(shù)是否執(zhí)行成功,調(diào)用者通過(guò)檢查返回值以判斷函數(shù)執(zhí)行情況。此外,也可以通過(guò)全局狀態(tài)標(biāo)志或局部跳轉(zhuǎn)(goto)來(lái)處理錯(cuò)誤。$ _' E' w3 i& l7 |6 v1 z1 B
對(duì)于goto語(yǔ)句需要謹(jǐn)慎使用,在局部函數(shù)內(nèi)某個(gè)環(huán)節(jié)運(yùn)行出錯(cuò),使用goto語(yǔ)句可以直接跳轉(zhuǎn)到錯(cuò)誤處理節(jié)點(diǎn),但大范圍使用goto跳轉(zhuǎn),可能會(huì)破壞代碼的運(yùn)行結(jié)構(gòu)與完整性。& b/ e+ S& _+ G5 d0 _4 l

' P/ i: e1 x- `: U8 Y6 A: E
/ L5 D! [: }, }- }! W不同的錯(cuò)誤處理機(jī)制,有對(duì)應(yīng)不同的業(yè)務(wù)應(yīng)用場(chǎng)景和系統(tǒng)要求,建議 C 語(yǔ)言程序開發(fā)者根據(jù)具體情況進(jìn)行具體分析,沒(méi)有一概而論完美的方法。
; @; A: s5 ?" q- s5 e5 A4 }但為了提升嵌入式系統(tǒng)整體的穩(wěn)定性和可靠性,在嵌入式 C 語(yǔ)言程序里面引入合適的錯(cuò)誤處理機(jī)制,是非常值得且有必要的。
$ M9 p+ j% t; O1 E2 ^+ S5 z! C! v/ W4 i- P  D8 C
+ |" Y0 S0 C6 F4 ^/ l
' m- ~. w, g) n# X
( d7 L2 T, S+ f. I& l! g
-END-
4 j' K* Z  `' a; k% Z- F往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
3 J7 }8 T8 d+ _$ U( |9 _* M5 ~

2 q, T/ X& Y. ^, F# L4 ~: F                                                        9 ?: S+ h- L3 g3 b* D5 O
                                                                3 ~( s6 e2 P+ {9 {5 Z2 y, m3 `7 ?
                                                                        " @2 w2 u; ~8 @' X2 s' l
                                                                               
2 H* _+ F( f4 k
" M$ r: |6 [  |' c/ V                                                                               
" ?3 i& y, X7 ^  `7 Q                                                                                        有哪些不推薦使用的嵌入式 C 語(yǔ)言語(yǔ)法特性?
# }0 l( n9 L) |6 }6 J/ [; Q                                                        ) V; w8 e- _- s
                                                                , c2 W# ]1 V0 l) f! E- i
                                                                        ! O1 g( b" A  }) F! N( }
                                                                               
5 @2 K8 b2 J5 f+ i& V   g! P5 R$ k! j1 L8 ~
                                                                               
! f0 p4 z/ N/ K% q                                                                                        今年快過(guò)完了,明年準(zhǔn)備進(jìn)廠搞嵌入式工控,提前了解各方行業(yè)信息!
5 t7 I: T6 Y# _                                                                $ Y$ j* e* x# w8 X, H
                                                                       
( ]6 }  y9 A% b  u6 Z, i                                                                               
8 F! W( V6 ]5 @# @# [; `2 @" U" s! D
  ~& |) U3 X5 S7 q& ]                                                                                ; k5 B: y, X+ P8 a( d
                                                                                        基于全志T113-i平臺(tái),嵌入式Linux 快速啟動(dòng),5.2秒成功進(jìn)入應(yīng)用界面!
  I+ D- N1 e3 H                                                                                " ~: j" m1 N3 _% E
                                                                        , n( L6 O7 o9 H5 @5 u, w) j% ]7 u$ f
                                                               
  j6 z+ O% C! @" i  L                                                        我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師! H  B5 v- n+ v( D6 {. g2 L* t
關(guān)注我,一起變得更加優(yōu)秀!

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

本版積分規(guī)則


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