ARM體系設(shè)計(jì)有八種異常,并把所有現(xiàn)象用異常來(lái)表達(dá),我們的代碼任何時(shí)刻都在這八種異常中運(yùn)行。
我們給開(kāi)發(fā)板上電,這就是一種"異常",這種異常用"Reset"來(lái)表示。
這八種異常對(duì)應(yīng)八個(gè)地址:
Reset(復(fù)位)=========0x00000000(當(dāng)上電,或按下開(kāi)發(fā)板的復(fù)位鍵時(shí),程序跳到該地址運(yùn)行)
Undef(未定義指令)=========0x00000004(當(dāng)程序指針訪問(wèn)地址出現(xiàn)未定義指令,程序跳到該地址運(yùn)行)
SWI(軟件中斷)=========0x00000008(當(dāng)發(fā)生軟件中斷,程序跳到該地址運(yùn)行)
Prefetch Abort(預(yù)取指中止)=========0x0000000C(當(dāng)預(yù)取值失敗,程序跳到該地址運(yùn)行)
Data Abort(數(shù)據(jù)中止)=========0x00000010(當(dāng)訪問(wèn)數(shù)據(jù)區(qū)失敗,程序跳到該地址運(yùn)行)
Reserved(保留)===========0x00000014
IRQ===========0x00000018(當(dāng)發(fā)生IRQ中斷時(shí),程序跳到該地址運(yùn)行)
FIQ(快速中斷)========0x0000001C(當(dāng)發(fā)生快速中斷時(shí),程序跳到該地址運(yùn)行)
5.2 FIQ中斷,向量IRQ,非向量IRQ區(qū)別
FIQ是指快速中斷請(qǐng)求(FastInterruptreQuest),具有最高優(yōu)先級(jí),一般只聲明一個(gè)中斷源為FIQ,這樣可以得到最快的相應(yīng)速度,如果非要申請(qǐng)多個(gè)中斷源為FIQ,那么當(dāng)中斷發(fā)生時(shí),F(xiàn)IQ中斷線程通過(guò)讀取FIQ狀態(tài)寄存器來(lái)判斷當(dāng)前發(fā)生的是那個(gè)中斷。 向量IRQ(Vector IRQ)是指向量中斷請(qǐng)求(Vector InterruptReQuest)。具有次高優(yōu)先級(jí)。
非向量IRQ(NO_Vector IRQ)是指非向量中斷請(qǐng)求。具有最低優(yōu)先級(jí)。
5.2.1 向量中斷與非向量中斷的區(qū)別
向量,即指有方向的量。這里所說(shuō)的方向就是向量地址。
向量中斷--由硬件提供中斷服務(wù)程序入口地址;
非向量中斷--由軟件件提供中斷服務(wù)程序入口地址。
上面提到的中斷向量表:
Reset中斷向量地址是0x00000000,那么當(dāng)復(fù)位中斷發(fā)生時(shí),程序自動(dòng)跳到0x00000000開(kāi)始的地址執(zhí)行。這一過(guò)程由硬件實(shí)現(xiàn)。
當(dāng)定時(shí)器中斷發(fā)生時(shí),程序自動(dòng)跳到0x00000018開(kāi)始的位置執(zhí)行。因?yàn)樵摰刂肥荌RQ地址,IRQ不同于Reset,Reset只有一個(gè),但I(xiàn)RQ有很多個(gè)。所以,程序跳到0x00000018時(shí)還要進(jìn)行分支選擇,那么怎么選擇呢?
最開(kāi)始,0x00000018是從VICVectAddr寄存器中找到當(dāng)前中斷服務(wù)程序地址執(zhí)行的,那么向量中斷和非向量中斷,該選哪個(gè)呢?
ARM中斷核(PrimeCell)規(guī)定所有"非向量中斷"共用到"默認(rèn)向量地址寄存器"中 同時(shí)規(guī)定,"向量中斷"地址保存在"向量地址寄存器0-15"中 所以,當(dāng)IRQ中斷發(fā)生時(shí),ARM中斷核(PrimeCell)會(huì)到16個(gè)IRQsolt中查找,如果沒(méi)有找到則裝載"默認(rèn)向量地址寄存器"中的地址到"向量地址寄存器"中。 其實(shí),可以把非向量中斷理解成優(yōu)先級(jí)最低的向量中斷,因?yàn)樵贏RM中斷核(PrimeCell)從"向量地址寄存器"讀取地址時(shí),是先掃描(Scan)整個(gè)IRQslot,如果沒(méi)有找到則無(wú)條件的裝載"默認(rèn)向量地址寄存器"的值。這個(gè)值就是非向量IRQ中斷服務(wù)程序入口地址。
可以這么理解,向量IRQ有16個(gè)地址,而非向量IRQ只有一個(gè)地址。
疑問(wèn):可以設(shè)置多個(gè)非向量IRQ嗎,怎么設(shè)置,中斷發(fā)生后怎么處理?
答案:可以同時(shí)設(shè)置兩個(gè)(兩個(gè)以上)的非向量IRQ,但是這些非向量IRQ共用一個(gè)中斷服務(wù)程序入口地址,但中斷發(fā)生后,由軟件通過(guò)IRQ狀態(tài)寄存器判斷當(dāng)前發(fā)生的哪個(gè)IRQ中斷。(IRQ狀態(tài)寄存器不區(qū)分是向量IRQ還是非向量IRQ)
|