MSR CPSR_cxsf, #SVCMODE|NOINT //切换处理器运行状态,SP也会更改为特权模式的堆栈指针
下面代码的作用是将被中断的任务的相关寄存器保存到特权模式的堆栈下。
STMFD SP!, {R2} //R2中存放的是被中断任务的下一条将被执行的指令,将其入栈。
STMFD SP!, {R4-R12, LR} ; Push task''s LR,R12-R4
LDMFD R1!, {R4-R6} //R1此时是IRQ堆栈的栈顶指针,和下一条指令一起将被中断任务的R1~R3寄存器保存到特权模式的堆栈中
STMFD SP!, {R4-R6} ; Push Task''s R3-R1 to SVC stack
STMFD SP!, {R0} ; Push Task''s R0 to SVC stack
STMFD SP!, {R3} ; Push task''s CPSR
此时的特权模式堆栈结构应该是:
LR
R12
R11
R10
R9
R8
R7
R6
R5
R4
R3
R2
R1
R0
CPSR
LDR R0,=OSIntNesting ;OSIntNesting++
LDRB R1,[R0]
ADD R1,R1,#1
STRB R1,[R0] //μC/OS中OSInrNesting变量+1
CMP R1,#1 ;if(OSIntNesting==1){
BNE %F1
LDR R4,=OSTCBCur // ;OSTCBHighRdy->OSTCBStkPtr=SP;
LDR R5,[R4] //将当前的TCB指针赋值R5
STR SP,[R5] //将被特权模式的栈顶指针保存到北中断任务的OSTCBStkPtr中
1
MSR CPSR_c,#IRQMODE|NOINT ;Change to IRQ mode to use IRQ stack to handle interrupt
LDR R0, =INTOFFSET
LDR R0, [R0]