📄 os_cpu_a.lis
字号:
0000 ;********************************************************************************************************
0000 ; uC/OS-II
0000 ; The Real-Time Kernel
0000 ;
0000 ; ATmega128 Specific code
0000 ;
0000 ;
0000 ; File : OS_CPU_A.S
0000 ; By : Ole Saether
0000 ; Jean J. Labrosse
0000 ;********************************************************************************************************
0000 ; I/O PORT ADDRESSES
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
003F SREG = 0x3F
003E SPH = 0x3E
003D SPL = 0x3D
003B RAMPZ = 0x3B
0000
0000 ;********************************************************************************************************
0000 ; MACROS
0000 ;********************************************************************************************************
0000
0000 .macro PUSH_ALL ; Save all registers
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 IN R16,RAMPZ
0000 ST -Y,R16
0000 .macro POP_ALL ; Restore all registers
0000 LD R16,Y+
0000 OUT RAMPZ,R16
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 PUSH_SP ; Save stack pointer
0000 IN R16,SPH
0000 ST -Y,R16
0000 IN R16,SPL
0000 ST -Y,R16
0000 .macro POP_SP ; Restore stack pointer
0000 LD R16,Y+
0000 OUT SPL,R16
0000 LD R16,Y+
0000 OUT SPH,R16
0000 .macro PUSH_SREG ; Save status register
0000 IN R16,SREG
0000 ST -Y,R16
0000 .macro POP_SREG ; Restore status registers
0000 LD R16,Y+
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 ;/*$PAGE*/.
000A ;********************************************************************************************************
000A ; START HIGHEST PRIORITY TASK READY-TO-RUN
000A ;
000A ; Description : This function is called by OSStart() to start the highest priority task that was created
000A ; by your application before calling OSStart().
000A ;
000A ; Note(s) : 1) The (data)stack frame is assumed to look as follows:
000A ;
000A ; OSTCBHighRdy->OSTCBStkPtr --> SPL of (return) stack pointer (Low memory)
000A ; SPH of (return) stack pointer
000A ; Flags to load in status register
000A ; R31
000A ; R30
000A ; R27
000A ; .
000A ; .
000A ; R0
000A ; PCH
000A ; PCL (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 0FBF OUT SREG,R16
0030 0991 LD R16,Y+
0032 0BBF OUT RAMPZ,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -