www.pudn.com > iccavrUCOS_m64.rar > os_cpu_a.lis
0000 ;*******************************************************************************
0000 ; uC/OS-II
0000 ; The Real-Time Kernel
0000 ;
0000 ; ATmega103 Specific code
0000 ; (ICC V6.21)
0000 ;
0000 ;
0000 ; File: OS_CPU_A.S
0000 ; By: Ole Saether
0000 ; Modified by: Joerg Meyer
0000 ; Port Version: V1.00
0000 ;
0000 ;
0000 ;*******************************************************************************
0000
0000 ;include
0000
0000 ;*******************************************************************************
0000 ; I/O PORT ADDRESSES
0000 ;*******************************************************************************
0000
0000
003F SREG = 0x3F
003E SPH = 0x3E
003D SPL = 0x3D
003B RAMPZ = 0x3B
0032 TCNT0 = 0x32
0024 TCNT2 = 0x24
0000
0000
0000 ;*******************************************************************************
0000 ; MACROS
0000 ;*******************************************************************************
0000
0000 ; Push registers
0000 .macro PUSHRS
0000 ST -Y,R0
0000 ST -Y,R1
0000 ST -Y,R2
0000 ST -Y,R3
0000 ST -Y,R4
0000 ST -Y,R5
0000 ST -Y,R6
0000 ST -Y,R7
0000 ST -Y,R8
0000 ST -Y,R9
0000 ST -Y,R10
0000 ST -Y,R11
0000 ST -Y,R12
0000 ST -Y,R13
0000 ST -Y,R14
0000 ST -Y,R15
0000 ST -Y,R16
0000 ST -Y,R17
0000 ST -Y,R18
0000 ST -Y,R19
0000 ST -Y,R20
0000 ST -Y,R21
0000 ST -Y,R22
0000 ST -Y,R23
0000 ST -Y,R24
0000 ST -Y,R25
0000 ST -Y,R26
0000 ST -Y,R27
0000 ST -Y,R30
0000 ST -Y,R31
0000 .macro POPRS
0000 LD R31,Y+
0000 LD R30,Y+
0000 LD R27,Y+
0000 LD R26,Y+
0000 LD R25,Y+
0000 LD R24,Y+
0000 LD R23,Y+
0000 LD R22,Y+
0000 LD R21,Y+
0000 LD R20,Y+
0000 LD R19,Y+
0000 LD R18,Y+
0000 LD R17,Y+
0000 LD R16,Y+
0000 LD R15,Y+
0000 LD R14,Y+
0000 LD R13,Y+
0000 LD R12,Y+
0000 LD R11,Y+
0000 LD R10,Y+
0000 LD R9,Y+
0000 LD R8,Y+
0000 LD R7,Y+
0000 LD R6,Y+
0000 LD R5,Y+
0000 LD R4,Y+
0000 LD R3,Y+
0000 LD R2,Y+
0000 LD R1,Y+
0000 LD R0,Y+
0000 .macro PUSHSP
0000 IN R16,SPH
0000 ST -Y,R16
0000 IN R16,SPL
0000 ST -Y,R16
0000 .macro POPSP
0000 LD R16,Y+
0000 OUT SPL,R16
0000 LD R16,Y+
0000 OUT SPH,R16
0000 .macro PUSHSREG
0000 IN R16,SREG
0000 ST -Y,R16
0000 .macro POPSREG
0000 LD R16,Y+
0000 OUT SREG,R16
.area text(rel)
;*******************************************************************************
; START HIGHEST PRIORITY TASK READY-TO-RUN
;
; Description : This function is called by OSStart() to start the highest
; priority task that was created by your application before calling OSStart().
;
; Note(s):
; 1) The (data)stack frame is assumed to look as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
; MSB of (return) stack pointer
; Flags to load in status register
; R31
; R30
; R7
; .
; .
; .
; R0 (High memory)
;
; where the stack pointer points to the task start address.
;
;
; 2) OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*******************************************************************************
0000 _OSStartHighRdy::
0000 00910000 LDS R16,_OSRunning ; Indicate that we are multitasking
0004 0395 INC R16
0006 00930000 STS _OSRunning,R16 ;
000A
000A E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
000E F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
0012 C191 LD R28,Z+ ; Load Y (R29:R28) pointer
0014 D191 LD R29,Z+ ;
0016
0016 0991 LD R16,Y+
0018 0DBF OUT SPL,R16
001A 0991 LD R16,Y+
001C 0EBF OUT SPH,R16
001E 0991 LD R16,Y+
0020 0FBF OUT SREG,R16
0022 F991 LD R31,Y+
0024 E991 LD R30,Y+
0026 B991 LD R27,Y+
0028 A991 LD R26,Y+
002A 9991 LD R25,Y+
002C 8991 LD R24,Y+
002E 7991 LD R23,Y+
0030 6991 LD R22,Y+
0032 5991 LD R21,Y+
0034 4991 LD R20,Y+
0036 3991 LD R19,Y+
0038 2991 LD R18,Y+
003A 1991 LD R17,Y+
003C 0991 LD R16,Y+
003E F990 LD R15,Y+
0040 E990 LD R14,Y+
0042 D990 LD R13,Y+
0044 C990 LD R12,Y+
0046 B990 LD R11,Y+
0048 A990 LD R10,Y+
004A 9990 LD R9,Y+
004C 8990 LD R8,Y+
004E 7990 LD R7,Y+
0050 6990 LD R6,Y+
0052 5990 LD R5,Y+
0054 4990 LD R4,Y+
0056 3990 LD R3,Y+
0058 2990 LD R2,Y+
005A 1990 LD R1,Y+
005C 0990 LD R0,Y+
005E 0895 RET ; start task
0060
0060 ;*******************************************************************************
0060 ; TASK LEVEL CONTEXT SWITCH
0060 ;
0060 ; Description : This function is called when a task makes a higher priority task
0060 ; ready-to-run.
0060 ;
0060 ; Note(s):
0060 ; 1) Upon entry,
0060 ; OSTCBCur points to the OS_TCB of the task to suspend
0060 ; OSTCBHighRdy points to the OS_TCB of the task to resume
0060 ;
0060 ; 2) The stack frame of the task to suspend looks as follows:
0060 ;
0060 ; SP +0 --> LSB of task code address
0060 ; +1 MSB of task code address (High memory)
0060 ;
0060 ; 3) The saved context of the task to resume looks as follows:
0060 ;
0060 ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
0060 ; MSB of (return) stack pointer
0060 ; Flags to load in status register
0060 ; R31
0060 ; R30
0060 ; R7
0060 ; .
0060 ; .
0060 ; .
0060 ; R0 (High memory)
0060 ;*******************************************************************************
0060
0060 _OSCtxSw::
0060 0A92 ST -Y,R0
0062 1A92 ST -Y,R1
0064 2A92 ST -Y,R2
0066 3A92 ST -Y,R3
0068 4A92 ST -Y,R4
006A 5A92 ST -Y,R5
006C 6A92 ST -Y,R6
006E 7A92 ST -Y,R7
0070 8A92 ST -Y,R8
0072 9A92 ST -Y,R9
0074 AA92 ST -Y,R10
0076 BA92 ST -Y,R11
0078 CA92 ST -Y,R12
007A DA92 ST -Y,R13
007C EA92 ST -Y,R14
007E FA92 ST -Y,R15
0080 0A93 ST -Y,R16
0082 1A93 ST -Y,R17
0084 2A93 ST -Y,R18
0086 3A93 ST -Y,R19
0088 4A93 ST -Y,R20
008A 5A93 ST -Y,R21
008C 6A93 ST -Y,R22
008E 7A93 ST -Y,R23
0090 8A93 ST -Y,R24
0092 9A93 ST -Y,R25
0094 AA93 ST -Y,R26
0096 BA93 ST -Y,R27
0098 EA93 ST -Y,R30
009A FA93 ST -Y,R31
009C 0FB7 IN R16,SREG
009E 0A93 ST -Y,R16
00A0 0EB7 IN R16,SPH
00A2 0A93 ST -Y,R16
00A4 0DB7 IN R16,SPL
00A6 0A93 ST -Y,R16
00A8
00A8 E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
00AC F0910100 LDS R31,_OSTCBCur+1 ;
00B0 C193 ST Z+,R28 ; Save Y (R29:R28) pointer
00B2 D193 ST Z+,R29 ;
00B4
00B4 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
00B8 00930000 STS _OSPrioCur,R16
00BC
00BC E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
00C0 F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
00C4 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
00C8 F0930100 STS _OSTCBCur+1,R31 ;
00CC
00CC C191 LD R28,Z+ ; Restore Y pointer
00CE D191 LD R29,Z+ ;
00D0
00D0 0991 LD R16,Y+
00D2 0DBF OUT SPL,R16
00D4 0991 LD R16,Y+
00D6 0EBF OUT SPH,R16
00D8 0991 LD R16,Y+
00DA 0FBF OUT SREG,R16
00DC F991 LD R31,Y+
00DE E991 LD R30,Y+
00E0 B991 LD R27,Y+
00E2 A991 LD R26,Y+
00E4 9991 LD R25,Y+
00E6 8991 LD R24,Y+
00E8 7991 LD R23,Y+
00EA 6991 LD R22,Y+
00EC 5991 LD R21,Y+
00EE 4991 LD R20,Y+
00F0 3991 LD R19,Y+
00F2 2991 LD R18,Y+
00F4 1991 LD R17,Y+
00F6 0991 LD R16,Y+
00F8 F990 LD R15,Y+
00FA E990 LD R14,Y+
00FC D990 LD R13,Y+
00FE C990 LD R12,Y+
0100 B990 LD R11,Y+
0102 A990 LD R10,Y+
0104 9990 LD R9,Y+
0106 8990 LD R8,Y+
0108 7990 LD R7,Y+
010A 6990 LD R6,Y+
010C 5990 LD R5,Y+
010E 4990 LD R4,Y+
0110 3990 LD R3,Y+
0112 2990 LD R2,Y+
0114 1990 LD R1,Y+
0116 0990 LD R0,Y+
0118 0895 RET
011A
011A
011A ;*******************************************************************************
011A ; INTERRUPT LEVEL CONTEXT SWITCH
011A ;
011A ; Description : This function is called by OSIntExit() to perform a context
011A ; switch to a task that has been made ready-to-run by an ISR.
011A ;
011A ; Note(s):
011A ; 1) Upon entry,
011A ; OSTCBCur points to the OS_TCB of the task to suspend
011A ; OSTCBHighRdy points to the OS_TCB of the task to resume
011A ;
011A ; 2) The stack frame of the task to suspend looks as follows:
011A ;
011A ; SP +0 --> LSB of return address of OSIntCtxSw() (Low memory)
011A ; +1 MSB of return address of OSIntCtxSw()
011A ; +2 LSB of return address of OSIntExit()
011A ; +3 MSB of return address of OSIntExit()
011A ; +4 LSB of task code address
011A ; +5 MSB of task code address (High memory)
011A ;
011A ; 3) The saved context of the task to resume looks as follows:
011A ;
011A ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low mem)
011A ; MSB of (return) stack pointer
011A ; Flags to load in status register
011A ; R31
011A ; R30
011A ; R7
011A ; .
011A ; .
011A ; .
011A ; R0 (High memory)
011A ;*******************************************************************************
011A
011A _OSIntCtxSw::
011A EDB7 IN R30,SPL ; Z = SP
011C FEB7 IN R31,SPH
011E ; ADIW R30,4 ; (Uncomment if OS_CRITICAL_METHOD is 1, see OS_CPU.H)
011E 3596 ADIW R30,5 ; Adjust Z to point to task return address
0120 FA93 ST -Y,R31 ; Save SP
0122 EA93 ST -Y,R30 ;
0124
0124 E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
0128 F0910100 LDS R31,_OSTCBCur+1 ;
012C C193 ST Z+,R28 ; Save Y pointer
012E D193 ST Z+,R29 ;
0130
0130 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
0134 00930000 STS _OSPrioCur,R16 ;
0138
0138 E0910000 LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
013C F0910100 LDS R31,_OSTCBHighRdy+1 ;
0140 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
0144 F0930100 STS _OSTCBCur+1,R31 ;
0148
0148 C191 LD R28,Z+ ; Restore Y pointer
014A D191 LD R29,Z+ ;
014C 0991 LD R16,Y+
014E 0DBF OUT SPL,R16
0150 0991 LD R16,Y+
0152 0EBF OUT SPH,R16
0154 0991 LD R16,Y+
0156 0FBF OUT SREG,R16
0158 F991 LD R31,Y+
015A E991 LD R30,Y+
015C B991 LD R27,Y+
015E A991 LD R26,Y+
0160 9991 LD R25,Y+
0162 8991 LD R24,Y+
0164 7991 LD R23,Y+
0166 6991 LD R22,Y+
0168 5991 LD R21,Y+
016A 4991 LD R20,Y+
016C 3991 LD R19,Y+
016E 2991 LD R18,Y+
0170 1991 LD R17,Y+
0172 0991 LD R16,Y+
0174 F990 LD R15,Y+
0176 E990 LD R14,Y+
0178 D990 LD R13,Y+
017A C990 LD R12,Y+
017C B990 LD R11,Y+
017E A990 LD R10,Y+
0180 9990 LD R9,Y+
0182 8990 LD R8,Y+
0184 7990 LD R7,Y+
0186 6990 LD R6,Y+
0188 5990 LD R5,Y+
018A 4990 LD R4,Y+
018C 3990 LD R3,Y+
018E 2990 LD R2,Y+
0190 1990 LD R1,Y+
0192 0990 LD R0,Y+
0194 0895 RET
0196
0196 ;******************************************************************************
0196 ; SYSTEM TICK ISR
0196 ;
0196 ; Description: This function is the ISR used to notify uC/OS-II that a system
0196 ; tick has occurred.
0196 ;
0196 ;
0196 ;*******************************************************************************
0196 ;
0196 _OSTickISR::
0196 0000 NOP
0198 0A92 ST -Y,R0
019A 1A92 ST -Y,R1
019C 2A92 ST -Y,R2
019E 3A92 ST -Y,R3
01A0 4A92 ST -Y,R4
01A2 5A92 ST -Y,R5
01A4 6A92 ST -Y,R6
01A6 7A92 ST -Y,R7
01A8 8A92 ST -Y,R8
01AA 9A92 ST -Y,R9
01AC AA92 ST -Y,R10
01AE BA92 ST -Y,R11
01B0 CA92 ST -Y,R12
01B2 DA92 ST -Y,R13
01B4 EA92 ST -Y,R14
01B6 FA92 ST -Y,R15
01B8 0A93 ST -Y,R16
01BA 1A93 ST -Y,R17
01BC 2A93 ST -Y,R18
01BE 3A93 ST -Y,R19
01C0 4A93 ST -Y,R20
01C2 5A93 ST -Y,R21
01C4 6A93 ST -Y,R22
01C6 7A93 ST -Y,R23
01C8 8A93 ST -Y,R24
01CA 9A93 ST -Y,R25
01CC AA93 ST -Y,R26
01CE BA93 ST -Y,R27
01D0 EA93 ST -Y,R30
01D2 FA93 ST -Y,R31
01D4 0FB7 IN R16, SREG
01D6 0068 SBR R16, 0x80 ; bei Aufruf dieser ISR geloeschtes I-Flag setzen
01D8 0A93 ST -Y, R16
01DA
01DA ; TimerCounter aufrischen
01DA 06E0 LDI R16,6; Reload TC_2, 2ms bei 8MHz
01DC 04BD OUT TCNT2,R16
01DE
01DE 00910000 LDS R16,_OSIntNesting ; Notify uC/OS-II of ISR
01E2 0395 INC R16 ;
01E4 00930000 STS _OSIntNesting,R16 ;
01E8
01E8 0E940000 CALL _OSTimeTick ; Call uC/OS-II's tick updating function
01EC ; bearbeitet die tasktimer, wenn 0 --> deren Prio in Aufruftab stellen
01EC
01EC 0E940000 CALL _OSIntExit ; Notify uC/OS-II about end of ISR
01F0 ; fuehrt gegebenfalls einen Context-Switch aus
01F0
01F0 0991 LD R16,Y+
01F2 0FBF OUT SREG,R16
01F4 F991 LD R31,Y+
01F6 E991 LD R30,Y+
01F8 B991 LD R27,Y+
01FA A991 LD R26,Y+
01FC 9991 LD R25,Y+
01FE 8991 LD R24,Y+
0200 7991 LD R23,Y+
0202 6991 LD R22,Y+
0204 5991 LD R21,Y+
0206 4991 LD R20,Y+
0208 3991 LD R19,Y+
020A 2991 LD R18,Y+
020C 1991 LD R17,Y+
020E 0991 LD R16,Y+
0210 F990 LD R15,Y+
0212 E990 LD R14,Y+
0214 D990 LD R13,Y+
0216 C990 LD R12,Y+
0218 B990 LD R11,Y+
021A A990 LD R10,Y+
021C 9990 LD R9,Y+
021E 8990 LD R8,Y+
0220 7990 LD R7,Y+
0222 6990 LD R6,Y+
0224 5990 LD R5,Y+
0226 4990 LD R4,Y+
0228 3990 LD R3,Y+
022A 2990 LD R2,Y+
022C 1990 LD R1,Y+
022E 0990 LD R0,Y+
0230 ;RET ; Note: RET instead of RETI
0230
0230 ;*******************************************************************************
0230 ;
0230 ;*******************************************************************************
0230