OSCTXSW
; SAVE current TASK ' S CONTEXT:
stmfd sp!, {lr} ; Push return address,
; The STMFD command is a full stack decrement, that is, the instruction Stmdb (the address first minus the stack) after the content in the LR is pressed into the SP minus 1 points to the position of the
stmfd sp!, {lr} Ibid.
stmfd sp!, {r0-r12} ; Push Registers,
MRS R0, CPSR; Push current CPSR,
TST LR, #1; If called from Thumb mode,
Orrne R0, R0, #OS_CPU_ARM_CONTROL_THUMB; If Yes, set the t-bit.
Stmfd sp!, {R0}
At the end of the stack, the contents of the stack are stored as follows
; Address content
; 1234 |
, |
, 1230 |
LR |
; 1226 |
LR |
; 1222 |
R12 |
; 1218 |
R11 |
; 1214 |
R10 |
; 1210 |
R9 |
; 1206 |
R8 |
; 1202 |
R7 |
; 1198 |
R6 |
; 1194 |
R5 |
; 1190 |
R4 |
; 1186 |
R3 |
; 1182 |
R2 |
; 1178 |
R1 |
; 1174 |
R0 |
; 1170 |
CPSR |
LDR R0, __os_tcbcur; Ostcbcur->ostcbstkptr = SP;
LDR R1, [R0]
STR SP, [R1]
LDR R0, __os_taskswhook; Ostaskswhook ();
MOV LR, PC
BX R0
ldr R0, __os_priocur ; Ospriocur = Ospriohighrdy;
ldr R1, __os_priohighrdy
ldrb R2, [R1]
strb R2, [R0]
LDR R0, __os_tcbcur; Ostcbcur = Ostcbhighrdy;
LDR R1, __os_tcbhighrdy
LDR R2, [R1]
STR R2, [R0]
LDR SP, [R2]; SP = ostcbhighrdy->ostcbstkptr;
; RESTORE NEW TASK ' S CONTEXT:
ldmfd sp!, {r0} ; Pop New Task ' s CPSR,
msr spsr_cxsf, R0
Ldmfd sp!, {r0-r12, LR, pc}^; Pop New task ' s context.
The stack command LDMFD, although called full stack decrement, but the actual invocation of the instruction is ldmia, that is, the first out of the stack after the address plus 1
; The result after the stack operation
; address |
|
; 1234 |
| /tr>
, 1230 |
PC |
; 1226 |
LR |
td>;1222
R12 |
, 1218 |
R11 |
; 1214 |
R10 |
; 1210 |
R9 |
; 1206 |
R8 |
; 1202 |
R7 |
; 1198 |
R6 |
; 1194 |
R5 |
; 1190 |
R4 |
; 1186 |
R3 |
; 1182 |
R2 |
; 1178 |
R1 |
; 1174 |
R0 |
; 1170 |
CPSR |
PS: There is a convention, low-numbered registers in the storage of data or load data corresponding to the low address of the memory
msr{< Condition Code >cpsr_f| spsr_f,< #ommed_8r >
msr{< Condition Code >cpsr_<field>| Spsr_<field>,rm
which
The <field> field can be one or more of the following:
C: Control domain masking field (No. 0 to 7th digits in PSR);
X: Extended Domain masking field (8th to 15th in PSR);
S: State field Masking field (16th to 32nd in PSR);
F: Flag Field Screen field (24th to 31st Digit in PSR).