📄 os_cpu_c.c~
字号:
* Note(s) : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void OSTCBInitHook (OS_TCB *ptcb)
{
ptcb = ptcb; /* Prevent Compiler warning */
}
#endif
/*
*********************************************************************************************************
* TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments : none
*
* Note(s) : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if (OS_CPU_HOOKS_EN > 0) && (OS_TIME_TICK_HOOK_EN > 0)
void OSTimeTickHook (void)
{
#ifdef OS_VIEW_MODULE
OSView_TickHook();
#endif
}
#endif
/*
********************************************************************
以下是 OS_CPU_A.ASM 里的函数
*********************************************************************
*/
#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");\
#asm ("IN R16,0x3B");\
#asm ("ST -Y,R16");
//IN R16,RAMPZ
//ST -Y,R16
#define POP_ALL() \
#asm ("LD R16,Y+");\
#asm ("OUT 0x3B,R16");\
#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+");
// .macro PUSH_SP ; Save stack pointer
#define PUSH_SP() \
#asm ("IN R16,SPH");\
#asm ("ST -Y,R16");\
#asm ("IN R16,SPL");\
#asm ("ST -Y,R16");
// .endmacro
// .macro POP_SP ; Restore stack pointer
#define POP_SP() \
#asm ("LD R16,Y+");\
#asm ("OUT SPL,R16");\
#asm ("LD R16,Y+");\
#asm ("OUT SPH,R16");
// .endmacro
// .macro PUSH_SREG ; Save status register
#define PUSH_SREG() \
#asm ("IN R16,SREG");\
#asm ("ST -Y,R16");
// .endmacro
// .macro POP_SREG ; Restore status registers
#define POP_SREG() \
#asm ("LD R16,Y+");\
#asm ("OUT SREG,R16");
// .endmacro
void OSStartHighRdy(void)
{
#asm
CALL _OSTaskSwHook ; Invoke user defined context switch hook
LDS R16,_OSRunning ; Indicate that we are multitasking
INC R16 ;
STS _OSRunning,R16 ;
LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
LDS R31,_OSTCBHighRdy+1 ; ready to run
LD R28,Z+ ; Load Y (R29:R28) pointer
LD R29,Z+ ;
#endasm
POP_SP(); // ; Restore stack pointer
POP_SREG(); // ; Restore status register
POP_ALL(); // ; Restore all registers
// #asm ("RET"); // ; Start task
}
void OSCtxSw(void)
{
PUSH_ALL();// ; Save current task's context
PUSH_SREG();//
PUSH_SP();//
#asm
LDS R30,_OSTCBCur ; Z = OSTCBCur->OSTCBStkPtr
LDS R31,_OSTCBCur+1 ;
ST Z+,R28 ; Save Y (R29:R28) pointer
ST Z+,R29 ;
CALL _OSTaskSwHook ; Call user defined task switch hook
LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
STS _OSPrioCur,R16
LDS R30,_OSTCBHighRdy ; Let Z point to TCB of highest priority task
LDS R31,_OSTCBHighRdy+1 ; ready to run
STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
STS _OSTCBCur+1,R31 ;
LD R28,Z+ ; Restore Y pointer
LD R29,Z+ ;
#endasm
POP_SP();// ; Restore stack pointer
POP_SREG();// ; Restore status register
POP_ALL();// ; Restore all registers
#asm ("RET");
}
void OSIntCtxSw(void)
{
#asm
CALL _OSTaskSwHook ; Call user defined task switch hook
LDS R16,_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy
STS _OSPrioCur,R16 ;
LDS R30,_OSTCBHighRdy ; Z = OSTCBHighRdy->OSTCBStkPtr
LDS R31,_OSTCBHighRdy+1 ;
STS _OSTCBCur,R30 ; OSTCBCur = OSTCBHighRdy
STS _OSTCBCur+1,R31 ;
LD R28,Z+ ; Restore Y pointer
LD R29,Z+ ;
#endasm
POP_SP();// ; Restore stack pointer
POP_SREG();// ; Restore status register
POP_ALL();// ; Restore all registers
#asm ("RET");
}
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
;RET ; 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 [TIM0_OVF] void OSTickISR(void)
{
PUSH_ALL();// ; Save all registers and status register
#asm
IN R16,SREG ; Save the SREG but with interrupts enabled
SBR R16,0x80
ST -Y,R16
#endasm
PUSH_SP();// ; Save the task's hardware stack pointer onto task's stack
OSIntNesting++;
if(OSIntNesting == 1)
{
#asm
LDS R30,_OSTCBCur ; OSTCBCur->OSTCBStkPtr = Y
LDS R31,_OSTCBCur+1
ST Z+,R28
ST Z+,R29 ; }
#endasm
}
OSTickISR_Handler();// ; Handle the tick ISR
OSIntExit();// ; Notify uC/OS-II about end of ISR
POP_SP();// ; Restore the hardware stack pointer from task's stack
POP_SREG();// ; Restore the SREG register
POP_ALL();// ; Restore all registers
#asm ("RET");// ; Note: RET instead of RETI
}
#pragma savereg+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -