異常是能夠引起程序流偏離正常流程的事件,當(dāng)異常發(fā)生時(shí),正在執(zhí)行的程序就會(huì)被掛起,處理器轉(zhuǎn)而執(zhí)行一塊與該事件相關(guān)的代碼(異常處理)。事件可以是外部輸入,也可以是內(nèi)部產(chǎn)生的,外部產(chǎn)生的事件通常被稱(chēng)作中斷或中斷請(qǐng)求(IRQ)。幾乎所有的現(xiàn)代處理器都支持異常和中斷,微控制器的中斷可以由片上外設(shè)或軟件產(chǎn)生。由此可見(jiàn),通常我們處理的中斷是異常的一種。
每種異常類(lèi)型都有對(duì)應(yīng)的優(yōu)先級(jí),有些異常的優(yōu)先級(jí)是固定的,有些是可編程的。
先說(shuō)幾個(gè)概念:
1、不可屏蔽中斷(NMI)
NMI同IRQ類(lèi)似,只是它不能被禁止,并且優(yōu)先級(jí)僅次于復(fù)位,它對(duì)于工業(yè)控制和汽車(chē)之類(lèi)的高可靠性系統(tǒng)非常有用。根據(jù)微控制器設(shè)計(jì)的不同,NMI可以用于掉電處理,也可以連接到看門(mén)狗單元,以便在系統(tǒng)停止響應(yīng)時(shí)將系統(tǒng)復(fù)位。由于NMI不能被控制寄存器禁止,其響應(yīng)的及時(shí)性就得到了保證。
2、硬件錯(cuò)誤
硬件錯(cuò)誤異常用于處理程序執(zhí)行時(shí)產(chǎn)生的錯(cuò)誤,這些錯(cuò)誤可以是試圖執(zhí)行未知的操作碼、總線(xiàn)接口或存儲(chǔ)器系統(tǒng)的錯(cuò)誤,也可以是試圖切換至ARM狀態(tài)之類(lèi)的非法操作。
3、SVC(請(qǐng)求管理調(diào)用)
SVC指令執(zhí)行時(shí)就會(huì)產(chǎn)生SVC異常,其通常用在具有操作系統(tǒng)的系統(tǒng)中,為應(yīng)用程序提供了訪(fǎng)問(wèn)系統(tǒng)服務(wù)的入口。
4、PendSV(可掛起的系統(tǒng)調(diào)用)
PendSV是用于帶OS(操作系統(tǒng))的應(yīng)用程序的另外一個(gè)異常,SVC異常在SVC指令執(zhí)行后會(huì)馬上開(kāi)始,PendSV在這點(diǎn)上有所不同,它可以延遲執(zhí)行,在OS上使用PendSV就要確保高優(yōu)先級(jí)任務(wù)完成后才執(zhí)行系統(tǒng)調(diào)度。
5、系統(tǒng)節(jié)拍
NVIC中的SysTick定時(shí)器為OS應(yīng)用可以利用的另外一個(gè)特性。幾乎所有操作系統(tǒng)的運(yùn)行都需要上下文切換,而這一過(guò)程通常需要依靠定時(shí)器產(chǎn)生定時(shí)中斷來(lái)完成。
6、中斷
中斷信號(hào)可以連接到片上外設(shè),也可以通過(guò)IO端口連接到外部中斷源上。外部中斷只有在使能后才能使用,如果中斷被禁止了,或者處理器正在運(yùn)行另外一個(gè)相同或更高優(yōu)先級(jí)的異常處理,則該中斷請(qǐng)求會(huì)被存儲(chǔ)在掛起狀態(tài)寄存器中。當(dāng)高優(yōu)先級(jí)的中斷處理完成或返回后,掛起的中斷請(qǐng)求才可以執(zhí)行。NVIC能夠接受的中斷請(qǐng)求信號(hào)可以是高邏輯電平,也可以是中斷脈沖。應(yīng)該注意的是,在微控制器的外部接口中,外部中斷信號(hào)可以是高電平也可以是低電平,或者可以通過(guò)編程配置。
異常的處理流程:
1、接受異常請(qǐng)求
處理器要接受一個(gè)異常,需要滿(mǎn)足的條件:
①對(duì)于中斷和SysTick中斷請(qǐng)求,中斷必須使能
②處理器正在執(zhí)行的異常處理的優(yōu)先級(jí)不能相同或更大
③中斷屏蔽寄存器沒(méi)有屏蔽掉異常
特別注意一點(diǎn):對(duì)于SVC異常,如果用到SVC指令的異常處理的優(yōu)先級(jí)與SVC異常本身相同或更大,這種情況就會(huì)引起硬件錯(cuò)誤異常處理的執(zhí)行。
2、壓棧和出棧
為了使被中斷的程序能正確繼續(xù)執(zhí)行,在程序切換至異常處理前,處理器當(dāng)前狀態(tài)的一部分應(yīng)該被保存。不同架構(gòu)處理器的處理方法不同,有的采用硬件自動(dòng)處理的方法來(lái)備份和恢復(fù)處理器狀態(tài),看需求,有的是需要程序中增加軟件處理過(guò)程。
異常處理過(guò)程執(zhí)行到最后時(shí),將會(huì)利用執(zhí)行特殊值來(lái)觸發(fā)異常返回機(jī)制。處理器還會(huì)查看當(dāng)前是否還有其他異常需要處理,如果沒(méi)有,處理器就會(huì)恢復(fù)之前存儲(chǔ)在棧空間的寄存器值,并繼續(xù)執(zhí)行中斷前的程序。
自動(dòng)保存和恢復(fù)寄存器內(nèi)容的操作被稱(chēng)為“壓?!焙汀俺鰲!保@種機(jī)制使得異常處理可以跟普通的C函數(shù)一樣處理,同時(shí)也減小了軟件開(kāi)銷(xiāo)以及回路大小,因此也降低了系統(tǒng)的功耗。
3、異常返回指令
根據(jù)處理器的不同中斷處理返回有的需要特殊指令,一般都是普通的返回指令,加載到PC中的數(shù)值則會(huì)觸發(fā)異常返回,這樣就使得異常處理可以和普通的C函數(shù)一樣使用。
兩個(gè)不同的指令可以用于異常返回:
BX 《Reg》q ;將寄存器中的值加載到PC中
或
POP {《Reg1》,《Reg1》,。..,PC} ;POP指令,PC也是更新的寄存器之一
當(dāng)其中一個(gè)指令執(zhí)行,異常返回機(jī)制就會(huì)啟動(dòng)。
4、末尾連鎖
如果當(dāng)其他的異常處理完成后,還有異常處于掛起狀態(tài),這時(shí)處理器不會(huì)返回到中斷前的程序,而是重新進(jìn)入異常處理流程,這也被稱(chēng)作末尾連鎖。當(dāng)末尾連鎖發(fā)生時(shí),處理器不必馬上恢復(fù)棧的值,因?yàn)槿绻@么做的話(huà)還得重新壓棧。異常的末尾連鎖降低了異常處理的開(kāi)銷(xiāo),因此也提高了能耗效率。
責(zé)任編輯:haq
-
寄存器
+關(guān)注
關(guān)注
31文章
5401瀏覽量
122808 -
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
70025 -
異常
+關(guān)注
關(guān)注
0文章
23瀏覽量
9321
原文標(biāo)題:異常和中斷
文章出處:【微信號(hào):gh_e7f294a514ca,微信公眾號(hào):?jiǎn)纹瑱C(jī)匠人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
常見(jiàn)處理器故障及解決方法
串口中斷是內(nèi)部中斷還是外部中斷,串口中斷是怎么觸發(fā)的
量子處理器是什么_量子處理器原理
EE-192:使用C語(yǔ)言在Blackfin處理器上創(chuàng)建中斷驅(qū)動(dòng)系統(tǒng)

串口通訊異常處理方法 串口設(shè)備連接方式
OMAP5912多媒體處理器中斷參考指南

對(duì)稱(chēng)多處理器和非對(duì)稱(chēng)多處理器的區(qū)別
微處理器中寄存器的作用
ARM處理器的工作模式和特點(diǎn)
ARM處理器的異常中斷響應(yīng)過(guò)程
ARM處理器和CISC處理器的區(qū)別
嵌入式C編程常用的異常錯(cuò)誤處理

評(píng)論