在ARM處理器中,如果一個程序產(chǎn)生了錯誤并且被處理器檢測到,這是就會產(chǎn)生錯誤異常。
錯誤是怎么發(fā)生的呢?
許多可能的原因都會引起錯誤發(fā)生,比如對于存儲器相關錯誤,總線系統(tǒng)的異常響應可以有以下原因:
訪問的地址非法;
由于傳輸?shù)念愋头欠ǎ偩€的從設備不接受此次傳輸(從設備決定)
由于傳輸未使能或初始化,總線的從設備無法進行此次傳輸(例如,如果外設的時鐘被關閉,那么訪問這個外設時,微控制器就可能會產(chǎn)生錯誤響應)。
當確定了硬件錯誤異常的直接原因以后,我們可能還得花費一些時間來確定問題的根源。例如,總線錯誤可以由很多種情況引發(fā),例如錯誤的指針操作、??臻g損壞、內(nèi)存溢出、非法存儲器映射以及其他原因。
分析錯誤
根據(jù)錯誤類型的不同,通常能夠直接確定引起硬件錯誤異常的指令的位置。要實現(xiàn)這個目的,就需要知道進入硬件錯誤異常時的寄存器的內(nèi)容,以及異常處理前壓入棧中的寄存器的內(nèi)容。這些值中包含了程序返回地址,通過它也能知道引起錯誤的指令地址。
如果使用了調(diào)試器,那么可在工程中創(chuàng)建硬件錯誤異常處理,并且在其中添加一個用以暫停處理器的斷點指令;或者也可以在硬件錯誤異常處理的開始部分設置一個斷點,這樣當硬件錯誤發(fā)生時,處理器就會自動暫停。在處理器由于硬件錯誤暫停后,我們就可以嘗試著按照下面圖的流程對錯誤進行定位。
為了給分析提供更多的信息,也可以生成程序映像的匯編代碼,并且利用在棧幀中找到的PC值確定錯誤的位置。如果錯誤的地址為存儲器訪問指令,就應該檢查寄存器的值確定存儲器訪問的地址是否合法。除了檢查地址范圍,也應該確認存儲器的地址是否正確地對齊。
除了壓入棧中的PC值(返回地址),棧幀中也包含了其他有助于調(diào)試的寄存器值。例如,壓入棧的IPSR能夠反映處理器是否在進行異常處理,EPSR則代表了處理器狀態(tài)(EPSR的T位為0,則表示錯誤由意外切換至ARM狀態(tài)引起)。
棧中的LR也可能會提供一些信息,例如發(fā)生錯誤的函數(shù)的返回地址,錯誤是否發(fā)生在異常處理中,以及EXC_RETURN的值是否被異常破壞等。
另外,當前的寄存器值也可以提供有助于定位錯誤原因的各種信息,除了當前棧指針的值,當前的鏈接寄存器的值也可能有幫助。如果LR中為非法的EXC_RETURN的值,這就意味著它在前面異常處理中被錯誤地修改了。
CONTROL寄存器也可以提供幫助。在沒有OS的簡單應用程序中,進程棧指針(PSP)不會被用到,并且CONTROL寄存器會一直保持為0。如果CONTROL寄存器被設置為0x2(PSP用于線程狀態(tài)),這就意味著LR在之前的異常處理中被錯誤地修改了,或者棧內(nèi)容被破壞導致了EXC_RETURN的值錯誤。
編輯:jq
-
寄存器
+關注
關注
31文章
5503瀏覽量
128184 -
存儲器
+關注
關注
39文章
7697瀏覽量
170304 -
ARM處理器
+關注
關注
6文章
361瀏覽量
43056
原文標題:單片機的異常處理
文章出處:【微信號:gh_e7f294a514ca,微信公眾號:單片機匠人】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
電源電路焊接上單片機后電壓異常,看看這是什么問題?
什么單片機比較耐用
怎么測單片機系統(tǒng)頻率
單片機怎么驅(qū)動電機?
單片機怎么燒程序
單片機定制開發(fā)的設計思路
給予單片機的溫度控制系統(tǒng)設計
機器學習異常檢測實戰(zhàn):用Isolation Forest快速構建無標簽異常檢測系統(tǒng)
深入探討試驗機數(shù)據(jù)采集系統(tǒng)在力學試驗室中發(fā)揮的作用
深入探討DeepSeek大模型的核心技術
數(shù)碼管和單片機的連接方式
什么是單片機的ADC接口
單片機中斷技術詳解
單片機I/O接口的傳輸方式
深入探討Linux系統(tǒng)中的動態(tài)鏈接庫機制

深入探討單片機異常處理
評論