μC/OS中高优先级任务一旦处于就绪态总能获得C(2)

       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/OSOSInrNesting变量+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]

      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c891583336a3126b64689d39989d88e0.html