|
ARM_MODE_FIQ EQU 0x11
ARM_MODE_IRQ EQU 0x12
ARM_MODE_SVC EQU 0x13I_BIT EQU 0x80
F_BIT EQU 0x40;- Save SPSR need to be saved for nested interrupt
mrs r14, SPSR
stmfd sp!, {r14};- Save and r0 in IRQ stack
stmfd sp!, {r0};- Write in the IVR to support Protect Mode
;- No effect in Normal Mode
;- De-assert the NIRQ and clear the source in Protect Mode
ldr r14, =AT91C_BASE_AIC
ldr r0 , [r14, #AIC_IVR]
str r14, [r14, #AIC_IVR];- Enable Interrupt and Switch in Supervisor Mode
msr CPSR_c, #ARM_MODE_SVC;- Save scratch/used registers and LR in User Stack
stmfd sp!, { r1-r3, r12, r14};- Branch to the routine pointed by the AIC_IVR
mov r14, pc
bx r0;- Restore scratch/used registers and LR from User Stack
ldmia sp!, { r1-r3, r12, r14};- Disable Interrupt and switch back in IRQ mode
msr CPSR_c, #I_BIT | ARM_MODE_IRQ;- Mark the End of Interrupt on the AIC
ldr r14, =AT91C_BASE_AIC
str r14, [r14, #AIC_EOICR];- Restore R0
ldmia sp!, {r0};- Restore SPSR_irq and r0 from IRQ stack
ldmia sp!, {r14}
msr SPSR_cxsf, r14;- Restore adjusted LR_irq from IRQ stack directly in the PC
ldmia sp!, {pc}^
;---------------------------------------------------------------
Составить ответ ||| Конференция ||| Архив
Ответы
E-mail: info@telesys.ru