?? os_cpu_a.lis
字號:
0000 ;*******************************************************************************
0000 ; uC/OS-II
0000 ; The Real-Time Kernel
0000 ;
0000 ; AT90 Specific code
0000 ; (ICC V6.21)
0000 ;
0000 ;
0000 ; File: OS_CPU_A.S
0000 ; By:
0000 ; Modified by:
0000 ; Port Version: V1.00
0000 ;
0000 ;
0000 ;*******************************************************************************
0000
0000 ;include
0000
0000 ;*******************************************************************************
0000 ; I/O PORT ADDRESSES
0000 ;*******************************************************************************
0000
003F SREG =0x3F
003E SPH =0x3E
003D SPL =0x3D
0032 TCNT0 =0x32
0000
0010 PIND = 0x10
0012 PORTD = 0x12
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) RCALL OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*******************************************************************************
0000 _OSStartHighRdy::
0000 00D0 RCALL _OSTaskSwHook ; Invoke user defined context switch hook
0002 00910000 LDS R16,_OSRunning ; Indicate that we are multitasking
0006 0395 INC R16
0008 00930000 STS _OSRunning,R16 ;
000C
000C E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
0010 F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
0014 C191 LD R28,Z+ ; Load Y (R29:R28) pointer
0016 D191 LD R29,Z+ ;
0018
0018 0991 LD R16,Y+
001A 0DBF OUT SPL,R16
001C 0991 LD R16,Y+
001E 0EBF OUT SPH,R16
0020 0991 LD R16,Y+
0022 0FBF OUT SREG,R16
0024 F991 LD R31,Y+
0026 E991 LD R30,Y+
0028 B991 LD R27,Y+
002A A991 LD R26,Y+
002C 9991 LD R25,Y+
002E 8991 LD R24,Y+
0030 7991 LD R23,Y+
0032 6991 LD R22,Y+
0034 5991 LD R21,Y+
0036 4991 LD R20,Y+
0038 3991 LD R19,Y+
003A 2991 LD R18,Y+
003C 1991 LD R17,Y+
003E 0991 LD R16,Y+
0040 F990 LD R15,Y+
0042 E990 LD R14,Y+
0044 D990 LD R13,Y+
0046 C990 LD R12,Y+
0048 B990 LD R11,Y+
004A A990 LD R10,Y+
004C 9990 LD R9,Y+
004E 8990 LD R8,Y+
0050 7990 LD R7,Y+
0052 6990 LD R6,Y+
0054 5990 LD R5,Y+
0056 4990 LD R4,Y+
0058 3990 LD R3,Y+
005A 2990 LD R2,Y+
005C 1990 LD R1,Y+
005E 0990 LD R0,Y+
0060 0895 RET ; start task
0062
0062 ;*******************************************************************************
0062 ; TASK LEVEL CONTEXT SWITCH
0062 ;
0062 ; Description : This function is called when a task makes a higher priority task
0062 ; ready-to-run.
0062 ;
0062 ; Note(s):
0062 ; 1) Upon entry,
0062 ; OSTCBCur points to the OS_TCB of the task to suspend
0062 ; OSTCBHighRdy points to the OS_TCB of the task to resume
0062 ;
0062 ; 2) The stack frame of the task to suspend looks as follows:
0062 ;
0062 ; SP +0 --> LSB of task code address
0062 ; +1 MSB of task code address (High memory)
0062 ;
0062 ; 3) The saved context of the task to resume looks as follows:
0062 ;
0062 ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
0062 ; MSB of (return) stack pointer
0062 ; Flags to load in status register
0062 ; R31
0062 ; R30
0062 ; R7
0062 ; .
0062 ; .
0062 ; .
0062 ; R0 (High memory)
0062 ;*******************************************************************************
0062
0062 0A92 ST -Y,R0
0064 1A92 ST -Y,R1
0066 2A92 ST -Y,R2
0068 3A92 ST -Y,R3
006A 4A92 ST -Y,R4
006C 5A92 ST -Y,R5
006E 6A92 ST -Y,R6
0070 7A92 ST -Y,R7
0072 8A92 ST -Y,R8
0074 9A92 ST -Y,R9
0076 AA92 ST -Y,R10
0078 BA92 ST -Y,R11
007A CA92 ST -Y,R12
007C DA92 ST -Y,R13
007E EA92 ST -Y,R14
0080 FA92 ST -Y,R15
0082 0A93 ST -Y,R16
0084 1A93 ST -Y,R17
0086 2A93 ST -Y,R18
0088 3A93 ST -Y,R19
008A 4A93 ST -Y,R20
008C 5A93 ST -Y,R21
008E 6A93 ST -Y,R22
0090 7A93 ST -Y,R23
0092 8A93 ST -Y,R24
0094 9A93 ST -Y,R25
0096 AA93 ST -Y,R26
0098 BA93 ST -Y,R27
009A EA93 ST -Y,R30
009C FA93 ST -Y,R31
009E 0FB7 IN R16,SREG
00A0 0A93 ST -Y,R16
00A2 0EB7 IN R16,SPH
00A4 0A93 ST -Y,R16
00A6 0DB7 IN R16,SPL
00A8 0A93 ST -Y,R16
00AA
00AA E0910000 LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
00AE F0910100 LDS R31,_OSTCBCur+1 ;
00B2 C193 ST Z+,R28 ; Save Y (R29:R28) pointer
00B4 D193 ST Z+,R29 ;
00B6
00B6 00D0 RCALL _OSTaskSwHook ; RCALL user defined task switch hook
00B8
00B8 00910000 LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
00BC 00930000 STS _OSPrioCur,R16
00C0
00C0 E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
00C4 F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
00C8 E0930000 STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -