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