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

📄 os-task-switch.lst

📁 ucos-ii-at90S-icc-avr
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0010 E5CF      LDI	R28,0x5F
    0011 E0D2      LDI	R29,2
    0012 BFCD      OUT	P3D,R28
    0013 BFDE      OUT	P3E,R29
    0014 51C0      SUBI	R28,0x10
    0015 40D0      SBCI	R29,0
    0016 EA0A      LDI	R16,0xAA
    0017 8308      STD	R16,0+Y
    0018 2400      CLR	R0
    0019 E6E0      LDI	R30,0x60
    001A E0F0      LDI	R31,0
    001B E012      LDI	R17,2
    001C 30E1      CPI	R30,1
    001D 07F1      CPC	R31,R17
    001E F011      BEQ	0x0021
    001F 9201      ST	R0,Z+
    0020 CFFB      RJMP	0x001C
    0021 8300      STD	R16,0+Z
    0022 E2E0      LDI	R30,0x20
    0023 E0F0      LDI	R31,0
    0024 E6A0      LDI	R26,0x60
    0025 E0B0      LDI	R27,0
    0026 E010      LDI	R17,0
    0027 32E0      CPI	R30,0x20
    0028 07F1      CPC	R31,R17
    0029 F021      BEQ	0x002E
    002A 95C8      LPM
    002B 9631      ADIW	R30,1
    002C 920D      ST	R0,X+
    002D CFF9      RJMP	0x0027
    002E D052      RCALL	_main
_exit:
    002F CFFF      RJMP	_exit
FILE: G:\编程2002-10-15-HOME\做过的项目\2002-10-22\home-c\software\ucos-ii-at90S-icc-avr\os-task-switch\os_cpu_a.s
(0001) ;*******************************************************************************
(0002) ;                                   uC/OS-II
(0003) ;                             The Real-Time Kernel
(0004) ;
(0005) ;                         AT90 Specific code
(0006) ;                               (ICC V6.21)
(0007) ;
(0008) ;
(0009) ; File:			OS_CPU_A.S
(0010) ; By:			
(0011) ; Modified by:	
(0012) ; Port Version:	V1.00
(0013) ;
(0014) ;
(0015) ;*******************************************************************************
(0016) 
(0017) ;include 
(0018) 
(0019) ;*******************************************************************************
(0020) ;                 I/O PORT ADDRESSES
(0021) ;*******************************************************************************
(0022) 
(0023) SREG	=0x3F
(0024) SPH	=0x3E
(0025) SPL	=0x3D
(0026) TCNT0	=0x32
(0027) 
(0028) PIND    = 0x10
(0029) PORTD   = 0x12
(0030) 
(0031) ;*******************************************************************************
(0032) ;                MACROS
(0033) ;*******************************************************************************
(0034) 
(0035) 				; Push registers
(0036) .macro PUSHRS
(0037)                 ST      -Y,R0	
(0038)                 ST      -Y,R1
(0039)                 ST      -Y,R2
(0040)                 ST      -Y,R3
(0041)                 ST      -Y,R4
(0042)                 ST      -Y,R5
(0043)                 ST      -Y,R6
(0044)                 ST      -Y,R7
(0045)                 ST      -Y,R8
(0046)                 ST      -Y,R9
(0047)                 ST      -Y,R10
(0048)                 ST      -Y,R11
(0049)                 ST      -Y,R12
(0050)                 ST      -Y,R13
(0051)                 ST      -Y,R14
(0052)                 ST      -Y,R15
(0053)                 ST      -Y,R16
(0054)                 ST      -Y,R17
(0055)                 ST      -Y,R18
(0056)                 ST      -Y,R19
(0057)                 ST      -Y,R20
(0058)                 ST      -Y,R21
(0059)                 ST      -Y,R22
(0060)                 ST      -Y,R23
(0061)                 ST      -Y,R24
(0062)                 ST      -Y,R25
(0063)                 ST      -Y,R26
(0064)                 ST      -Y,R27
(0065)                 ST      -Y,R30
(0066)                 ST      -Y,R31
(0067) .endmacro
(0068) 
(0069) 				; Pop registers
(0070) .macro POPRS
(0071)                 LD      R31,Y+
(0072)                 LD      R30,Y+
(0073)                 LD      R27,Y+
(0074)                 LD      R26,Y+
(0075)                 LD      R25,Y+
(0076)                 LD      R24,Y+
(0077)                 LD      R23,Y+
(0078)                 LD      R22,Y+
(0079)                 LD      R21,Y+
(0080)                 LD      R20,Y+
(0081)                 LD      R19,Y+
(0082)                 LD      R18,Y+
(0083)                 LD      R17,Y+
(0084)                 LD      R16,Y+
(0085)                 LD      R15,Y+
(0086)                 LD      R14,Y+
(0087)                 LD      R13,Y+
(0088)                 LD      R12,Y+
(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) ;*******************************************************************************
(0135) ;               START HIGHEST PRIORITY TASK READY-TO-RUN
(0136) ;
(0137) ; Description : This function is called by OSStart() to start the highest
(0138) ; priority task that was created by your application before calling OSStart().
(0139) ;
(0140) ; Note(s):
(0141) ;	1) The (data)stack frame is assumed to look as follows:
(0142) ;
(0143) ;		OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
(0144) ;										MSB of (return) stack pointer
(0145) ;										Flags to load in status register
(0146) ;										R31
(0147) ;										R30
(0148) ;										R7
(0149) ;										.
(0150) ;										.
(0151) ;										.
(0152) ;										R0  (High memory)
(0153) ;
(0154) ;		where the stack pointer points to the task start address.
(0155) ;
(0156) ;
(0157) ;	2) OSStartHighRdy() MUST:
(0158) ;		a) RCALL OSTaskSwHook() then,
(0159) ;		b) Set OSRunning to TRUE,
(0160) ;		c) Switch to the highest priority task.
(0161) ;*******************************************************************************
(0162) 
(0163) _OSStartHighRdy:: 
(0164) 		LDS     R16,_OSRunning		; Indicate that we are multitasking
_OSStartHighRdy:
    0030 91000200  LDS	R16,_OSRunning
(0165) 		INC     R16					
    0032 9503      INC	R16
(0166) 		STS     _OSRunning,R16		;
    0033 93000200  STS	R16,_OSRunning
    0035 D3BF      RCALL	0x03F5
(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
    0036 91C1      LD	R28,Z+
(0171) 		LD      R29,Z+				;
    0037 91D1      LD	R29,Z+
    0038 9109      LD	R16,Y+
    0039 BF0D      OUT	P3D,R16
    003A 9109      LD	R16,Y+
    003B BF0E      OUT	P3E,R16
    003C D358      RCALL	0x0395
(0172) 
(0173)                 POPSP                               ; Restore stack pointer
(0174)                 POPSREG                             ; Restore status register
(0175)                 POPRS                               ; Restore all registers
(0176) 	RET			; start task
    003D 9508      RET
_OSCtxSw:
    003E D377      RCALL	0x03B6
    003F 930A      ST	R16,-Y
    0040 B70E      IN	R16,P3E
    0041 930A      ST	R16,-Y
    0042 B70D      IN	R16,P3D
    0043 930A      ST	R16,-Y
    0044 D3AB      RCALL	0x03F0
(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
    0045 93C1      ST	R28,Z+
(0215) 		ST      Z+,R29				;
    0046 93D1      ST	R29,Z+
(0216) 	
(0217) 		LDS     R16,_OSPrioHighRdy	; OSPrioCur = OSPrioHighRdy
    0047 910001F6  LDS	R16,_OSPrioHighRdy
(0218) 		STS     _OSPrioCur,R16
    0049 930001F7  STS	R16,_OSPrioCur
    004B D3A9      RCALL	0x03F5
(0219) 	
(0220) 		LDS     R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
(0221) 		LDS     R31,_OSTCBHighRdy+1	; ready to run
(0222) 		STS     _OSTCBCur,R30		; OSTCBCur = OSTCBHighRdy
    004C 93E001F4  STS	R30,_OSTCBCur
(0223) 		STS     _OSTCBCur+1,R31 	;
    004E 93F001F5  STS	R31,_OSTCBCur+1
(0224) 
(0225) 		LD      R28,Z+		; Restore Y pointer
    0050 91C1      LD	R28,Z+
(0226) 		LD      R29,Z+		;
    0051 91D1      LD	R29,Z+
    0052 9109      LD	R16,Y+
    0053 BF0D      OUT	P3D,R16
    0054 9109      LD	R16,Y+
    0055 BF0E      OUT	P3E,R16
    0056 D33E      RCALL	0x0395
(0227) 
(0228)                 POPSP                               ; Restore stack pointer
(0229)                 POPSREG                             ; Restore status register
(0230)                 POPRS                               ; Restore all registers 
(0231)                 RET
    0057 9508      RET
_OSTickISR:
    0058 D35D      RCALL	0x03B6
(0232) 
(0233) _OSTickISR::    
(0234)                 PUSHRS                              ; Save interrupted task's context
(0235) 
(0236)                 IN      R16,SREG
(0237) ;move to end
(0238)                 SBR     R16,0x80                    ; Set interrupt bit in status reg and save
    0059 6800      ORI	R16,0x80
(0239)                 ST      -Y,R16
    005A 930A      ST	R16,-Y
(0240) ;                PUSHSP
(0241) 
(0242) ;avr-gcc ->11059200
(0243)                 LDI     R16,256-(8000000/50/1024)   ; Reload timer to overflow at a rate of 50Hz
    005B E604      LDI	R16,0x64
(0244)                 OUT     TCNT0,R16                   ; at a prescaler of 1024 and 7.3728 MHz AVR clock
    005C BF02      OUT	P32,R16
(0245) 
(0246)                 LDS     R16,_OSIntNesting            ; Notify uC/OS-II of ISR
    005D 910001F9  LDS	R16,_OSIntNesting
(0247)                 INC     R16                         ;
    005F 9503      INC	R16
(0248)                 STS     _OSIntNesting,R16            ;
    0060 930001F9  STS	R16,_OSIntNesting
(0249) 	
(0250) ;why?
(0251) ;                SEI                                 ; Enable interrupts
(0252)                 RCALL   _OSTimeTick                  ; RCALL uC/OS-II's tick updating function
    0062 D18C      RCALL	_OSTimeTick
(0253)                 RCALL   _OSIntExit                   ; Notify uC/OS-II about end of ISR
    0063 D1B9      RCALL	_OSIntExit
    0064 D330      RCALL	0x0395
(0254) 
(0255) ;                POPSP
(0256)                 POPSREG                             ; Restore status register
(0257)                 POPRS                               ; Restore all registers
(0258) 		SEI
    0065 9478      BSET	7
(0259) 		RET			; Note: RET instead of RETI
    0066 9508      RET
(0260) 
(0261) ;*******************************************************************************
(0262) ;               INTERRUPT LEVEL CONTEXT SWITCH
(0263) ;
(0264) ; Description : This function is called by OSIntExit() to perform a context
(0265) ; switch to a task that has been made ready-to-run by an ISR.
(0266) ;
(0267) ; Note(s):
(0268) ;	1) Upon entry,
(0269) ;		OSTCBCur     points to the OS_TCB of the task to suspend
(0270) ;		OSTCBHighRdy points to the OS_TCB of the task to resume

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -