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

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

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

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

[復(fù)制鏈接]

462

主題

462

帖子

1055

積分

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

Rank: 3Rank: 3

積分
1055
跳轉(zhuǎn)到指定樓層
樓主
我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師1 _% K3 R4 U/ Y3 w% I  a
關(guān)注我,一起變得更加優(yōu)秀!
8 d0 v! M5 b; g7 q6 o: o嵌入式軟件工程師在編寫 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/ @2 L  q: _  s+ H
在嵌入式C語(yǔ)言編程中,錯(cuò)誤處理機(jī)制是確保系統(tǒng)穩(wěn)定性和可靠性的關(guān)鍵部分,能確保系統(tǒng)在已知的風(fēng)險(xiǎn)和錯(cuò)誤條件下正常運(yùn)行。& z- U0 y+ I0 d
以下分享一些常用的錯(cuò)誤處理方法:5 E& Y. ~7 v& j) u7 e9 J: c
1、斷言 (Assertions)
8 I+ C3 R* ^( o+ \) R, Z' c, c斷言用于在開發(fā)階段捕獲程序中的邏輯錯(cuò)誤。通過(guò) assert 宏,可以在條件不滿足時(shí)終止程序并輸出錯(cuò)誤信息,這有助于在開發(fā)階段及早發(fā)現(xiàn)問(wèn)題。
5 _0 \! [) ~. Z4 `8 `. B1 q2 i強(qiáng)烈建議使用斷言機(jī)制對(duì)函數(shù)傳參的參數(shù)合法性進(jìn)行判斷,很多芯片的SDK包的函數(shù)傳參都采用了有效的斷言機(jī)制,以防止參數(shù)不合法帶來(lái)不必要的麻煩。
- V$ J0 E. n: k& `   Z% L, j$ _# P
2、錯(cuò)誤碼 (Error Codes)
% r1 `- a; C# y/ g6 W3 k% V通過(guò)返回錯(cuò)誤碼來(lái)指示函數(shù)執(zhí)行的結(jié)果。調(diào)用者可以根據(jù)錯(cuò)誤碼采取相應(yīng)的措施,這是一種靈活且適用于多種應(yīng)用場(chǎng)景的錯(cuò)誤處理方式。
& B7 L% E- n" V對(duì)于有返回值的函數(shù)接口調(diào)用,錯(cuò)誤碼包含了非常豐富的調(diào)試信息,當(dāng)某個(gè)函數(shù)接口調(diào)用異常時(shí),通常先根據(jù)錯(cuò)誤碼進(jìn)行有效分析。
8 d2 A: L3 X! K, t0 h& }
/ q; E- [7 ]& `7 X- o4 D- Q' u3、中斷服務(wù)程序 (Interrupt Service Routines, ISR)
/ T, i6 _7 N" L6 `8 z+ z- E在嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在異常情況下仍能進(jìn)入中斷服務(wù)程序進(jìn)行相應(yīng)處理。( Z- }7 G; i# w6 `, |8 E9 u
通常是CPU運(yùn)行程序時(shí),內(nèi)部硬件或總線出現(xiàn)錯(cuò)誤而觸發(fā)中斷,對(duì)于MCU應(yīng)用可以使用 cm_backtrace 組件進(jìn)行棧回溯排查,以發(fā)現(xiàn)錯(cuò)誤發(fā)生的地方。
. }- k8 j0 L: L. \" V
! n3 w" ~; K) P0 e4 X4 O5 ~4、看門狗定時(shí)器 (Watchdog Timer)
- _' C) n: S% N2 _% w看門狗定時(shí)器用于檢測(cè)和恢復(fù)系統(tǒng)故障,通?梢允褂肅PU的內(nèi)部看門狗,或使用外部看門狗芯片,系統(tǒng)在正常運(yùn)行時(shí)需要定期重置看門狗定時(shí)器。
/ v$ L( [) Y" a3 v如果某些錯(cuò)誤原因,導(dǎo)致程序邏輯不能及時(shí)重置定時(shí)器(俗稱:喂狗),看門狗就會(huì)觸發(fā)系統(tǒng)軟復(fù)位或外部RST引腳復(fù)位,這有助于防止系統(tǒng)因軟件錯(cuò)誤而陷入死循環(huán)。: M" A' {& Y: r! D

3 D' {- I$ F" \5 ~
3 z( g6 W2 N$ v9 r 6 \1 P) B! M5 v; f  c
5、日志記錄 (Logging)
# |' h0 U( v* ]" ^在應(yīng)用軟件運(yùn)行時(shí),如果產(chǎn)品上面有容量較大的非易失性存儲(chǔ)器,可以把運(yùn)行時(shí)的錯(cuò)誤日志記錄到存儲(chǔ)器里面。4 S. d" F, N6 A& {, Y
記錄程序運(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)題解決非常重要。
( c( m) d9 w0 `3 b5 G" f
& {% X+ ^7 i- W6 F8 y0 ?3 }5 z6、錯(cuò)誤傳遞
' P6 i' P) r$ n! W1 bC 語(yǔ)言通常使用返回值來(lái)標(biāo)志函數(shù)是否執(zhí)行成功,調(diào)用者通過(guò)檢查返回值以判斷函數(shù)執(zhí)行情況。此外,也可以通過(guò)全局狀態(tài)標(biāo)志或局部跳轉(zhuǎn)(goto)來(lái)處理錯(cuò)誤。6 c6 u8 T6 A0 P" a
對(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)與完整性。
' x( n+ U: Y' U8 \& s, m; _2 l. T7 G% a" W5 [  Z7 R

: z: G* g6 |, Y4 H8 m+ o7 q不同的錯(cuò)誤處理機(jī)制,有對(duì)應(yīng)不同的業(yè)務(wù)應(yīng)用場(chǎng)景和系統(tǒng)要求,建議 C 語(yǔ)言程序開發(fā)者根據(jù)具體情況進(jìn)行具體分析,沒(méi)有一概而論完美的方法。$ v0 Y! Y$ M- j  R4 e- e- b
但為了提升嵌入式系統(tǒng)整體的穩(wěn)定性和可靠性,在嵌入式 C 語(yǔ)言程序里面引入合適的錯(cuò)誤處理機(jī)制,是非常值得且有必要的。$ I2 P0 H% t- n% Z
$ f% F6 P5 p$ z+ k

; y' i: @3 f' i+ b: j0 T9 M
* G9 n) @. e& p& z: E) {. Q: s

- q& [. z# w! E* `1 ]-END-
' x+ x( W6 C9 T# K5 E  x往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
/ N. F. ]' w  Y- [$ a

6 O+ t" S  _, B# k0 F6 H9 }                                                        8 F+ C1 n6 g# r1 j, C
                                                               
, A  y9 t, k1 ?8 b9 W7 P                                                                       
, r" F+ h+ p& W" m9 s                                                                               
( _5 I1 M2 `/ F8 I6 F/ s8 |! v1 k 2 @% G* f* Q: A
                                                                                1 p# v! Z3 L& {
                                                                                        有哪些不推薦使用的嵌入式 C 語(yǔ)言語(yǔ)法特性?* ^9 u9 g% W; U& O7 D, N
                                                       
* s+ Q1 B* U% j* H4 ~! r# h                                                               
8 X3 g# K  u4 t                                                                       
6 x- X2 W* t& L' W" f0 c                                                                                0 `9 ~9 U6 {% a4 a: f0 \7 f" ^- i

7 D3 W( Y4 \. d1 g' R! L! }& Q' D                                                                               
2 E6 l2 v" V: j9 U                                                                                        今年快過(guò)完了,明年準(zhǔn)備進(jìn)廠搞嵌入式工控,提前了解各方行業(yè)信息!3 a# Q, j' y7 i# q/ d
                                                               
$ D2 d% k: Y# L6 g9 i                                                                        1 R1 E& Q5 Z. o2 d* H4 I7 B2 Q
                                                                                * o& ]6 K  E7 ~

- F7 W) n) o" u4 g$ h6 ]                                                                                " s2 H0 ^4 f  V, f& v* [, v
                                                                                        基于全志T113-i平臺(tái),嵌入式Linux 快速啟動(dòng),5.2秒成功進(jìn)入應(yīng)用界面!: S% f- Y5 L# \$ [
                                                                                . |, F" ^# I& c
                                                                       
- i& D7 v7 D! a0 x% |5 f3 ^; o                                                               
6 V+ @$ o/ _1 }" _8 }8 `6 w0 f. S                                                        我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師4 s" R% u5 q* \' Q; {. \1 h: w
關(guān)注我,一起變得更加優(yōu)秀!

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

本版積分規(guī)則


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