某個中斷源產生中斷時,由硬件直接跳到中斷服務程序的入口(有些cpu,如s3c440box內部有外部中斷的中斷向量表,因而支持矢量中斷,而S3C2440等沒有硬件向量表,不支持矢量中斷。固定中斷向量表中裝的不是中斷或異常服務程序的入口地址,而是一條轉到異常或中斷處理程序的轉移指令 硬件中斷向量表 軟件中斷向量表:在ram區的_ISR_STARTADDRESS處開辟一段空間,設置一張軟件設定的中斷向量表,用來存放中斷和異常的服務程序入口地址。
非矢量中斷 產生中斷源時,先跳到一個總入口,再有軟件查詢中斷掛起寄存器判斷是哪個中斷源,然后跳到入口服務程序。例如;arm接受到中斷控制器的IRQ請求,cpu響應中斷后,將在中斷服務寄存器的對應位置位,cpu轉到0x18處執行。在0x18處,放置一條轉移指令: B ISR_IRQ ISR_IRQ為中斷服務程序的總入口地址,也是非矢量中斷模式的中斷源判別及散轉程序。在ISR_IRQ中通過查詢中斷服務寄存器的對應位判別出中斷源,然后轉至對應的中斷服務程序。 ISR_IRQ:
STMDB R13!,{R0-R8,R12,R14} 此處的R14用于異常返回
BL IRQ LDMIA R13!,{ R0-R8,R12,R14};恢復現場 SUBS PC,R14,#4;返回中斷斷點處繼續執行(CPSR 也自動恢復) IRQ: SUB SP,SP,#4;騰出一個字以存放中斷服務程序入口地址 STMFD SP!,{R8-R9};
LDR R9,=I_ISPR;中斷服務寄存器地址送到R9 LDR R9,[R9];ISPR 的內容送r9 MOV R8,#0;設置r8為地址偏移量,并初始化為0
10: BCS 11 ADD R8,R8,#4 B 10
11: ; HANDLEADC EQU _ISR_STARTADDRESS+4*8 ADD R9,R9,R8 LDR R9,[R9];將相應的中斷服務程序入口地址送R9 STR R9,[SP,#8];中斷服務程序入口入棧 LDMFD SP! ,{R8-R9,PC};轉向執行中斷服務程序 中斷服務程序運行完畢,則返回到標記出,回到原來斷點繼續執行(中斷服務程序中已經完成了返回到BL后一條指令的操作)相當于發生了兩級跳轉!
如果采用向量中斷模式,cpu發生異常或響應或中斷源后,將轉到硬件固有中斷向量表,自動轉入相應的一次或中斷向量地址處執行。以ENIT 4567為例 0x30:LDR PC,=HANDLERENT4567 ............ HANDLERENT4567: HANDLER HANDLEEINT4567; HANDLEEINT4567為軟件設定的中斷向量中中斷入口的地址標號 HANDLER 宏的作用:將HANDLEEINT4567的內容賦給PC MACRO HANDLER HANDLELABEL SUB SP,SP,#4 STMFD SP!,{R0} LDR R0,=HANDLELABEL LDR R0,[R0] STR R0,[SP,#4] LDMFD SP!,{R0,PC} ENDM
中斷及異常的響應過程 程序裝在ROM中斷中斷和異常相應情況: 對于簡單的應用系統,通常將初始化和應用程序下載在0x0處,即在ROM或flash中,在硬件固定向量表中斷對應位置放置轉移指令,轉到相應異常或中斷服務程序進行處理。 由于RAM區程序執行速度快,而且可以修改,所以對于大多數系統和復雜程序,通常將具體的異常或中斷處理程序下載到RAM區執行。
程序裝在高端RAM中斷中斷或異常響應
(1) 若程序下載到高端RAM,當異常中斷發生時,S3C440B0X自動轉到硬件固定向量表的歌地址處,所以需要在0x0開始的區域放置一個bootloader,它主要完成系統硬件初始化和地址映射工作。地址映射包含兩部分,首先完成從0x0開始的固定向量表到0x0c000000(ram起始區,不同的系統不同)的轉移,然后應用程序中的Isr_Init()函數完成到代碼下載區RAM處的向量轉移。 Bootloader地址映射: 在硬件固定表的各向量地址處放指令:ldr pc,=0x0000??,實現0x0000??->0x0c0000??的映射。 注意:若IRQ異常采用非向量模式,在開始地址區不必進行中斷源的映射;復位異常發生,硬件初始化后,直接映射到代碼下載區的0x0c008000處,并執行應用系統初始化。 |
|