在进入软件中段不用入栈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 |
|