📄 ucos_ii.lst
字号:
(0089) LD R11,Y+
(0090) LD R10,Y+
(0091) LD R9,Y+
(0092) LD R8,Y+
(0093) LD R7,Y+
(0094) LD R6,Y+
(0095) LD R5,Y+
(0096) LD R4,Y+
(0097) LD R3,Y+
(0098) LD R2,Y+
(0099) LD R1,Y+
(0100) LD R0,Y+
(0101) .endmacro
(0102)
(0103) ; Push stack pointer
(0104) .macro PUSHSP
(0105) IN R16,SPH
(0106) ST -Y,R16
(0107) IN R16,SPL
(0108) ST -Y,R16
(0109) .endmacro
(0110)
(0111) ; Pop stack pointer
(0112) .macro POPSP
(0113) LD R16,Y+
(0114) OUT SPL,R16
(0115) LD R16,Y+
(0116) OUT SPH,R16
(0117) .endmacro
(0118)
(0119) ;Push SREG
(0120) .macro PUSHSREG
(0121) IN R16,SREG
(0122) ST -Y,R16
(0123) .endmacro
(0124)
(0125) ; Pop SREG
(0126) .macro POPSREG
(0127) LD R16,Y+
(0128) OUT SREG,R16
(0129) .endmacro
(0130)
(0131) .area text(rel)
(0132)
(0133) ;*******************************************************************************
(0134) ; START HIGHEST PRIORITY TASK READY-TO-RUN
(0135) ;
(0136) ; Description : This function is called by OSStart() to start the highest
(0137) ; priority task that was created by your application before calling OSStart().
(0138) ;
(0139) ; Note(s):
(0140) ; 1) The (data)stack frame is assumed to look as follows:
(0141) ;
(0142) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
(0143) ; MSB of (return) stack pointer
(0144) ; Flags to load in status register
(0145) ; R31
(0146) ; R30
(0147) ; R7
(0148) ; .
(0149) ; .
(0150) ; .
(0151) ; R0 (High memory)
(0152) ;
(0153) ; where the stack pointer points to the task start address.
(0154) ;
(0155) ;
(0156) ; 2) OSStartHighRdy() MUST:
(0157) ; a) RCALL OSTaskSwHook() then,
(0158) ; b) Set OSRunning to TRUE,
(0159) ; c) Switch to the highest priority task.
(0160) ;*******************************************************************************
(0161)
(0162) _OSStartHighRdy::
(0163) RCALL _OSTaskSwHook ; Invoke user defined context switch hook
_OSStartHighRdy:
028A DF0C RCALL _OSTaskSwHook
(0164) LDS R16,_OSRunning ; Indicate that we are multitasking
028B 91000204 LDS R16,_OSRunning
(0165) INC R16
028D 9503 INC R16
(0166) STS _OSRunning,R16 ;
028E 93000204 STS R16,_OSRunning
0290 D8B2 RCALL 0x0B43
(0167)
(0168) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
(0169) LDS R31,_OSTCBHighRdy+1 ; ready to run
(0170) LD R28,Z+ ; Load Y (R29:R28) pointer
0291 91C1 LD R28,Z+
(0171) LD R29,Z+ ;
0292 91D1 LD R29,Z+
0293 9109 LD R16,Y+
0294 BF0D OUT P3D,R16
0295 9109 LD R16,Y+
0296 BF0E OUT P3E,R16
0297 9109 LD R16,Y+
0298 BF0F OUT P3F,R16
0299 91F9 LD R31,Y+
029A 91E9 LD R30,Y+
029B D875 RCALL 0x0B11
029C 9179 LD R23,Y+
029D 9169 LD R22,Y+
029E 9159 LD R21,Y+
029F 9149 LD R20,Y+
02A0 9139 LD R19,Y+
02A1 9129 LD R18,Y+
02A2 9119 LD R17,Y+
02A3 9109 LD R16,Y+
02A4 90F9 LD R15,Y+
02A5 90E9 LD R14,Y+
02A6 90D9 LD R13,Y+
02A7 90C9 LD R12,Y+
02A8 D86D RCALL 0x0B16
02A9 9079 LD R7,Y+
02AA 9069 LD R6,Y+
02AB 9059 LD R5,Y+
02AC 9049 LD R4,Y+
02AD 9039 LD R3,Y+
02AE 9029 LD R2,Y+
02AF 9019 LD R1,Y+
02B0 9009 LD R0,Y+
(0172)
(0173) POPSP ; Restore stack pointer
(0174) POPSREG ; Restore status register
(0175) POPRS ; Restore all registers
(0176) RET ; start task
02B1 9508 RET
_OSCtxSw:
02B2 D7C6 RCALL 0x0A79
02B3 930A ST R16,-Y
02B4 B70E IN R16,P3E
02B5 930A ST R16,-Y
02B6 B70D IN R16,P3D
02B7 930A ST R16,-Y
02B8 D7BB RCALL 0x0A74
(0177)
(0178) ;*******************************************************************************
(0179) ; TASK LEVEL CONTEXT SWITCH
(0180) ;
(0181) ; Description : This function is called when a task makes a higher priority task
(0182) ; ready-to-run.
(0183) ;
(0184) ; Note(s):
(0185) ; 1) Upon entry,
(0186) ; OSTCBCur points to the OS_TCB of the task to suspend
(0187) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0188) ;
(0189) ; 2) The stack frame of the task to suspend looks as follows:
(0190) ;
(0191) ; SP +0 --> LSB of task code address
(0192) ; +1 MSB of task code address (High memory)
(0193) ;
(0194) ; 3) The saved context of the task to resume looks as follows:
(0195) ;
(0196) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
(0197) ; MSB of (return) stack pointer
(0198) ; Flags to load in status register
(0199) ; R31
(0200) ; R30
(0201) ; R7
(0202) ; .
(0203) ; .
(0204) ; .
(0205) ; R0 (High memory)
(0206) ;*******************************************************************************
(0207)
(0208) _OSCtxSw:: PUSHRS ; Save current task's context
(0209) PUSHSREG
(0210) PUSHSP
(0211)
(0212) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0213) LDS R31,_OSTCBCur+1 ;
(0214) ST Z+,R28 ; Save Y (R29:R28) pointer
02B9 93C1 ST R28,Z+
(0215) ST Z+,R29 ;
02BA 93D1 ST R29,Z+
(0216)
(0217) RCALL _OSTaskSwHook ; RCALL user defined task switch hook
02BB DEDB RCALL _OSTaskSwHook
(0218)
(0219) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
02BC 91000208 LDS R16,_OSPrioHighRdy
(0220) STS _OSPrioCur,R16
02BE 93000209 STS R16,_OSPrioCur
02C0 D882 RCALL 0x0B43
(0221)
(0222) LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
(0223) LDS R31,_OSTCBHighRdy+1 ; ready to run
(0224) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
02C1 93E00201 STS R30,_OSTCBCur
(0225) STS _OSTCBCur+1,R31 ;
02C3 93F00202 STS R31,_OSTCBCur+1
(0226)
(0227) LD R28,Z+ ; Restore Y pointer
02C5 91C1 LD R28,Z+
(0228) LD R29,Z+ ;
02C6 91D1 LD R29,Z+
02C7 9109 LD R16,Y+
02C8 BF0D OUT P3D,R16
02C9 9109 LD R16,Y+
02CA BF0E OUT P3E,R16
02CB 9109 LD R16,Y+
02CC BF0F OUT P3F,R16
02CD 91F9 LD R31,Y+
02CE 91E9 LD R30,Y+
02CF D841 RCALL 0x0B11
02D0 9179 LD R23,Y+
02D1 9169 LD R22,Y+
02D2 9159 LD R21,Y+
02D3 9149 LD R20,Y+
02D4 9139 LD R19,Y+
02D5 9129 LD R18,Y+
02D6 9119 LD R17,Y+
02D7 9109 LD R16,Y+
02D8 90F9 LD R15,Y+
02D9 90E9 LD R14,Y+
02DA 90D9 LD R13,Y+
02DB 90C9 LD R12,Y+
02DC D839 RCALL 0x0B16
02DD 9079 LD R7,Y+
02DE 9069 LD R6,Y+
02DF 9059 LD R5,Y+
02E0 9049 LD R4,Y+
02E1 9039 LD R3,Y+
02E2 9029 LD R2,Y+
02E3 9019 LD R1,Y+
02E4 9009 LD R0,Y+
(0229)
(0230) POPSP ; Restore stack pointer
(0231) POPSREG ; Restore status register
(0232) POPRS ; Restore all registers
(0233) RET
02E5 9508 RET
(0234)
(0235)
(0236) ;*******************************************************************************
(0237) ; INTERRUPT LEVEL CONTEXT SWITCH
(0238) ;
(0239) ; Description : This function is called by OSIntExit() to perform a context
(0240) ; switch to a task that has been made ready-to-run by an ISR.
(0241) ;
(0242) ; Note(s):
(0243) ; 1) Upon entry,
(0244) ; OSTCBCur points to the OS_TCB of the task to suspend
(0245) ; OSTCBHighRdy points to the OS_TCB of the task to resume
(0246) ;
(0247) ; 2) The stack frame of the task to suspend looks as follows:
(0248) ;
(0249) ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
(0250) ; +1 MSB of return address of OSIntCtxSw()
(0251) ; +2 LSB of return address of OSIntExit()
(0252) ; +3 MSB of return address of OSIntExit()
(0253) ; +4 LSB of task code address
(0254) ; +5 MSB of task code address (High memory)
(0255) ;
(0256) ; 3) The saved context of the task to resume looks as follows:
(0257) ;
(0258) ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
(0259) ; MSB of (return) stack pointer
(0260) ; Flags to load in status register
(0261) ; R31
(0262) ; R30
(0263) ; R7
(0264) ; .
(0265) ; .
(0266) ; .
(0267) ; R0 (High memory)
(0268) ;*******************************************************************************
(0269)
(0270) _OSIntCtxSw::
(0271) IN R30,SPL ; Z = SP
_OSIntCtxSw:
02E6 B7ED IN R30,P3D
(0272) IN R31,SPH
02E7 B7FE IN R31,P3E
(0273) ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
(0274) ADIW R30,5 ; Adjust Z to point to task return address
02E8 9635 ADIW R30,5
(0275) ST -Y,R31 ; Save SP
02E9 93FA ST R31,-Y
(0276) ST -Y,R30 ;
02EA 93EA ST R30,-Y
02EB D788 RCALL 0x0A74
(0277)
(0278) LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0279) LDS R31,_OSTCBCur+1 ;
(0280) ST Z+,R28 ; Save Y pointer
02EC 93C1 ST R28,Z+
(0281) ST Z+,R29 ;
02ED 93D1 ST R29,Z+
(0282)
(0283) RCALL _OSTaskSwHook ; RCALL user defined task switch hook
02EE DEA8 RCALL _OSTaskSwHook
(0284)
(0285) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
02EF 91000208 LDS R16,_OSPrioHighRdy
(0286) STS _OSPrioCur,R16 ;
02F1 93000209 STS R16,_OSPrioCur
02F3 D84F RCALL 0x0B43
(0287)
(0288) LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
(0289) LDS R31,_OSTCBHighRdy+1 ;
(0290) STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
02F4 93E00201 STS R30,_OSTCBCur
(0291) STS _OSTCBCur+1,R31 ;
02F6 93F00202 STS R31,_OSTCBCur+1
(0292)
(0293) LD R28,Z+ ; Restore Y pointer
02F8 91C1 LD R28,Z+
(0294) LD R29,Z+ ;
02F9 91D1 LD R29,Z+
02FA 9109 LD R16,Y+
02FB BF0D OUT P3D,R16
02FC 9109 LD R16,Y+
02FD BF0E OUT P3E,R16
02FE 9109 LD R16,Y+
02FF BF0F OUT P3F,R16
0300 91F9 LD R31,Y+
0301 91E9 LD R30,Y+
0302 D80E RCALL 0x0B11
0303 9179 LD R23,Y+
0304 9169 LD R22,Y+
0305 9159 LD R21,Y+
0306 9149 LD R20,Y+
0307 9139 LD R19,Y+
0308 9129 LD R18,Y+
0309 9119 LD R17,Y+
030A 9109 LD R16,Y+
030B 90F9 LD R15,Y+
030C 90E9 LD R14,Y+
030D 90D9 LD R13,Y+
030E 90C9 LD R12,Y+
030F D806 RCALL 0x0B16
0310 9079 LD R7,Y+
0311 9069 LD R6,Y+
0312 9059 LD R5,Y+
0313 9049 LD R4,Y+
0314 9039 LD R3,Y+
0315 9029 LD R2,Y+
0316 9019 LD R1,Y+
0317 9009 LD R0,Y+
(0295)
(0296) POPSP ; Restore stack pointer
(0297) POPSREG ; Restore status register
(0298) POPRS ; Restore saved registers
(0299) RET
0318 9508 RET
(0300)
(0301)
(0302) ;old code
(0303) ; IN R30,SPL ; Z = SP
(0304) ; IN R31,SPH
(0305) ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
(0306) ; ADIW R30,5 ; Adjust Z to point to task return address
(0307) ; ST -Y,R31 ; Save SP
(0308) ; ST -Y,R30 ;
(0309) ;
(0310) ; LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
(0311) ; LDS R31,_OSTCBCur+1 ;
(0312) ; ST Z+,R28 ; Save Y pointer
(0313) ; ST Z+,R29 ;
(0314) ;
(0315) ; RCALL _OSTaskSwHook ; RCALL user defined task switch hook
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -