在ARM處理器中,如果一個(gè)程序產(chǎn)生了錯(cuò)誤并且被處理器檢測(cè)到,這是就會(huì)產(chǎn)生錯(cuò)誤異常。
錯(cuò)誤是怎么發(fā)生的呢?
許多可能的原因都會(huì)引起錯(cuò)誤發(fā)生,比如對(duì)于存儲(chǔ)器相關(guān)錯(cuò)誤,總線系統(tǒng)的異常響應(yīng)可以有以下原因:
訪問(wèn)的地址非法;
由于傳輸?shù)念愋头欠?,總線的從設(shè)備不接受此次傳輸(從設(shè)備決定)
由于傳輸未使能或初始化,總線的從設(shè)備無(wú)法進(jìn)行此次傳輸(例如,如果外設(shè)的時(shí)鐘被關(guān)閉,那么訪問(wèn)這個(gè)外設(shè)時(shí),微控制器就可能會(huì)產(chǎn)生錯(cuò)誤響應(yīng))。
當(dāng)確定了硬件錯(cuò)誤異常的直接原因以后,我們可能還得花費(fèi)一些時(shí)間來(lái)確定問(wèn)題的根源。例如,總線錯(cuò)誤可以由很多種情況引發(fā),例如錯(cuò)誤的指針操作、??臻g損壞、內(nèi)存溢出、非法存儲(chǔ)器映射以及其他原因。
分析錯(cuò)誤
根據(jù)錯(cuò)誤類型的不同,通常能夠直接確定引起硬件錯(cuò)誤異常的指令的位置。要實(shí)現(xiàn)這個(gè)目的,就需要知道進(jìn)入硬件錯(cuò)誤異常時(shí)的寄存器的內(nèi)容,以及異常處理前壓入棧中的寄存器的內(nèi)容。這些值中包含了程序返回地址,通過(guò)它也能知道引起錯(cuò)誤的指令地址。
如果使用了調(diào)試器,那么可在工程中創(chuàng)建硬件錯(cuò)誤異常處理,并且在其中添加一個(gè)用以暫停處理器的斷點(diǎn)指令;或者也可以在硬件錯(cuò)誤異常處理的開(kāi)始部分設(shè)置一個(gè)斷點(diǎn),這樣當(dāng)硬件錯(cuò)誤發(fā)生時(shí),處理器就會(huì)自動(dòng)暫停。在處理器由于硬件錯(cuò)誤暫停后,我們就可以嘗試著按照下面圖的流程對(duì)錯(cuò)誤進(jìn)行定位。
為了給分析提供更多的信息,也可以生成程序映像的匯編代碼,并且利用在棧幀中找到的PC值確定錯(cuò)誤的位置。如果錯(cuò)誤的地址為存儲(chǔ)器訪問(wèn)指令,就應(yīng)該檢查寄存器的值確定存儲(chǔ)器訪問(wèn)的地址是否合法。除了檢查地址范圍,也應(yīng)該確認(rèn)存儲(chǔ)器的地址是否正確地對(duì)齊。
除了壓入棧中的PC值(返回地址),棧幀中也包含了其他有助于調(diào)試的寄存器值。例如,壓入棧的IPSR能夠反映處理器是否在進(jìn)行異常處理,EPSR則代表了處理器狀態(tài)(EPSR的T位為0,則表示錯(cuò)誤由意外切換至ARM狀態(tài)引起)。
棧中的LR也可能會(huì)提供一些信息,例如發(fā)生錯(cuò)誤的函數(shù)的返回地址,錯(cuò)誤是否發(fā)生在異常處理中,以及EXC_RETURN的值是否被異常破壞等。
另外,當(dāng)前的寄存器值也可以提供有助于定位錯(cuò)誤原因的各種信息,除了當(dāng)前棧指針的值,當(dāng)前的鏈接寄存器的值也可能有幫助。如果LR中為非法的EXC_RETURN的值,這就意味著它在前面異常處理中被錯(cuò)誤地修改了。
CONTROL寄存器也可以提供幫助。在沒(méi)有OS的簡(jiǎn)單應(yīng)用程序中,進(jìn)程棧指針(PSP)不會(huì)被用到,并且CONTROL寄存器會(huì)一直保持為0。如果CONTROL寄存器被設(shè)置為0x2(PSP用于線程狀態(tài)),這就意味著LR在之前的異常處理中被錯(cuò)誤地修改了,或者棧內(nèi)容被破壞導(dǎo)致了EXC_RETURN的值錯(cuò)誤。
編輯:jq
-
寄存器
+關(guān)注
關(guān)注
31文章
5433瀏覽量
124263 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7647瀏覽量
167165 -
ARM處理器
+關(guān)注
關(guān)注
6文章
361瀏覽量
42593
原文標(biāo)題:?jiǎn)纹瑱C(jī)的異常處理
文章出處:【微信號(hào):gh_e7f294a514ca,微信公眾號(hào):?jiǎn)纹瑱C(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
機(jī)器學(xué)習(xí)異常檢測(cè)實(shí)戰(zhàn):用Isolation Forest快速構(gòu)建無(wú)標(biāo)簽異常檢測(cè)系統(tǒng)

深入探討試驗(yàn)機(jī)數(shù)據(jù)采集系統(tǒng)在力學(xué)試驗(yàn)室中發(fā)揮的作用

深入探討DeepSeek大模型的核心技術(shù)

數(shù)碼管和單片機(jī)的連接方式
什么是單片機(jī)的ADC接口
單片機(jī)中斷技術(shù)詳解
單片機(jī)I/O接口的傳輸方式
深入探討Linux系統(tǒng)中的動(dòng)態(tài)鏈接庫(kù)機(jī)制

單片機(jī)的中斷機(jī)制
單片機(jī)異常復(fù)位的原因
便宜的單片機(jī)-英銳恩ENMCU系列OTP單片機(jī)
單片機(jī)SPI通信實(shí)現(xiàn)
深入探討Linux的進(jìn)程調(diào)度器

一文讀懂什么單片機(jī):組成結(jié)構(gòu)與應(yīng)用

評(píng)論