| 
 
| 在进入软件中段不用入栈R1-R3,为什么会说“因为R0~R3没有保存有用数据”,实在不明白,哪位看过的,能指点下吗?<br /><br />这个部分程序如下:<br /><br /><br />;软件中断<br />SoftwareInterrupt<br />        CMP     R0, #12<br />        LDRLO   PC, [PC, R0, LSL #2]<br />        MOVS    PC, LR<br /><br />SwiFunction<br />        DCD     TASK_SW                 ;0<br />        DCD     ENTER_CRITICAL          ;1<br />        DCD     EXIT_CRITICAL           ;2<br />        DCD     ISRBegin                ;3<br />        DCD     ChangeToSYSMode         ;4<br />        DCD     ChangeToUSRMode         ;5<br />        DCD     __OSStartHighRdy        ;6<br />        DCD     TaskIsARM               ;7<br />        DCD     TaskIsTHUMB1             ;8<br />        DCD     OSISRNeedSwap           ;9<br />        DCD     GetOSFunctionAddr       ;10<br />        DCD     GetUsrFunctionAddr      ;11<br /><br />TASK_SW<br />        MRS     R3, SPSR                        ;保存任务的CPSR<br />        MOV     R2, LR                          ;保存任务的PC<br />        <br />        MSR     CPSR_c, #(NoInt | SYS32Mode)    ;切换到系统模式<br />        STMFD   SP!, {R2}                       ;保存PC到堆栈<br />        STMFD   SP!, {R0-R12, LR}               ;保存R0-R12,LR到堆栈<br />                                                ;因为R0~R3没有保存有用数据,所以可以这样做<br />        B       OSIntCtxSw_0                    ;真正进行任务切换<br /><br />ENTER_CRITICAL<br />                                                ;OsEnterSum++<br />        LDR     R1, =OsEnterSum<br />        LDRB    R2, [R1]<br />        ADD     R2, R2, #1<br />        STRB    R2, [R1]<br />                                                ;关中断<br />        MRS     R0, SPSR<br />        ORR     R0, R0, #NoInt<br />        MSR     SPSR_c, R0<br />        MOVS    PC, LR | 
 |