|
zlg对arm的usos,基本上看清楚了,但有一处不解:<br /><br />OSIntCtxSw_1<br /> ;获取新任务堆栈指针<br /> LDR R4, [R6]<br /> ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP<br /> LDR LR, [SP, #-8]<br /> MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式<br /> MOV SP, R4 ;设置堆栈指针<br /><br /> LDMFD SP!, {R4, R5} ;CPSR,OsEnterSum<br /> ;恢复新任务的OsEnterSum<br /> LDR R3, =OsEnterSum<br /> STR R4, [R3]<br /> <br /> MSR SPSR_cxsf, R5 ;恢复CPSR<br /> LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务<br /><br /><br />其中:<br />最后一行 <br /> LDMFD SP!, {R0-R12, LR, PC }^ ;运行新任务<br />已经可以把LR出栈到用户模式的LR,<br /><br />但为何前面要做:<br /> LDR R4, [R6]<br /> ADD SP, R4, #68 ;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP<br /> LDR LR, [SP, #-8]<br /><br />这不也是把LR恢复到系统模式(即用户模式)的LR中吗?<br /><br /> |
|