📄 os_cpu_a.asm
字号:
_.MACRO PUSH_ALL
ST -Y ,R0
ST -Y ,R1
ST -Y ,R2
ST -Y ,R3
ST -Y ,R4
ST -Y ,R5
ST -Y ,R6
ST -Y ,R7
ST -Y ,R8
ST -Y ,R9
ST -Y ,R10
ST -Y ,R11
ST -Y ,R12
ST -Y ,R13
ST -Y ,R14
ST -Y ,R15
ST -Y ,R16
ST -Y ,R17
ST -Y ,R18
ST -Y ,R19
ST -Y ,R20
ST -Y ,R21
ST -Y ,R22
ST -Y ,R23
ST -Y ,R24
ST -Y ,R25
ST -Y ,R26
ST -Y ,R27
ST -Y ,R28
ST -Y ,R29
ST -Y ,R30
ST Y- ,R31
_.ENDMACRO
_.MACRO POP_ALL
LD R31, Y+
LD R30, Y+
LD R29, Y+
LD R28, Y+
LD R27, Y+
LD R26, Y+
LD R25, Y+
LD R24, Y+
LD R23, Y+
LD R22, Y+
LD R21, Y+
LD R20, Y+
LD R19, Y+
LD R18, Y+
LD R17, Y+
LD R16, Y+
LD R15, Y+
LD R14, Y+
LD R13, Y+
LD R12, Y+
LD R11, Y+
LD R10, Y+
LD R9, Y+
LD R8, Y+
LD R7, Y+
LD R6, Y+
LD R5, Y+
LD R4, Y+
LD R3, Y+
LD R2, Y+
LD R1, Y+
LD R0, Y+
_.ENDMACRO
_.MACRO PUSH_SP
IN R16, SPH ;$3E
ST Y+, R16
IN R16, SPL ;$3D
ST Y+, R16
_.ENDMACRO
_.MACRO POP_SP
LD R16, Y-
OUT SPL, R16
LD R16, Y-
OUT SPH, R16
_.ENDMACRO
_.MACRO PUSH_SREG
IN R16, SREG ;$3F
ST Y+, R16
_.ENDMACRO
_.MACRO POP_SREG
LD Y+, R16
OUT SRET, R16
_.ENDMACRO
_OSStartHighRdy::
CALL _OSTaskSwHook
LDI R16, 1
STS _OSRunning, R16
LDS R30, _OSTCBHighRdy
LDS R31, _OSTCBHighRdy + 1
LD R28, Z+
LD R29, Z+
POP_SP
POP_SREG
POP_ALL
RET
_OSCtxSw::
PUSH_ALL
PUSH_SREG
PUSH_SP
LDS R30, _OSTCBCur
LDS R31, _OSTCBCur + 1
ST Z+, R28
ST Z+, R29
CALL _OSTaskSwHook
LDS R16, _OSPrioHighRdy
STS _OSPrioCur, R16
LDS R30, _OSTCBHighRdy
LDS R31, _OSTCBHighRdy + 1
STS _OSTCBCur, R30
STS _OSTCBCur + 1, R31
LD R28, Z+
LD R29, Z+
POP_SP
POP_SREG
POP_ALL
RET
_OSIntCtxSw::
LDS R16, _OSPrioHighRdy
STS _OSPrioCur, R16
LDS R30, _OSTCBHighRdy
LDS R31, _OSTCBHighRdy + 1
STS _OSTCBCur, R30
STS _OSTCBCur + 1, R31
LD R28, Z+
LD R29, Z+
POP_SP
POP_SREG
POP_ALL
RETI
_OSTickISR::
PUSH_ALL
IN R16,SREG
SBR R16,0x80 ;enable interrupt
ST -Y,R16 ;save sreg
PUSH_SP
LDS R16, _OSIntNesting
INC R16
STS _OSIntNesting, R16
CPI R16, 1
BRNE _TickISR1
LDS R30, _OSTCBCur
LDS R31, _OSTCBCur + 1
ST Z+, R28
ST Z+, R29
_TickISR1:
LDI R16,0xF9 ;Reload the timer
OUT TCNT1H,R16
LDI R16,0xE6
OUT TCNT1L,R16
SEI ;enable nest interrupt
CALL _OSTimeTick
CALL _OSIntExit
POP_SP
POP_SREG
POP_ALL
RETI
_OS_CPU_SR_Save::
IN R16,SREG ; Get current state of interrupts disable flag
CLI ; Disable interrupts
RET ; Return original SREG value in R16
_OS_CPU_SR_Restore::
OUT SREG,R16 ; Restore SREG
RET ; Return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -