📄 os-task-sem.lst
字号:
__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 30EC CPI R30,0xC
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 D0CC 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-sem\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 91000209 LDS R16,_OSRunning
(0165) INC R16
0032 9503 INC R16
(0166) STS _OSRunning,R16 ;
0033 93000209 STS R16,_OSRunning
0035 D61A RCALL 0x0650
(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 9109 LD R16,Y+
003D BF0F OUT P3F,R16
003E 91F9 LD R31,Y+
003F 91E9 LD R30,Y+
0040 91B9 LD R27,Y+
0041 91A9 LD R26,Y+
0042 9199 LD R25,Y+
0043 9189 LD R24,Y+
0044 9179 LD R23,Y+
0045 9169 LD R22,Y+
0046 9159 LD R21,Y+
0047 9149 LD R20,Y+
0048 9139 LD R19,Y+
0049 9129 LD R18,Y+
004A 9119 LD R17,Y+
004B 9109 LD R16,Y+
004C 90F9 LD R15,Y+
004D 90E9 LD R14,Y+
004E 90D9 LD R13,Y+
004F 90C9 LD R12,Y+
0050 90B9 LD R11,Y+
0051 90A9 LD R10,Y+
0052 9099 LD R9,Y+
0053 9089 LD R8,Y+
0054 9079 LD R7,Y+
0055 9069 LD R6,Y+
0056 9059 LD R5,Y+
0057 9049 LD R4,Y+
0058 9039 LD R3,Y+
0059 9029 LD R2,Y+
005A 9019 LD R1,Y+
005B 9009 LD R0,Y+
(0172)
(0173) POPSP ; Restore stack pointer
(0174) POPSREG ; Restore status register
(0175) POPRS ; Restore all registers
(0176) RET ; start task
005C 9508 RET
_OSCtxSw:
005D D58A RCALL 0x05E8
005E 930A ST R16,-Y
005F B70E IN R16,P3E
0060 930A ST R16,-Y
0061 B70D IN R16,P3D
0062 930A ST R16,-Y
0063 D5AA RCALL 0x060E
(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
0064 93C1 ST R28,Z+
(0215) ST Z+,R29 ;
0065 93D1 ST R29,Z+
(0216)
(0217) LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
0066 910001FF LDS R16,_OSPrioHighRdy
(0218) STS _OSPrioCur,R16
0068 93000200 STS R16,_OSPrioCur
006A D5E5 RCALL 0x0650
(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
006B 93E001FD STS R30,_OSTCBCur
(0223) STS _OSTCBCur+1,R31 ;
006D 93F001FE STS R31,_OSTCBCur+1
(0224)
(0225) LD R28,Z+ ; Restore Y pointer
006F 91C1 LD R28,Z+
(0226) LD R29,Z+ ;
0070 91D1 LD R29,Z+
0071 9109 LD R16,Y+
0072 BF0D OUT P3D,R16
0073 9109 LD R16,Y+
0074 BF0E OUT P3E,R16
0075 9109 LD R16,Y+
0076 BF0F OUT P3F,R16
0077 91F9 LD R31,Y+
0078 91E9 LD R30,Y+
0079 91B9 LD R27,Y+
007A 91A9 LD R26,Y+
007B 9199 LD R25,Y+
007C 9189 LD R24,Y+
007D 9179 LD R23,Y+
007E 9169 LD R22,Y+
007F 9159 LD R21,Y+
0080 9149 LD R20,Y+
0081 9139 LD R19,Y+
0082 9129 LD R18,Y+
0083 9119 LD R17,Y+
0084 9109 LD R16,Y+
0085 90F9 LD R15,Y+
0086 90E9 LD R14,Y+
0087 90D9 LD R13,Y+
0088 90C9 LD R12,Y+
0089 90B9 LD R11,Y+
008A 90A9 LD R10,Y+
008B 9099 LD R9,Y+
008C 9089 LD R8,Y+
008D 9079 LD R7,Y+
008E 9069 LD R6,Y+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -