硬故障屬于嵌入式開發(fā)里極為令人頭疼的系統(tǒng)級錯誤當中的一個,它表明CPU執(zhí)行了無效指令,或者訪問了無效內(nèi)存地址,一般會致使程序徹底死鎖,或者系統(tǒng)崩潰 。和能夠通過軟件重啟或者重置予以修復的“軟故障”不一樣,硬故障常常指向更深層次的硬件交互問題,或者嚴重的代碼缺陷,需要開發(fā)者擁有一定的調(diào)試技巧才能夠定位以及解決 。接下來,我會從幾個常見場景著手,幫你理解硬故障的成因以及應對方法 。

硬故障通常由什么原因引起

硬故障的直接帶來緣由每每是處理器去訪問了那個它不應該予以訪問的內(nèi)存部分區(qū)域。于Cortex - M這類嵌入式內(nèi)核其中,具體呈現(xiàn)為訪問到了MPU(內(nèi)存保護單元)所設置范圍之外的地址,朝著只讀區(qū)域?qū)懭霐?shù)據(jù),又或者在用戶模式之時嘗試訪問僅僅允許在特權模式之下才能夠操作的地址。另外一種常見的情景乃是堆棧遭到破壞,就像“野指針”有誤地覆蓋了堆棧數(shù)據(jù),致使函數(shù)返回之際跳轉(zhuǎn)到了一個無效的地址,進而引發(fā)出硬故障。在中斷處理進程里,當開展堆棧操作(也就是PUSH或者POP)之際,要是出現(xiàn)錯誤,就會引發(fā)被稱作“入棧錯誤”或者“出棧錯誤”這樣的情況,并且會向上呈報成為硬故障。

硬故障與軟故障的根本區(qū)別是什么

什么是硬故障_硬故障和軟故障_硬故障是指

根本區(qū)別存在于故障的可恢復性方面,以及根源的層面,軟故障一般來講是指軟件層面的功能出現(xiàn)異常,比如說應用程序發(fā)生崩潰,操作系統(tǒng)變成藍屏這一狀況,又好似“幽靈外賣”此類平臺處于運營時出現(xiàn)的亂象,這些問題通常不會直接對硬件底層產(chǎn)生影響,借助重啟的方式或者更新軟件存在恢復的可能性,而硬故障屬于硬件或固件層級出現(xiàn)的嚴重錯誤,是處理器自身檢測到的非法操作 。一個存在著近似情況的類比是電腦方面的“軟RAID”以及“硬RAID” ,軟RAID依靠操作系統(tǒng)驅(qū)動來運轉(zhuǎn) ,若系統(tǒng)出現(xiàn)崩潰狀況便有可能致使陣列失效 。硬RAID是由專用硬件卡實施管理操作的 ,即便對系統(tǒng)進行重裝 ,數(shù)據(jù)陣列依舊會存在于此 ,它所具備并且展現(xiàn)出來的可靠性以及對應具備的獨立性是更為突出的 。硬故障類似后者這種情況 ,它屬于更深層次 、更具“硬”性特點的底層方面的問題 。

如何調(diào)試和解決硬故障

對于調(diào)試硬故障的關鍵要點在于,要去獲取以及展開分析故障發(fā)生之際的現(xiàn)場信息。首先呢,得在硬故障中斷處理函數(shù)里頭,去讀取系統(tǒng)控制寄存器組當中的狀態(tài)寄存器,像是SCB->CFSR這個可配置故障狀態(tài)寄存器,還有SCB->HFSR這個硬故障狀態(tài)寄存器,這些寄存器能夠明確指出故障的類型到底是總線錯誤,亦或是存儲器管理錯誤,又或者是用法錯誤。其次,要展開查看操作,針對堆棧以及寄存器的內(nèi)容進行查看。依循調(diào)試器(像GDB這般)來核查SP(即堆棧指針)、PC(也就是程序計數(shù)器)以及R0 - R12等一眾通用寄存器的值,能夠回溯故障出現(xiàn)之前CPU的執(zhí)行路徑。舉例講,憑借反匯編PC所指向的地址,便可以定位到致使故障產(chǎn)生的具體代碼行。在預防層面,借助代碼靜態(tài)分析工具預先排查潛藏的內(nèi)存訪問錯誤以及未定義行為是頗具成效的手段。

當你調(diào)試著嵌入式系統(tǒng)之時,碰到最為棘手的一回硬故障是何等狀況,最終又是怎樣層層剖析尋覓到問題根源的呢,歡迎于評論區(qū)分享你自身的實戰(zhàn)經(jīng)驗,要是覺得此文對你存有幫助,同樣請點贊予以支持呀。

轉(zhuǎn)載請注明:文章轉(zhuǎn)載自 www.cangshiwang.com