⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos_ii.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -