📄 os_cpu_a.c
字号:
#include "uCOS_II.H"
#define PUSH_ALL() \
#asm ("ST -Y,R0");\
#asm ("ST -Y,R1");\
#asm ("ST -Y,R2");\
#asm ("ST -Y,R3");\
#asm ("ST -Y,R4");\
#asm ("ST -Y,R5");\
#asm ("ST -Y,R6");\
#asm ("ST -Y,R7");\
#asm ("ST -Y,R8");\
#asm ("ST -Y,R9");\
#asm ("ST -Y,R10");\
#asm ("ST -Y,R11");\
#asm ("ST -Y,R12");\
#asm ("ST -Y,R13");\
#asm ("ST -Y,R14");\
#asm ("ST -Y,R15");\
#asm ("ST -Y,R16");\
#asm ("ST -Y,R17");\
#asm ("ST -Y,R18");\
#asm ("ST -Y,R19");\
#asm ("ST -Y,R20");\
#asm ("ST -Y,R21");\
#asm ("ST -Y,R22");\
#asm ("ST -Y,R23");\
#asm ("ST -Y,R24");\
#asm ("ST -Y,R25");\
#asm ("ST -Y,R26");\
#asm ("ST -Y,R27");\
#asm ("ST -Y,R30");\
#asm ("ST -Y,R31");
#define POP_ALL() \
#asm ("LD R31,Y+");\
#asm ("LD R30,Y+");\
#asm ("LD R27,Y+");\
#asm ("LD R26,Y+");\
#asm ("LD R25,Y+");\
#asm ("LD R24,Y+");\
#asm ("LD R23,Y+");\
#asm ("LD R22,Y+");\
#asm ("LD R21,Y+");\
#asm ("LD R20,Y+");\
#asm ("LD R19,Y+");\
#asm ("LD R18,Y+");\
#asm ("LD R17,Y+");\
#asm ("LD R16,Y+");\
#asm ("LD R15,Y+");\
#asm ("LD R14,Y+");\
#asm ("LD R13,Y+");\
#asm ("LD R12,Y+");\
#asm ("LD R11,Y+");\
#asm ("LD R10,Y+");\
#asm ("LD R9,Y+");\
#asm ("LD R8,Y+");\
#asm ("LD R7,Y+");\
#asm ("LD R6,Y+");\
#asm ("LD R5,Y+");\
#asm ("LD R4,Y+");\
#asm ("LD R3,Y+");\
#asm ("LD R2,Y+");\
#asm ("LD R1,Y+");\
#asm ("LD R0,Y+");
#define PUSH_SP() \
#asm ("IN R16,SPH");\
#asm ("ST -Y,R16");\
#asm ("IN R16,SPL");\
#asm ("ST -Y,R16");
#define POP_SP() \
#asm ("LD R16,Y+");\
#asm ("OUT SPL,R16");\
#asm ("LD R16,Y+");\
#asm ("OUT SPH,R16");
#define PUSH_SREG() \
#asm ("IN R16,SREG");\
#asm ("ST -Y,R16");
#define POP_SREG() \
#asm ("LD R16,Y+");\
#asm ("OUT SREG,R16");
void OSStartHighRdy(void)
{
OSTaskSwHook();
#asm
LDI R16, 1
STS _OSRunning, R16
LDS R30, _OSTCBHighRdy
LDS R31, _OSTCBHighRdy + 1
LD R28, Z+
LD R29, Z+
#endasm
POP_SP();
POP_SREG();
POP_ALL();
}
void OSCtxSw(void)
{
PUSH_ALL();
PUSH_SREG();
PUSH_SP();
#asm
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+
#endasm
POP_SP();
POP_SREG();
POP_ALL();
}
void OSIntCtxSw(void)
{
#asm
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+
#endasm
POP_SP();
POP_SREG();
POP_ALL();
}
OS_CPU_SR OS_CPU_SR_Save(void)
{
OS_CPU_SR temp;
#asm
IN R16,SREG ; Get current state of interrupts disable flag
MOV R30,R16;CLI ; Disable interrupts
; Return original SREG value in R16
#endasm
}
void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
OS_CPU_SR temp;
temp = cpu_sr;
#asm
OUT SREG,R16; //; Restore SREG
#endasm
}
#pragma savereg-
interrupt [TIM1_OVF] void OSTickISR(void)
{
PUSH_ALL();
#asm
IN R16,SREG
SBR R16,0x80 ;enable interrupt
ST -Y,R16 ;save sreg
#endasm
PUSH_SP();
OSIntNesting ++;
if (1 == OSIntNesting)
{
#asm
LDS R30, _OSTCBCur
LDS R31, _OSTCBCur + 1
ST Z+, R28
ST Z+, R29
#endasm
}
TCNT1H = 0x0;
TCNT1L = 0xE6;//256 - (CPU_CLK_FREQ / OS_TICKS_PER_SEC / 1024);
#asm
SEI ;enable nest interrupt
#endasm
OSTimeTick();
OSIntExit();
POP_SP();
POP_SREG();
POP_ALL();
}
#pragma savereg+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -