📄 ucos.lst
字号:
(0138) ; Return original value of SREG
(0139) ;
(0140) ; void OSCPURestoreSR (OS_CPU_SR cpu_sr)
(0141) ; Set SREG to cpu_sr
(0142) ; Return
(0143) ;********************************************************************************************************
(0144)
(0145) _OS_CPU_SR_Save::
(0146) IN R16,SREG ; Get current state of interrupts disable flag
_OS_CPU_SR_Save:
028E B70F IN R16,P3F
(0147) CLI ; Disable interrupts
028F 94F8 BCLR 7
(0148) RET ; Return original SREG value in R16
0290 9508 RET
(0149)
(0150)
(0151) _OS_CPU_SR_Restore::
(0152) OUT SREG,R16 ; Restore SREG
_OS_CPU_SR_Restore:
0291 BF0F OUT P3F,R16
(0153) RET ; Return
0292 9508 RET
(0154)
(0155) ;/*$PAGE*/.
(0156) ;********************************************************************************************************
(0157) ; START HIGHEST PRIORITY TASK READY-TO-RUN
(0158) ;
(0159) ; Description : This function is called by OSStart() to start the highest priority task that was created
(0160) ; by your application before calling OSStart().
(0161) ;
(0162) ; Note(s) : 1) The (data)stack frame is assumed to look as follows:
(0163) ;
(0164) ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
(0165) ; SPH of (return) stack pointer
(0166) ; Flags to load in status register
(0167) ; R31
(0168) ; R30
(0169) ; R27
(0170) ; .
(0171) ; .
(0172) ; R0
(0173) ; PCH
(0174) ; PCL (High memory)
(0175) ;
(0176) ; where the stack pointer points to the task start address.
(0177) ;
(0178) ;
(0179) ; 2) OSStartHighRdy() MUST:
(0180) ; a) Call OSTaskSwHook() then,
(0181) ; b) Set OSRunning to TRUE,
(0182) ; c) Switch to the highest priority task.
(0183) ;********************************************************************************************************
(0184)
(0185) _OSStartHighRdy::
(0186) CALL _OSTaskSwHook ; Invoke user defined context switch hook
_OSStartHighRdy:
0293 940E04BA CALL _OSTaskSwHook
(0187) LDS R16,_OSRunning ; Indicate that we are multitasking
0295 91000BB0 LDS R16,_OSRunning
(0188) INC R16 ;
0297 9503 INC R16
(0189) STS _OSRunning,R16 ;
0298 93000BB0 STS R16,_OSRunning
(0190)
(0191) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
029A 91E00AA5 LDS R30,_OSTCBHighRdy
(0192) LDS R31,_OSTCBHighRdy+1 ; ready to run
029C 91F00AA6 LDS R31,_OSTCBHighRdy+1
(0193) LD R28,Z+ ; Load Y (R29:R28) pointer
029E 91C1 LD R28,Z+
(0194) LD R29,Z+ ;
029F 91D1 LD R29,Z+
02A0 9109 LD R16,Y+
02A1 BF0D OUT P3D,R16
02A2 9109 LD R16,Y+
02A3 BF0E OUT P3E,R16
02A4 9109 LD R16,Y+
02A5 BF0F OUT P3F,R16
02A6 9109 LD R16,Y+
02A7 BF0B OUT P3B,R16
02A8 91F9 LD R31,Y+
02A9 91E9 LD R30,Y+
02AA 91B9 LD R27,Y+
02AB 91A9 LD R26,Y+
02AC 9199 LD R25,Y+
02AD 9189 LD R24,Y+
02AE 9179 LD R23,Y+
02AF 9169 LD R22,Y+
02B0 9159 LD R21,Y+
02B1 9149 LD R20,Y+
02B2 9139 LD R19,Y+
02B3 9129 LD R18,Y+
02B4 9119 LD R17,Y+
02B5 9109 LD R16,Y+
02B6 90F9 LD R15,Y+
02B7 90E9 LD R14,Y+
02B8 90D9 LD R13,Y+
02B9 90C9 LD R12,Y+
02BA 90B9 LD R11,Y+
02BB 90A9 LD R10,Y+
02BC 9099 LD R9,Y+
02BD 9089 LD R8,Y+
02BE 9079 LD R7,Y+
02BF 9069 LD R6,Y+
02C0 9059 LD R5,Y+
02C1 9049 LD R4,Y+
02C2 9039 LD R3,Y+
02C3 9029 LD R2,Y+
02C4 9019 LD R1,Y+
02C5 9009 LD R0,Y+
(0195)
(0196) POP_SP ; Restore stack pointer
(0197) POP_SREG ; Restore status register
(0198) POP_ALL ; Restore all registers
(0199) RET ; Start task
02C6 9508 RET
_OSCtxSw:
02C7 920A ST R0,-Y
02C8 921A ST R1,-Y
02C9 922A ST R2,-Y
02CA 923A ST R3,-Y
02CB 924A ST R4,-Y
02CC 925A ST R5,-Y
02CD 926A ST R6,-Y
02CE 927A ST R7,-Y
02CF 928A ST R8,-Y
02D0 929A ST R9,-Y
02D1 92AA ST R10,-Y
02D2 92BA ST R11,-Y
02D3 92CA ST R12,-Y
02D4 92DA ST R13,-Y
02D5 92EA ST R14,-Y
02D6 92FA ST R15,-Y
02D7 930A ST R16,-Y
02D8 931A ST R17,-Y
02D9 932A ST R18,-Y
02DA 933A ST R19,-Y
02DB 934A ST R20,-Y
02DC 935A ST R21,-Y
02DD 936A ST R22,-Y
02DE 937A ST R23,-Y
02DF 938A ST R24,-Y
02E0 939A ST R25,-Y
02E1 93AA ST R26,-Y
02E2 93BA ST R27,-Y
02E3 93EA ST R30,-Y
02E4 93FA ST R31,-Y
02E5 B70B IN R16,P3B
02E6 930A ST R16,-Y
02E7 B70F IN R16,P3F
02E8 930A ST R16,-Y
02E9 B70E IN R16,P3E
02EA 930A ST R16,-Y
02EB B70D IN R16,P3D
02EC 930A ST R16,-Y
(0200)
(0201) ;/*$PAGE*/.
(0202) ;********************************************************************************************************
(0203) ; TASK LEVEL CONTEXT SWITCH
(0204) ;
(0205) ; Description : This function is called when a task makes a higher priority task ready-to-run.
(0206) ;
(0207) ; Note(s) : 1) Upon entry,
(0208) ; OSTCBCur points to the OS_TCB of the task to suspend
(0209) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0210) ;
(0211) ; 2) The stack frame of the task to suspend looks as follows:
(0212) ;
(0213) ; SP+0 --> LSB of task code address
(0214) ; +1 MSB of task code address (High memory)
(0215) ;
(0216) ; 3) The saved context of the task to resume looks as follows:
(0217) ;
(0218) ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
(0219) ; SPH of (return) stack pointer
(0220) ; Flags to load in status register
(0221) ; R31
(0222) ; R30
(0223) ; R27
(0224) ; .
(0225) ; .
(0226) ; R0
(0227) ; PCH
(0228) ; PCL (High memory)
(0229) ;********************************************************************************************************
(0230)
(0231) _OSCtxSw::
(0232) PUSH_ALL ; Save current task's context
(0233) PUSH_SREG
(0234) PUSH_SP
(0235)
(0236) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
02ED 91E00AA9 LDS R30,_OSTCBCur
(0237) LDS R31,_OSTCBCur+1 ;
02EF 91F00AAA LDS R31,_OSTCBCur+1
(0238) ST Z+,R28 ; Save Y (R29:R28) pointer
02F1 93C1 ST R28,Z+
(0239) ST Z+,R29 ;
02F2 93D1 ST R29,Z+
(0240)
(0241) CALL _OSTaskSwHook ; Call user defined task switch hook
02F3 940E04BA CALL _OSTaskSwHook
(0242)
(0243) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
02F5 91000BB4 LDS R16,_OSPrioHighRdy
(0244) STS _OSPrioCur,R16
02F7 93000BB5 STS R16,_OSPrioCur
(0245)
(0246) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
02F9 91E00AA5 LDS R30,_OSTCBHighRdy
(0247) LDS R31,_OSTCBHighRdy+1 ; ready to run
02FB 91F00AA6 LDS R31,_OSTCBHighRdy+1
(0248) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
02FD 93E00AA9 STS R30,_OSTCBCur
(0249) STS _OSTCBCur+1,R31 ;
02FF 93F00AAA STS R31,_OSTCBCur+1
(0250)
(0251) LD R28,Z+ ; Restore Y pointer
0301 91C1 LD R28,Z+
(0252) LD R29,Z+ ;
0302 91D1 LD R29,Z+
0303 9109 LD R16,Y+
0304 BF0D OUT P3D,R16
0305 9109 LD R16,Y+
0306 BF0E OUT P3E,R16
0307 9109 LD R16,Y+
0308 BF0F OUT P3F,R16
0309 9109 LD R16,Y+
030A BF0B OUT P3B,R16
030B 91F9 LD R31,Y+
030C 91E9 LD R30,Y+
030D 91B9 LD R27,Y+
030E 91A9 LD R26,Y+
030F 9199 LD R25,Y+
0310 9189 LD R24,Y+
0311 9179 LD R23,Y+
0312 9169 LD R22,Y+
0313 9159 LD R21,Y+
0314 9149 LD R20,Y+
0315 9139 LD R19,Y+
0316 9129 LD R18,Y+
0317 9119 LD R17,Y+
0318 9109 LD R16,Y+
0319 90F9 LD R15,Y+
031A 90E9 LD R14,Y+
031B 90D9 LD R13,Y+
031C 90C9 LD R12,Y+
031D 90B9 LD R11,Y+
031E 90A9 LD R10,Y+
031F 9099 LD R9,Y+
0320 9089 LD R8,Y+
0321 9079 LD R7,Y+
0322 9069 LD R6,Y+
0323 9059 LD R5,Y+
0324 9049 LD R4,Y+
0325 9039 LD R3,Y+
0326 9029 LD R2,Y+
0327 9019 LD R1,Y+
0328 9009 LD R0,Y+
(0253)
(0254) POP_SP ; Restore stack pointer
(0255) POP_SREG ; Restore status register
(0256) POP_ALL ; Restore all registers
(0257)
(0258) RET
0329 9508 RET
(0259)
(0260) ;/*$PAGE*/.
(0261) ;*********************************************************************************************************
(0262) ; INTERRUPT LEVEL CONTEXT SWITCH
(0263) ;
(0264) ; Description : This function is called by OSIntExit() to perform a context switch to a task that has
(0265) ; been made ready-to-run by an ISR.
(0266) ;
(0267) ; Note(s) : 1) Upon entry,
(0268) ; OSTCBCur points to the OS_TCB of the task to suspend
(0269) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0270) ;
(0271) ; 2) The stack frame of the task to suspend looks as follows:
(0272) ;
(0273) ; OSTCBCur->OSTCBStkPtr ------> SPL of (return) stack pointer (Low memory)
(0274) ; SPH of (return) stack pointer
(0275) ; Flags to load in status register
(0276) ; R31
(0277) ; R30
(0278) ; R27
(0279) ; .
(0280) ; .
(0281) ; R0
(0282) ; PCH
(0283) ; PCL (High memory)
(0284) ;
(0285) ; 3) The saved context of the task to resume looks as follows:
(0286) ;
(0287) ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
(0288) ; SPH of (return) stack pointer
(0289) ; Flags to load in status register
(0290) ; R31
(0291) ; R30
(0292) ; R27
(0293) ; .
(0294) ; .
(0295) ; R0
(0296) ; PCH
(0297) ; PCL (High memory)
(0298) ;*********************************************************************************************************
(0299)
(0300) _OSIntCtxSw::
(0301) CALL _OSTaskSwHook ; Call user defined task switch hook
_OSIntCtxSw:
032A 940E04BA CALL _OSTaskSwHook
(0302)
(0303) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
032C 91000BB4 LDS R16,_OSPrioHighRdy
(0304) STS _OSPrioCur,R16 ;
032E 93000BB5 STS R16,_OSPrioCur
(0305)
(0306) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
0330 91E00AA5 LDS R30,_OSTCBHighRdy
(0307) LDS R31,_OSTCBHighRdy+1 ;
0332 91F00AA6 LDS R31,_OSTCBHighRdy+1
(0308) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0334 93E00AA9 STS R30,_OSTCBCur
(0309) STS _OSTCBCur+1,R31 ;
0336 93F00AAA STS R31,_OSTCBCur+1
(0310)
(0311) LD R28,Z+ ; Restore Y pointer
0338 91C1 LD R28,Z+
(0312) LD R29,Z+ ;
0339 91D1 LD R29,Z+
033A 9109 LD R16,Y+
033B BF0D OUT P3D,R16
033C 9109 LD R16,Y+
033D BF0E OUT P3E,R16
033E 9109 LD R16,Y+
033F BF0F OUT P3F,R16
0340 9109 LD R16,Y+
0341 BF0B OUT P3B,R16
0342 91F9 LD R31,Y+
0343 91E9 LD R30,Y+
0344 91B9 LD R27,Y+
0345 91A9 LD R26,Y+
0346 9199 LD R25,Y+
0347 9189 LD R24,Y+
0348 9179 LD R23,Y+
0349 9169 LD R22,Y+
034A 9159 LD R21,Y+
034B 9149 LD R20,Y+
034C 9139 LD R19,Y+
034D 9129 LD R18,Y+
034E 9119 LD R17,Y+
034F 9109 LD R16,Y+
0350 90F9 LD R15,Y+
0351 90E9 LD R14,Y+
0352 90D9 LD R13,Y+
0353 90C9 LD R12,Y+
0354 90B9 LD R11,Y+
0355 90A9 LD R10,Y+
0356 9099 LD R9,Y+
0357 9089 LD R8,Y+
0358 9079 LD R7,Y+
0359 9069 LD R6,Y+
035A 9059 LD R5,Y+
035B 9049 LD R4,Y+
035C 9039 LD R3,Y+
035D 9029 LD R2,Y+
035E 9019 LD R1,Y+
035F 9009 LD R0,Y+
(0313)
(0314) POP_SP ; Restore stack pointer
(0315) POP_SREG ; Restore status register
(0316) POP_ALL ; Restore all registers
(0317) RET
0360 9508 RET
_OSTickISR:
0361 920A ST R0,-Y
0362 921A ST R1,-Y
0363 922A ST R2,-Y
0364 923A ST R3,-Y
0365 924A ST R4,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -