LPC中的中斷處理小結
基礎知識:LPC2294的EXT中斷分為了三類,包括FIQ,Vectored IRQ,non-- Vectored IRQ,其中,以FIQ的優(yōu)先級最高,而以non-- Vectored IRQ的優(yōu)先級最低,系統(tǒng)一共提供了27個中斷源,并且給這27個中斷源進行了固定的編號,但是注意,這個編號和優(yōu)先級沒有任何的關系,并非是編號在前面的優(yōu)先級就越高,見下面說明。
關鍵內容:兩套控制渠道,
第一套:在ARM體系中,本來有SWI,FIQ,IRQ等這些中斷的定義,并且已經定義了這些中斷的開關控制位,就是在CPSR寄存器中,該寄存器包含了一個I位和一個F位,I位用于控制IRQ中斷的開關,F用于控制FIQ的開關,但是值得注意的是CPSR的讀取和修改在用戶模式下是不能完成的,必須要通過SWI指令進入到特權模式下才可以進行修改。
第二套:在LPC的SFR(特殊功能寄存器)中,也提供了一套寄存器用于控制相應的中斷的進行,這組控制器叫做VIC寄存器(都以VIC開頭),改組寄存器包括了所有的與中斷有關的設置,開啟,分類等功能,僅僅是將外部中斷引腳對應的部分功能分離出去,由EXT系列的寄存器來處理,因此,對這一個系列的寄存器的掌握是非常重要的!
兩者間的關系:僅僅在第二套控制渠道下打開FIQ,IRQ中斷是不夠的,如果ARM內核沒有開中斷的話,整個系統(tǒng)就不會有中斷產生,因此,常見的做法是這樣:先將第二套渠道的控制內容處理好,然后通過SWI軟件中斷指令,將ARM處理器的模式切換為特權模式,在特權模式下,對CPSR進行“讀出-修改-寫回”的操作,將中斷打開,然后在返回到用戶模式。
LPC的中斷的特殊性:FIQ的中斷和普通的ARM規(guī)定是沒有任何區(qū)別的,即是在產生中斷時,指令跳轉到0x0000001C處開始執(zhí)行,這個是沒有什么疑問的。但是IRQ的響應過程就不同了,先看下面一段代碼,這個是寫在程序的頭部的部分字節(jié):
Reset
LDR PC, ResetAddr ;// 0x00000000,Reset --->Supervisor Mode
LDR PC, Und_Addr ;// 0x00000004,Undefined Instruction --->Undefined Mode
LDR PC, SWI_Addr ;// 0x00000008,Software Interrupt --->Supervisor Mode
LDR PC, PAbort_Addr ;// 0x0000000c,Abort(Prefetch) --->Abort Mode
LDR PC, DAbort_Addr ;// 0x00000010,Abort(Data) --->Abort Mode
DCD 0xB9205F80 ;// 0x00000014,Reserved --->
LDR PC, [PC,#-0xFF0] ;// 0x00000018,IRQ --->IRQ Mode
LDR PC, FIQ_Addr ;// 0x0000001c,FIQ
指令為“LDR PC, [PC,#-0xFF0]”非常特殊,其并沒有跳轉到IRQ中斷程序的入口處,而是進行了一個PC的運算后賦值,這里就要說明其緣由。在LPC系列中,IRQ的響應過程,程序的入口地址并不是直接寫在這條語句中,而是放在一個寄存器中,該寄存器是:VICVectAddr,其地址是0xFFFFF030,現在就很明白了,在執(zhí)行語句“LDR PC, [PC,#-0xFF0]”時,PC的值已經變?yōu)樵撜Z句的后面第二條語句的地址了,也就是0x00000020,而0x00000020-0xFF0時,發(fā)生借位,其結果恰好為0xFFFFF030,也就是說,通過這個簡單的運算,使PC跳轉到了寄存器VICVectAddr中包含的值為地址的位置上,這樣就簡單的完成了IRQ的跳轉。
當然,IRQ中斷源不止一個,其中斷服務程序也不止一個,這個寄存器的值是自動更新的,另有一組寄存器VICVectAddr0~15(后面有數字)將IRQ的16個中斷源的地址分別放在對應的位置上(優(yōu)先級等內容有另外的寄存器來控制,這里不多說),當IRQ中斷發(fā)生時,硬件自動將對應的VICVectAddr0~15中的某個對應的地址傳給VICVectAddr寄存器,這個過程不用我們來編程實現。
關鍵內容:兩套控制渠道,
第一套:在ARM體系中,本來有SWI,FIQ,IRQ等這些中斷的定義,并且已經定義了這些中斷的開關控制位,就是在CPSR寄存器中,該寄存器包含了一個I位和一個F位,I位用于控制IRQ中斷的開關,F用于控制FIQ的開關,但是值得注意的是CPSR的讀取和修改在用戶模式下是不能完成的,必須要通過SWI指令進入到特權模式下才可以進行修改。
第二套:在LPC的SFR(特殊功能寄存器)中,也提供了一套寄存器用于控制相應的中斷的進行,這組控制器叫做VIC寄存器(都以VIC開頭),改組寄存器包括了所有的與中斷有關的設置,開啟,分類等功能,僅僅是將外部中斷引腳對應的部分功能分離出去,由EXT系列的寄存器來處理,因此,對這一個系列的寄存器的掌握是非常重要的!
兩者間的關系:僅僅在第二套控制渠道下打開FIQ,IRQ中斷是不夠的,如果ARM內核沒有開中斷的話,整個系統(tǒng)就不會有中斷產生,因此,常見的做法是這樣:先將第二套渠道的控制內容處理好,然后通過SWI軟件中斷指令,將ARM處理器的模式切換為特權模式,在特權模式下,對CPSR進行“讀出-修改-寫回”的操作,將中斷打開,然后在返回到用戶模式。
LPC的中斷的特殊性:FIQ的中斷和普通的ARM規(guī)定是沒有任何區(qū)別的,即是在產生中斷時,指令跳轉到0x0000001C處開始執(zhí)行,這個是沒有什么疑問的。但是IRQ的響應過程就不同了,先看下面一段代碼,這個是寫在程序的頭部的部分字節(jié):
Reset
LDR PC, ResetAddr ;// 0x00000000,Reset --->Supervisor Mode
LDR PC, Und_Addr ;// 0x00000004,Undefined Instruction --->Undefined Mode
LDR PC, SWI_Addr ;// 0x00000008,Software Interrupt --->Supervisor Mode
LDR PC, PAbort_Addr ;// 0x0000000c,Abort(Prefetch) --->Abort Mode
LDR PC, DAbort_Addr ;// 0x00000010,Abort(Data) --->Abort Mode
DCD 0xB9205F80 ;// 0x00000014,Reserved --->
LDR PC, [PC,#-0xFF0] ;// 0x00000018,IRQ --->IRQ Mode
LDR PC, FIQ_Addr ;// 0x0000001c,FIQ
指令為“LDR PC, [PC,#-0xFF0]”非常特殊,其并沒有跳轉到IRQ中斷程序的入口處,而是進行了一個PC的運算后賦值,這里就要說明其緣由。在LPC系列中,IRQ的響應過程,程序的入口地址并不是直接寫在這條語句中,而是放在一個寄存器中,該寄存器是:VICVectAddr,其地址是0xFFFFF030,現在就很明白了,在執(zhí)行語句“LDR PC, [PC,#-0xFF0]”時,PC的值已經變?yōu)樵撜Z句的后面第二條語句的地址了,也就是0x00000020,而0x00000020-0xFF0時,發(fā)生借位,其結果恰好為0xFFFFF030,也就是說,通過這個簡單的運算,使PC跳轉到了寄存器VICVectAddr中包含的值為地址的位置上,這樣就簡單的完成了IRQ的跳轉。
當然,IRQ中斷源不止一個,其中斷服務程序也不止一個,這個寄存器的值是自動更新的,另有一組寄存器VICVectAddr0~15(后面有數字)將IRQ的16個中斷源的地址分別放在對應的位置上(優(yōu)先級等內容有另外的寄存器來控制,這里不多說),當IRQ中斷發(fā)生時,硬件自動將對應的VICVectAddr0~15中的某個對應的地址傳給VICVectAddr寄存器,這個過程不用我們來編程實現。
評論