📄 mcs251.c
字号:
asm(" PUSH WR26 ; 4~ \n");
asm(" PUSH WR28 ; 4~ \n");
asm(" PUSH WR30 ; 4~ \n");
asm(" MOV WR4,00:_OSTCBCur ; 3~ Save current task's stack pointer in task TCB\n");
asm(" MOV DR0,SPX ; 2~ (only lower 16 bits) \n");
asm(" MOV @WR4,WR2 ; 3~ \n");
asm(" MOV WR4,00:_OSTCBHighRdy ; 2~ Get pointer to highest priority top of stack \n");
asm(" MOV 00:_OSTCBCur,WR4 ; 3~ OSTCBCur = OSTCBHighRdy \n");
asm(" MOV WR2,@WR4 ; 3~ Get stack pointer of highest priority task \n");
asm(" XRL WR0,WR0 ; 2~ (only lower 16 bits) \n");
asm(" MOV SPX,DR0 ; 2~ \n");
asm(" POP WR30 ; 4~ Restore WR0 to WR30 \n");
asm(" POP WR28 ; 4~ \n");
asm(" POP WR26 ; 4~ \n");
asm(" POP WR24 ; 4~ \n");
asm(" POP WR22 ; 4~ \n");
asm(" POP WR20 ; 4~ \n");
asm(" POP WR18 ; 4~ \n");
asm(" POP WR16 ; 4~ \n");
asm(" POP WR14 ; 4~ \n");
asm(" POP WR12 ; 4~ \n");
asm(" POP WR10 ; 4~ \n");
asm(" POP WR8 ; 4~ \n");
asm(" POP WR6 ; 4~ \n");
asm(" POP WR4 ; 4~ \n");
asm(" POP WR2 ; 4~ \n");
asm(" POP WR0 ; 4~ \n");
asm(" POP PSW ; 3~ Restore Program Status Words \n");
asm(" POP PSW1 ; 3~ \n");
asm(" RETI ;12~ Start executing high priority task code \n");
}
/*$PAGE*/
/*
**********************************************************************************************************
* PERFORM A CONTEXT SWITCH (From an ISR)
* void OSIntCtxSw(void)
*
* Total execution time : 109 machine cycles
**********************************************************************************************************
*/
void OSIntCtxSw(void)
{
asm(" EXTERN _OSTCBHighRdy \n");
asm(" EXTERN _OSTCBCur \n");
asm(" \n");
asm(" DEC SPX,#4 ; 4~ Ignore 'CALL' to OSIntExit and OSIntCtxSw \n");
asm(" MOV WR4,00:_OSTCBCur ; 3~ Save current task's stack pointer in task TCB\n");
asm(" MOV DR0,SPX ; 2~ \n");
asm(" MOV @WR4,WR2 ; 3~ \n");
asm(" MOV WR4,00:_OSTCBHighRdy ; 3~ Get pointer to highest priority top of stack \n");
asm(" MOV 00:_OSTCBCur,WR4 ; 3~ OSTCBCur = OSTCBHighRdy \n");
asm(" MOV WR2,@WR4 ; 3~ SPX = OSTCBHighRdy->OSTCBStkPtr \n");
asm(" XRL WR0,WR0 ; 2~ (only lower 16 bits) \n");
asm(" MOV SPX,DR0 ; 2~ \n");
asm(" POP WR30 ; 2~ Restore WR0 to WR30 \n");
asm(" POP WR28 ; 4~ \n");
asm(" POP WR26 ; 4~ \n");
asm(" POP WR24 ; 4~ \n");
asm(" POP WR22 ; 4~ \n");
asm(" POP WR20 ; 4~ \n");
asm(" POP WR18 ; 4~ \n");
asm(" POP WR16 ; 4~ \n");
asm(" POP WR14 ; 4~ \n");
asm(" POP WR12 ; 4~ \n");
asm(" POP WR10 ; 4~ \n");
asm(" POP WR8 ; 4~ \n");
asm(" POP WR6 ; 4~ \n");
asm(" POP WR4 ; 4~ \n");
asm(" POP WR2 ; 4~ \n");
asm(" POP WR0 ; 4~ \n");
asm(" POP PSW ; 3~ Restore Program Status Words \n");
asm(" POP PSW1 ; 3~ \n");
asm(" RETI ;12~ Start executing high priority task code \n");
}
/*$PAGE*/
/*
**********************************************************************************************************
* HANDLE TICK ISR
* void OSTickISR(void)
*
* Total execution time : 179 machine cycles +
* OSIntEnter() +
* OSTimeTick() +
* OSIntExit()
* Notes: 1) HPT means High 'Priority Task'
**********************************************************************************************************
*/
void OSTickISR(void)
{
asm(" EXTERN $OSIntEnter \n");
asm(" EXTERN $OSIntExit \n");
asm(" EXTERN $OSTimeTick \n");
asm(" \n");
asm(" PUSH PSW1 ; 3~ Save context of current task \n");
asm(" PUSH PSW ; 3~ \n");
asm(" PUSH WR0 ; 4~ Save WR0 to WR30 \n");
asm(" PUSH WR2 ; 4~ \n");
asm(" PUSH WR4 ; 4~ \n");
asm(" PUSH WR6 ; 4~ \n");
asm(" PUSH WR8 ; 4~ \n");
asm(" PUSH WR10 ; 4~ \n");
asm(" PUSH WR12 ; 4~ \n");
asm(" PUSH WR14 ; 4~ \n");
asm(" PUSH WR16 ; 4~ \n");
asm(" PUSH WR18 ; 4~ \n");
asm(" PUSH WR20 ; 4~ \n");
asm(" PUSH WR22 ; 4~ \n");
asm(" PUSH WR24 ; 4~ \n");
asm(" PUSH WR26 ; 4~ \n");
asm(" PUSH WR28 ; 4~ \n");
asm(" PUSH WR30 ; 4~ \n");
asm(" LCALL $OSIntEnter ; 9~ Notify uC/OS about ISR \n");
asm(" LCALL $OSTimeTick ; 9~ Handle system tick \n");
asm(" LCALL $OSIntExit ; 9~ Exit through scheduler if HPT is ready \n");
asm(" POP WR30 ; 4~ Restore WR0 to WR30 \n");
asm(" POP WR28 ; 4~ \n");
asm(" POP WR26 ; 4~ \n");
asm(" POP WR24 ; 4~ \n");
asm(" POP WR22 ; 4~ \n");
asm(" POP WR20 ; 4~ \n");
asm(" POP WR18 ; 4~ \n");
asm(" POP WR16 ; 4~ \n");
asm(" POP WR14 ; 4~ \n");
asm(" POP WR12 ; 4~ \n");
asm(" POP WR10 ; 4~ \n");
asm(" POP WR8 ; 4~ \n");
asm(" POP WR6 ; 4~ \n");
asm(" POP WR4 ; 4~ \n");
asm(" POP WR2 ; 4~ \n");
asm(" POP WR0 ; 4~ \n");
asm(" POP PSW ; 3~ Restore Program Status Words \n");
asm(" POP PSW1 ; 3~ \n");
asm(" RETI ;12~ Start executing high priority task code \n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -