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