📄 os_cpu_a.lst
字号:
186 00000028 E51F0008 LDR R0, LAB_OS_TaskSwHook
; OSTaskSwHook();
187 0000002C E1A0E00F MOV LR, PC
188 00000030 E12FFF10 BX R0
189 00000034
190 00000034 E51F4008 LDR R4, LAB_OS_PrioCur ; OSPrioCur
= OSPrioHighRdy
191 00000038 E51F5008 LDR R5, LAB_OS_PrioHighRdy
192 0000003C E5D56000 LDRB R6, [R5]
193 00000040 E5C46000 STRB R6, [R4]
194 00000044
195 00000044 E51F4008 LDR R4, LAB_OS_TCBCur ; OSTCBCur =
OSTCBHighRdy;
196 00000048 E51F6008 LDR R6, LAB_OS_TCBHighRdy
197 0000004C E5966000 LDR R6, [R6]
198 00000050 E5846000 STR R6, [R4]
199 00000054
200 00000054 E596D000 LDR SP, [R6] ; SP = OSTCBHighRdy
->OSTCBStkPtr;
201 00000058
202 00000058 ; RESTORE NEW TASK'S CONTEXT
203 00000058 E8BD0010 LDMFD SP!, {R4} ; Pop new task's
CPSR
204 0000005C E16FF004 MSR SPSR_cxsf, R4
205 00000060
206 00000060 E8FDDFFF LDMFD SP!, {R0-R12,LR,PC}^ ; Pop n
ew task's context
207 00000064
208 00000064
209 00000064 ;*******************************************************
**************************************************
210 00000064 ; PERFORM A CONTEXT SWITCH (From inter
rupt level) - OSIntCtxSw()
ARM Macro Assembler Page 6
211 00000064 ;
212 00000064 ; Note(s) : 1) OSIntCtxSw() is called in SYS mode with B
OTH FIQ and IRQ interrupts DISABLED
213 00000064 ;
214 00000064 ; 2) The pseudo-code for OSCtxSw() is:
215 00000064 ; a) OSTaskSwHook();
216 00000064 ; b) OSPrioCur = OSPrioHighRdy;
217 00000064 ; c) OSTCBCur = OSTCBHighRdy;
218 00000064 ; d) SP = OSTCBHighRdy->
OSTCBStkPtr;
219 00000064 ; e) Restore the new task's context from th
e new task's stack
220 00000064 ; f) Return to new task's code
221 00000064 ;
222 00000064 ; 3) Upon entry:
223 00000064 ; OSTCBCur points to the OS_TCB of the
task to suspend
224 00000064 ; OSTCBHighRdy points to the OS_TCB of the
task to resume
225 00000064 ;*******************************************************
**************************************************
226 00000064 AREA CODE4,CODE,READONLY
227 00000000 ARM
228 00000000 ; RSEG CODE:CODE:NOROOT(2)
229 00000000 ; CODE32
230 00000000
231 00000000 OSIntCtxSw
232 00000000 E51F0008 LDR R0, LAB_OS_TaskSwHook
; OSTaskSwHook();
233 00000004 E1A0E00F MOV LR, PC
234 00000008 E12FFF10 BX R0
235 0000000C
236 0000000C E51F4008 LDR R4,LAB_OS_PrioCur ; OSPrioCur =
OSPrioHighRdy
237 00000010 E51F5008 LDR R5,LAB_OS_PrioHighRdy
238 00000014 E5D56000 LDRB R6,[R5]
239 00000018 E5C46000 STRB R6,[R4]
240 0000001C
241 0000001C E51F4008 LDR R4,LAB_OS_TCBCur ; OSTCBCur =
OSTCBHighRdy;
242 00000020 E51F6008 LDR R6,LAB_OS_TCBHighRdy
243 00000024 E5966000 LDR R6,[R6]
244 00000028 E5846000 STR R6,[R4]
245 0000002C
246 0000002C E596D000 LDR SP,[R6] ; SP = OSTCBHighRdy
->OSTCBStkPtr;
247 00000030
248 00000030 ; RESTORE NEW TASK'S CONTEXT
249 00000030 E8BD0010 LDMFD SP!, {R4} ; Pop new task's
CPSR
250 00000034 E16FF004 MSR SPSR_cxsf, R4
251 00000038
252 00000038 E8FDDFFF LDMFD SP!, {R0-R12,LR,PC}^ ; Pop n
ew task's context
253 0000003C
254 0000003C
255 0000003C ;*******************************************************
**************************************************
ARM Macro Assembler Page 7
256 0000003C ; IRQ Interrupt Ser
vice Routine
257 0000003C ;*******************************************************
**************************************************
258 0000003C AREA CODE5,CODE,READONLY
259 00000000 ARM
260 00000000 ; RSEG CODE:CODE:NOROOT(2)
261 00000000 ; CODE32
262 00000000
263 00000000 OS_CPU_IRQ_ISR
264 00000000 ; Disable FIQ for a moment
265 00000000 E321F0D2 MSR CPSR_c, #(NO_INT | IRQ32_MODE)
; Change to IRQ mod
e (to use the IRQ s
tack to handle inte
rrupt)
266 00000004 E92D000E STMFD SP!, {R1-R3} ; PUSH WORKING REG
ISTERS ONTO IRQ STA
CK
267 00000008 E1A0100D MOV R1, SP ; Save IRQ stack
pointer
268 0000000C E28DD00C ADD SP, SP,#12 ; Adjust IRQ stack
pointer
269 00000010 E24E2004 SUB R2, LR,#4 ; Adjust PC for ret
urn address to task
270 00000014 E14F3000 MRS R3, SPSR ; Copy SPSR (i.e. i
nterrupted task's C
PSR) to R3
271 00000018 E321F0D3 MSR CPSR_c, #(NO_INT | SVC32_MODE)
; Change to SVC mod
e
272 0000001C
273 0000001C ; SAVE TASK'S CONTEXT ONTO TASK'S STACK
274 0000001C E92D0004 STMFD SP!, {R2} ; Push task's Re
turn PC
275 00000020 E92D4000 STMFD SP!, {LR} ; Push task's LR
276 00000024 E92D1FF0 STMFD SP!, {R4-R12} ; Push task's
R12-R4
277 00000028
278 00000028 E8B10070 LDMFD R1!, {R4-R6} ; Move task's R
1-R3 from IRQ stack
to SVC stack
279 0000002C E92D0070 STMFD SP!, {R4-R6}
280 00000030 E92D0001 STMFD SP!, {R0} ; Push task's R0
onto task's sta
ck
281 00000034 E92D0008 STMFD SP!, {R3} ; Push task's CP
SR (i.e. IRQ's SPSR
)
282 00000038
283 00000038 ; HANDLE NESTING COUNTER
284 00000038 E51F0008 LDR R0, LAB_OS_IntNesting
; OSIntNesting++;
285 0000003C E5D01000 LDRB R1, [R0]
286 00000040 E2811001 ADD R1, R1,#1
287 00000044 E5C01000 STRB R1, [R0]
288 00000048
ARM Macro Assembler Page 8
289 00000048 E3510001 CMP R1, #1 ; if (OSIntNesting
== 1) {
290 0000004C 1A000002 BNE OS_CPU_IRQ_ISR_1
291 00000050
292 00000050 E51F4008 LDR R4, LAB_OS_TCBCur ; OSTCBCu
r->OSTCBStkPtr = SP
293 00000054 E5945000 LDR R5, [R4]
294 00000058 E585D000 STR SP, [R5] ; }
295 0000005C
296 0000005C OS_CPU_IRQ_ISR_1
297 0000005C E321F092 MSR CPSR_c, #(NO_IRQ | IRQ32_MODE)
; Re-enable FIQ, Ch
ange to IRQ mode (t
o use the IRQ stack
to handle interrup
t)
298 00000060
299 00000060 E51F0008 LDR R0, LAB_OS_CPU_IRQ_ISR_Handler
; OS_CPU_IRQ_ISR_Ha
ndler();
300 00000064 E1A0E00F MOV LR, PC
301 00000068 E12FFF10 BX R0
302 0000006C
303 0000006C E321F0D3 MSR CPSR_c, #(NO_INT | SVC32_MODE)
; Change to SVC mod
e
304 00000070
305 00000070 E51F0008 LDR R0, LAB_OS_IntExit
; OSIntExit();
306 00000074 E1A0E00F MOV LR, PC
307 00000078 E12FFF10 BX R0
308 0000007C
309 0000007C ; RESTORE NEW TASK'S CONTEXT
310 0000007C E8BD0010 LDMFD SP!, {R4} ; Pop new task's
CPSR
311 00000080 E16FF004 MSR SPSR_cxsf, R4
312 00000084
313 00000084 E8FDDFFF LDMFD SP!, {R0-R12,LR,PC}^ ; Pop n
ew task's context
314 00000088
315 00000088
316 00000088 ;*******************************************************
**************************************************
317 00000088 ; FIQ Interrupt Ser
vice Routine
318 00000088 ;*******************************************************
**************************************************
319 00000088 AREA CODE6,CODE,READONLY
320 00000000 ARM
321 00000000
322 00000000
323 00000000
324 00000000 ; RSEG CODE:CODE:NOROOT(2)
325 00000000 ; CODE32
326 00000000
327 00000000 OS_CPU_FIQ_ISR
328 00000000
329 00000000 E92D001E STMFD SP!, {R1-R4} ; PUSH WORKING REG
ARM Macro Assembler Page 9
ISTERS ONTO FIQ STA
CK
330 00000004 E1A0100D MOV R1, SP ; Save FIQ stack
pointer
331 00000008 E24E2004 SUB R2, LR,#4 ; Adjust PC for ret
urn address to task
332 0000000C E14F3000 MRS R3, SPSR ; Copy SPSR (i.e. i
nterrupted task's C
PSR) to R3 and R4
333 00000010 E1A04003 MOV R4, R3
334 00000014
335 00000014 E204401F AND R4, R4, #0x1F
; Isolate Mode bits
336 00000018 E3540012 CMP R4, #IRQ32_MODE ; See if we int
errupted an IRQ
337 0000001C 0A00001C BEQ OS_CPU_FIQ_ISR_2
; Branch if yes.
338 00000020
339 00000020
340 00000020 ; =============== FIQ interrupted Task ===============
341 00000020 E321F0D3 MSR CPSR_c, #(NO_INT | SVC32_MODE)
; Change to SVC mod
e
342 00000024 ; SAVE TASK'S CONTEXT ONTO TASK'S STACK
343 00000024 E92D0004 STMFD SP!, {R2} ; Push task's Re
turn PC
344 00000028 E92D4000 STMFD SP!, {LR} ; Push task's LR
345 0000002C E92D1FE0 STMFD SP!, {R5-R12} ; Push task's
R12-R5
346 00000030
347 00000030 E8B101E0 LDMFD R1!, {R5-R8} ; Move task's R
1-R4 from FIQ stack
to SVC stack
348 00000034 E92D01E0 STMFD SP!, {R5-R8}
349 00000038 E92D0001 STMFD SP!, {R0} ; Push task's R0
onto task's stack
350 0000003C E92D0008 STMFD SP!, {R3} ; Push task's CP
SR (i.e. FIQ's SPSR
)
351 00000040 ; HANDLE NESTING COUNTER
352 00000040 E59F0098 LDR R0, LAB_OS_IntNesting
; OSIntNesting++;
353 00000044 E5D01000 LDRB R1, [R0]
354 00000048 E2811001 ADD R1, R1,#1
355 0000004C E5C01000 STRB R1, [R0]
356 00000050
357 00000050 E3510001 CMP R1, #1 ; if (OSIntNesting
== 1){
358 00000054 1A000002 BNE OS_CPU_FIQ_ISR_1
359 00000058 E59F4090 LDR R4, LAB_OS_TCBCur ; OSTCBCu
r->OSTCBStkPtr = SP
360 0000005C E5945000 LDR R5, [R4]
361 00000060 E585D000 STR SP, [R5] ; }
362 00000064
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -