• 正文
    • 1、斷言 (Assertions)
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

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

2024/12/08
595
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

我是老溫,一名熱愛學(xué)習(xí)的嵌入式工程師

嵌入式軟件工程師在編寫 C 語言應(yīng)用程序的時候,經(jīng)常會遇到程序運行時跑飛的情況,程序運行時產(chǎn)生錯誤,多半是程序員在編寫代碼時,沒有預(yù)判好發(fā)生錯誤的地方,并且沒有設(shè)計好合適的錯誤處理機(jī)制。

在嵌入式C語言編程中,錯誤處理機(jī)制是確保系統(tǒng)穩(wěn)定性和可靠性的關(guān)鍵部分,能確保系統(tǒng)在已知的風(fēng)險和錯誤條件下正常運行。

以下分享一些常用的錯誤處理方法:

1、斷言 (Assertions)

斷言用于在開發(fā)階段捕獲程序中的邏輯錯誤。通過 assert 宏,可以在條件不滿足時終止程序并輸出錯誤信息,這有助于在開發(fā)階段及早發(fā)現(xiàn)問題。

強(qiáng)烈建議使用斷言機(jī)制對函數(shù)傳參的參數(shù)合法性進(jìn)行判斷,很多芯片SDK包的函數(shù)傳參都采用了有效的斷言機(jī)制,以防止參數(shù)不合法帶來不必要的麻煩。

2、錯誤碼 (Error Codes)

通過返回錯誤碼來指示函數(shù)執(zhí)行的結(jié)果。調(diào)用者可以根據(jù)錯誤碼采取相應(yīng)的措施,這是一種靈活且適用于多種應(yīng)用場景的錯誤處理方式。

對于有返回值的函數(shù)接口調(diào)用,錯誤碼包含了非常豐富的調(diào)試信息,當(dāng)某個函數(shù)接口調(diào)用異常時,通常先根據(jù)錯誤碼進(jìn)行有效分析。

3、中斷服務(wù)程序 (Interrupt Service Routines, ISR)

嵌入式系統(tǒng)中,中斷是處理異常情況的常用方法。ISR用于處理硬件中斷,并確保系統(tǒng)在異常情況下仍能進(jìn)入中斷服務(wù)程序進(jìn)行相應(yīng)處理。

通常是CPU運行程序時,內(nèi)部硬件或總線出現(xiàn)錯誤而觸發(fā)中斷,對于MCU應(yīng)用可以使用 cm_backtrace 組件進(jìn)行?;厮菖挪?,以發(fā)現(xiàn)錯誤發(fā)生的地方。

4、看門狗定時器 (Watchdog Timer)

看門狗定時器用于檢測和恢復(fù)系統(tǒng)故障,通??梢允褂肅PU的內(nèi)部看門狗,或使用外部看門狗芯片,系統(tǒng)在正常運行時需要定期重置看門狗定時器。

如果某些錯誤原因,導(dǎo)致程序邏輯不能及時重置定時器(俗稱:喂狗),看門狗就會觸發(fā)系統(tǒng)軟復(fù)位或外部RST引腳復(fù)位,這有助于防止系統(tǒng)因軟件錯誤而陷入死循環(huán)。

5、日志記錄 (Logging)

在應(yīng)用軟件運行時,如果產(chǎn)品上面有容量較大的非易失性存儲器,可以把運行時的錯誤日志記錄到存儲器里面。

記錄程序運行時的錯誤日志,這種方式有助于出錯時的調(diào)試和維護(hù),開發(fā)人員不用時刻在機(jī)器旁邊進(jìn)行程序運行監(jiān)視,存儲的錯誤日志還可以通過串口或調(diào)試接口輸出,這對于出現(xiàn)錯誤后的分析和問題解決非常重要。

6、錯誤傳遞

C 語言通常使用返回值來標(biāo)志函數(shù)是否執(zhí)行成功,調(diào)用者通過檢查返回值以判斷函數(shù)執(zhí)行情況。此外,也可以通過全局狀態(tài)標(biāo)志或局部跳轉(zhuǎn)(goto)來處理錯誤。

對于goto語句需要謹(jǐn)慎使用,在局部函數(shù)內(nèi)某個環(huán)節(jié)運行出錯,使用goto語句可以直接跳轉(zhuǎn)到錯誤處理節(jié)點,但大范圍使用goto跳轉(zhuǎn),可能會破壞代碼的運行結(jié)構(gòu)與完整性。

不同的錯誤處理機(jī)制,有對應(yīng)不同的業(yè)務(wù)應(yīng)用場景和系統(tǒng)要求,建議 C 語言程序開發(fā)者根據(jù)具體情況進(jìn)行具體分析,沒有一概而論完美的方法。

但為了提升嵌入式系統(tǒng)整體的穩(wěn)定性和可靠性,在嵌入式 C 語言程序里面引入合適的錯誤處理機(jī)制,是非常值得且有必要的。

相關(guān)推薦