📄 os_cpu_a.lst
字号:
new task's context
134 00000034
135 00000034
136 00000034 ;***********************************************
************************************************
**********
137 00000034 ; PERFORM A CONTEXT
SWITCH (From task level) - OSCtxSw()
138 00000034 ;
139 00000034 ; Note(s) : 1) OSCtxSw() is called in SYS mode
with BOTH FIQ and IRQ interrupts DISABLED
140 00000034 ;
141 00000034 ; 2) The pseudo-code for OSCtxSw()
is:
142 00000034 ; a) Save the current task's
context onto the current task's stack
143 00000034 ; b) OSTCBCur->OSTCBStkPtr =
SP;
144 00000034 ; c) OSTaskSwHook();
145 00000034 ; d) OSPrioCur =
OSPrioHighRdy;
146 00000034 ; e) OSTCBCur =
OSTCBHighRdy;
147 00000034 ; f) SP =
OSTCBHighRdy->OSTCBStkPtr;
148 00000034 ; g) Restore the new task's context
from the new task's stack
149 00000034 ; h) Return to new task's
code
150 00000034 ;
151 00000034 ; 3) Upon entry:
152 00000034 ; OSTCBCur points to the
OS_TCB of the task to suspend
153 00000034 ; OSTCBHighRdy points to the
OS_TCB of the task to resume
154 00000034 ;***********************************************
************************************************
**********
155 00000034
156 00000000 RSEG CODE:CODE:NOROOT(2)
157 00000000 CODE32
158 00000000
159 00000000 OSCtxSw
160 00000000 ; SAVE
CURRENT TASK'S CONTEXT
161 00000000 00402DE9 STMFD SP!, {LR} ;
Push return address
162 00000004 00402DE9 STMFD SP!, {LR}
163 00000008 FF1F2DE9 STMFD SP!, {R0-R12} ;
Push registers
164 0000000C 00400FE1 MRS R4, CPSR ;
Push current CPSR
165 00000010 01001EE3 TST LR, #1 ;
See if called from Thumb
mode
166 00000014 20408413 ORRNE R4, R4, #0x20 ; If
yes, Set the T-bit
167 00000018 10002DE9 STMFD SP!, {R4}
168 0000001C
169 0000001C ........ LDR R4, ??OS_TCBCur ;
OSTCBCur->OSTCBStkPtr =
SP;
170 00000020 005094E5 LDR R5, [R4]
171 00000024 00D085E5 STR SP, [R5]
172 00000028
173 00000028 ........ LDR R0, ??OS_TaskSwHook ;
OSTaskSwHook();
174 0000002C 0FE0A0E1 MOV LR, PC
175 00000030 10FF2FE1 BX R0
176 00000034
177 00000034 ........ LDR R4, ??OS_PrioCur ;
OSPrioCur = OSPrioHighRdy
178 00000038 ........ LDR R5, ??OS_PrioHighRdy
179 0000003C 0060D5E5 LDRB R6, [R5]
180 00000040 0060C4E5 STRB R6, [R4]
181 00000044
182 00000044 ........ LDR R4, ??OS_TCBCur ;
OSTCBCur = OSTCBHighRdy;
183 00000048 ........ LDR R6, ??OS_TCBHighRdy
184 0000004C 006096E5 LDR R6, [R6]
185 00000050 006084E5 STR R6, [R4]
186 00000054
187 00000054 00D096E5 LDR SP, [R6] ; SP =
OSTCBHighRdy->OSTCBStkPtr;
188 00000058
189 00000058 ;
RESTORE NEW TASK'S CONTEXT
190 00000058 1000BDE8 LDMFD SP!, {R4} ; Pop
new task's CPSR
191 0000005C 04F06FE1 MSR SPSR_cxsf, R4
192 00000060
193 00000060 FFDFFDE8 LDMFD SP!, {R0-R12,LR,PC}^ ; Pop
new task's context
194 00000064
195 00000064
196 00000064 ;***********************************************
************************************************
**********
197 00000064 ; PERFORM A CONTEXT SWITCH
(From interrupt level) - OSIntCtxSw()
198 00000064 ;
199 00000064 ; Note(s) : 1) OSIntCtxSw() is called in SYS
mode with BOTH FIQ and IRQ interrupts
DISABLED
200 00000064 ;
201 00000064 ; 2) The pseudo-code for OSCtxSw()
is:
202 00000064 ; a) OSTaskSwHook();
203 00000064 ; b) OSPrioCur =
OSPrioHighRdy;
204 00000064 ; c) OSTCBCur =
OSTCBHighRdy;
205 00000064 ; d) SP =
OSTCBHighRdy->OSTCBStkPtr;
206 00000064 ; e) Restore the new task's context
from the new task's stack
207 00000064 ; f) Return to new task's
code
208 00000064 ;
209 00000064 ; 3) Upon entry:
210 00000064 ; OSTCBCur points to the
OS_TCB of the task to suspend
211 00000064 ; OSTCBHighRdy points to the
OS_TCB of the task to resume
212 00000064 ;***********************************************
************************************************
**********
213 00000064
214 00000000 RSEG CODE:CODE:NOROOT(2)
215 00000000 CODE32
216 00000000
217 00000000 OSIntCtxSw
218 00000000 ........ LDR R0, ??OS_TaskSwHook ;
OSTaskSwHook();
219 00000004 0FE0A0E1 MOV LR, PC
220 00000008 10FF2FE1 BX R0
221 0000000C
222 0000000C ........ LDR R4,??OS_PrioCur ;
OSPrioCur = OSPrioHighRdy
223 00000010 ........ LDR R5,??OS_PrioHighRdy
224 00000014 0060D5E5 LDRB R6,[R5]
225 00000018 0060C4E5 STRB R6,[R4]
226 0000001C
227 0000001C ........ LDR R4,??OS_TCBCur ;
OSTCBCur = OSTCBHighRdy;
228 00000020 ........ LDR R6,??OS_TCBHighRdy
229 00000024 006096E5 LDR R6,[R6]
230 00000028 006084E5 STR R6,[R4]
231 0000002C
232 0000002C 00D096E5 LDR SP,[R6] ; SP =
OSTCBHighRdy->OSTCBStkPtr;
233 00000030
234 00000030 ;
RESTORE NEW TASK'S CONTEXT
235 00000030 1000BDE8 LDMFD SP!, {R4} ; Pop
new task's CPSR
236 00000034 04F06FE1 MSR SPSR_cxsf, R4
237 00000038
238 00000038 FFDFFDE8 LDMFD SP!, {R0-R12,LR,PC}^ ; Pop
new task's context
239 0000003C
240 0000003C
241 0000003C ;***********************************************
************************************************
**********
242 0000003C ; IRQ
Interrupt Service Routine
243 0000003C ;***********************************************
************************************************
**********
244 0000003C
245 00000000 RSEG CODE:CODE:NOROOT(2)
246 00000000 CODE32
247 00000000
248 00000000 OS_CPU_IRQ_ISR
249 00000000
250 00000000 0E002DE9 STMFD SP!, {R1-R3} ;
PUSH WORKING REGISTERS ONTO
IRQ STACK
251 00000004
252 00000004 0D10A0E1 MOV R1, SP ;
Save IRQ stack pointer
253 00000008
254 00000008 0CD08DE2 ADD SP, SP,#12 ;
Adjust IRQ stack pointer
255 0000000C
256 0000000C 04204EE2 SUB R2, LR,#4 ;
Adjust PC for return
address to task
257 00000010
258 00000010 00304FE1 MRS R3, SPSR ;
Copy SPSR (i.e. interrupted
task's CPSR) to R3
259 00000014
260 00000014 D3F021E3 MSR CPSR_c, #(NO_INT | SVC32_MODE) ;
Change to SVC
mode
261 00000018
262 00000018 ;
SAVE TASK'S CONTEXT ONTO TASK'S STACK
263 00000018 04002DE9 STMFD SP!, {R2} ;
Push task's Return
PC
264 0000001C 00402DE9 STMFD SP!, {LR} ;
Push task's LR
265 00000020 F01F2DE9 STMFD SP!, {R4-R12} ;
Push task's R12-R4
266 00000024
267 00000024 7000B1E8 LDMFD R1!, {R4-R6} ;
Move task's R1-R3 from
IRQ stack to SVC stack
268 00000028 70002DE9 STMFD SP!, {R4-R6}
269 0000002C 01002DE9 STMFD SP!, {R0} ;
Push task's R0 onto
task's stack
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -