寫在前面(太感謝原作者了....本人轉於:http://blog.csdn.net/liukun321)
作者一直支持GPL的精神。允許任何人自由使用、轉載、複製和再分發,但必須保留作者署名,必須保證全文完整轉載,包括完整的版權聲明。
由於作者水平有限,因此不能保證文章內容準確無誤,請批判閱讀。如果你發現任何錯誤或對文章內容有任何建議,歡迎你與我聯繫:
Email: [email protected] QQ羣: 14765968
--------------------------------------------------------------------------------
最近因爲公司項目忙,好久沒更新這裏了。也因爲項目,才發現原來ARM 的bootloader默認是不支持中斷嵌套的,所以必須得自己實現。同時也發現,44b0有向量中斷和非向量中斷之分,而2410是沒有向量中斷的。也許這樣說並不準確。因爲對2410來說,它有:
b ResetHandler ;0x00000000
b HandlerUndef ;0x00000004 handler for Undefined mode
b HandlerSWI ;0x00000008 handler for SWI interrupt
b HandlerPabort ;0x0000000c handler for PAbort
b HandlerDabort ;0x00000010 handler for DAbort
b . ;0x00000014
b HandlerIRQ ;0x00000018 handler for IRQ interrupt
b HandlerFIQ ;0x0000001c handler for FIQ interrupt
這幾個地址存放的就是向量表。然而它又不像44b0存在以下地址的向量表:
;44b0的中斷向量表
ResetEntry
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
b HandlerFIQ
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA 0x20
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;mGA 0x34
b .
b .
ldr pc,=HandlerZDMA0 ;mGB 0x40
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;mGB 0x54
b .
b .
ldr pc,=HandlerTIMER0 ;mGC 0x60
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC 0x74
b .
b .
ldr pc,=HandlerURXD0 ;mGD 0x80
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD 0x94
b .
b .
ldr pc,=HandlerRTC ;mGKA 0xa0
b .
b .
b .
b .
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB 0xc0
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
ldr pc,=EnterPWDN ;0xe0=EnterPWDN
這裏就必須講一下向量中斷模式和非向量中斷模式的概念向量中斷模式是當cpu讀取位於0x18處的IRQ中斷指令的時候,系統自動讀取對應於該中斷源確定地址上的指令取代0x18處的指令,通過跳轉指令系統就直接跳轉到對應地址,函數中,節省了中斷處理時間提高了中斷處理速度標例如 ADC中斷的向量地址爲0xC0,則在0xC0處放如下代碼:ldr PC,=HandlerADC 當ADC中斷產生的時候系統會自動跳轉到HandlerADC函數中。
非向量中斷模式處理方式是一種傳統的中斷處理方法,當系統產生中斷的時候,系統將interrupt pending寄存器中對應標誌位置位然後跳轉到位於0x18處的統一中斷函數中, 該函數通過讀取interrupt pending寄存器中對應標誌位來判斷中斷源,並根據優先級關係再跳到對應中斷源的處理代碼中。
現在說回中斷嵌套。要想實現中斷可嵌套並安全正確地返回,現場保護是關鍵。在IRQ中斷髮生時,先在IRQ模式保護現場,然後轉到SVC模式把現場環境拷貝到SVC的堆棧,處理IRQ中斷,並在這個模式下恢復現場。下面是我對2410的bootloader做了修改,實現了IRQ中斷嵌套:
;*****************************************************************************
;** **
;** IsrIRQ **
;** **
;真正的非向量IRQ中斷入口
;*****************************************************************************
IsrIRQ
;=============================================================================
;(1)在中斷模式下保護被中斷的模式的環境
;1-1 lr-4壓棧,lr-4纔是被中斷的模式的PC返回地址
;=============================================================================
SUBS LR, LR, #4
STMFD