📄 os_cpu_a.lis
字号:
0000 ;*******************************************************************************
0000 ; uC/OS-II
0000 ; The Real-Time Kernel
0000 ;
0000 ; ATmega128 Specific code
0000 ; ICC AVR Compiler
0000 ;
0000 ;
0000 ; File : OS_CPU_A.s
0000 ; By : Jean J. Labrosse
0000 ;*******************************************************************************
0000
0001 BIT00 = 0x01
0002 BIT01 = 0x02
0004 BIT02 = 0x04
0008 BIT03 = 0x08
0010 BIT04 = 0x10
0020 BIT05 = 0x20
0040 BIT06 = 0x40
0080 BIT07 = 0x80
0000 ;*******************************************************************************
0000 ; I/O PORT ADDRESSES
0000 ;*******************************************************************************
0000
0000
003F SREG = 0x3F
003E SPH = 0x3E
003D SPL = 0x3D
0032 TCNT0 = 0x32
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 CBR R16,BIT07
0000 OUT SREG,R16
.area text(rel)
;/*$PAGE*/
;********************************************************************************************************
; DISABLE/ENABLE INTERRUPTS USING OS_CRITICAL_METHOD #3
;
; Description : These functions are used to disable and enable interrupts using OS_CRITICAL_METHOD #3.
;
; OS_CPU_SR OSCPUSaveSR (void)
; Get current value of SREG
; Disable interrupts
; Return original value of SREG
;
; void OSCPURestoreSR (OS_CPU_SR cpu_sr)
; Set SREG to cpu_sr
; Return
;********************************************************************************************************
0000 _OS_CPU_SR_Save::
0000 0FB7 IN R16,SREG ; Get current state of interrupts disable flag
0002 F894 CLI ; Disable interrupts
0004 0895 RET ; Return original SREG value in R16
0006
0006
0006 _OS_CPU_SR_Restore::
0006 0FBF OUT SREG,R16 ; Restore SREG
0008 0895 RET ; Return
000A
000A ;*******************************************************************************
000A ; START HIGHEST PRIORITY TASK READY-TO-RUN
000A ;
000A ; Description : This function is called by OSStart() to start the highest
000A ; priority task that was created by your application before calling OSStart().
000A ;
000A ; Note(s):
000A ; 1) The (data)stack frame is assumed to look as follows:
000A ;
000A ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
000A ; MSB of (return) stack pointer
000A ; Flags to load in status register
000A ; R31
000A ; R30
000A ; R7
000A ; .
000A ; .
000A ; .
000A ; R0 (High memory)
000A ;
000A ; where the stack pointer points to the task start address.
000A ;
000A ;
000A ; 2) OSStartHighRdy() MUST:
000A ; a) Call OSTaskSwHook() then,
000A ; b) Set OSRunning to TRUE,
000A ; c) Switch to the highest priority task.
000A ;*******************************************************************************
000A
000A _OSStartHighRdy::
000A 0E940000 CALL _OSTaskSwHook ; Invoke user defined context switch hook
000E 00910000 LDS R16,_OSRunning ; Indicate that we are multitasking
0012 0395 INC R16
0014 00930000 STS _OSRunning,R16 ;
0018
0018 E0910000 LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
001C F0910100 LDS R31,_OSTCBHighRdy+1 ; ready to run
0020 C191 LD R28,Z+ ; Load Y (R29:R28) pointer
0022 D191 LD R29,Z+ ;
0024
0024 0991 LD R16,Y+
0026 0DBF OUT SPL,R16
0028 0991 LD R16,Y+
002A 0EBF OUT SPH,R16
002C 0991 LD R16,Y+
002E 0F77 CBR R16,BIT07
0030 0FBF OUT SREG,R16
0032 F991 LD R31,Y+
0034 E991 LD R30,Y+
0036 B991 LD R27,Y+
0038 A991 LD R26,Y+
003A 9991 LD R25,Y+
003C 8991 LD R24,Y+
003E 7991 LD R23,Y+
0040 6991 LD R22,Y+
0042 5991 LD R21,Y+
0044 4991 LD R20,Y+
0046 3991 LD R19,Y+
0048 2991 LD R18,Y+
004A 1991 LD R17,Y+
004C 0991 LD R16,Y+
004E F990 LD R15,Y+
0050 E990 LD R14,Y+
0052 D990 LD R13,Y+
0054 C990 LD R12,Y+
0056 B990 LD R11,Y+
0058 A990 LD R10,Y+
005A 9990 LD R9,Y+
005C 8990 LD R8,Y+
005E 7990 LD R7,Y+
0060 6990 LD R6,Y+
0062 5990 LD R5,Y+
0064 4990 LD R4,Y+
0066 3990 LD R3,Y+
0068 2990 LD R2,Y+
006A 1990 LD R1,Y+
006C 0990 LD R0,Y+
006E 1895 RETI ; start task
0070
0070 ;*******************************************************************************
0070 ; TASK LEVEL CONTEXT SWITCH
0070 ;
0070 ; Description : This function is called when a task makes a higher priority task
0070 ; ready-to-run.
0070 ;
0070 ; Note(s):
0070 ; 1) Upon entry,
0070 ; OSTCBCur points to the OS_TCB of the task to suspend
0070 ; OSTCBHighRdy points to the OS_TCB of the task to resume
0070 ;
0070 ; 2) The stack frame of the task to suspend looks as follows:
0070 ;
0070 ; SP +0 --> LSB of task code address
0070 ; +1 MSB of task code address (High memory)
0070 ;
0070 ; 3) The saved context of the task to resume looks as follows:
0070 ;
0070 ; OSTCBHighRdy->OSTCBStkPtr --> LSB of (return) stack pointer (Low memory)
0070 ; MSB of (return) stack pointer
0070 ; Flags to load in status register
0070 ; R31
0070 ; R30
0070 ; R7
0070 ; .
0070 ; .
0070 ; .
0070 ; R0 (High memory)
0070 ;*******************************************************************************
0070
0070 _OSCtxSw::
0070 0A92 ST -Y,R0
0072 1A92 ST -Y,R1
0074 2A92 ST -Y,R2
0076 3A92 ST -Y,R3
0078 4A92 ST -Y,R4
007A 5A92 ST -Y,R5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -