19,503
社区成员
发帖
与我相关
我的任务
分享
Maskmd EQU 0x1f ; processor mode mask
SVC32md EQU 0x13 ; SVC mode
I_Bit EQU 0x80 ; IRQ bit
FRAME_R0 EQU 0x00
FRAME_R1 EQU FRAME_R0+4
FRAME_R2 EQU FRAME_R1+4
FRAME_R3 EQU FRAME_R2+4
FRAME_R4 EQU FRAME_R3+4
FRAME_R5 EQU FRAME_R4+4
FRAME_R6 EQU FRAME_R5+4
FRAME_R7 EQU FRAME_R6+4
FRAME_R8 EQU FRAME_R7+4
FRAME_R9 EQU FRAME_R8+4
FRAME_R10 EQU FRAME_R9+4
FRAME_R11 EQU FRAME_R10+4
FRAME_R12 EQU FRAME_R11+4
FRAME_PSR EQU FRAME_R12+4
FRAME_LR EQU FRAME_PSR+4
FRAME_PC EQU FRAME_LR+4
FRAME_SIZE EQU FRAME_PC+4
IRQ_Entry ; instruction state : comment
SUB r14,r14,#4 ; 2 :
STMDB r13!,{r0-r3,r12,r14} ; 2 : save context
<service interrupt>
BL read_RescheduleFlag ; 3 : more processing
CMP r0,#0 ; 3 : if processing?
LDMNEIA r13!,{r0-r3,r12,pc}ˆ ; 4 : else return
MRS r2,spsr ; 5 : copy spsr_irq
MOV r0,r13 ; 5 : copy r13_irq
ADD r13,r13,#6*4 ; 5 : reset stack
MRS r1,cpsr ; 6 : copy cpsr
BIC r1,r1,#Maskmd ; 6 :
ORR r1,r1,#SVC32md ; 6 :
MSR cpsr_c,r1 ; 6 : change to SVC
SUB r13,r13,#FRAME_SIZE-FRAME_R4 ; 7 : make space
STMIA r13,{r4-r11} ; 7 : save r4-r11
LDMIA r0,{r4-r9} ; 7 : restore r4-r9
BIC r1,r1,#I_Bit ; 8 :
MSR cpsr_c,r1 ; 8 : enable IRA
STMDB r13!,{r4-r7} ; 9 : save r4-r7 SVC
STR r2,[r13,#FRAME_PSR] ; 9 : save PSR
STR r8,[r13,#FRAME_R12] ; 9 : save r12
STR r9,[r13,#FRAME_PC] ; 9 : save pc
STR r14,[r13,#FRAME_LR] ; 9 : save lr
<complete interrupt service routine>
LDMIA r13!,{r0-r12,r14} ; 11 : restore context
MSR spsr_cxsf,r14 ; 11 : restore spsr
LDMIA r13!,{r14,pc}ˆ ; 11 : return
MSR cpsr_c,r1 ; 8 : enable IRA
LDMIA r0,{r4-r9} ; 7 : restore r4-r9
LDMIA r0,{r4-r9} ; 7 : restore r4-r9
STMDB r13!,{r0-r3,r12,r14} ; 2 : save context
LDMIA r0,{r4-r9} ; 7 : restore r4-r9