📄 mcs251.c
字号:
/*
*********************************************************************************************************
* uC/OS
* The Real-Time Kernel
*
* (c) Copyright 1992-1995, Jean J. Labrosse, Plantation, FL
* All Rights Reserved
*
*
* MCS-251 Specific code
* LARGE Model
*
* File : MCS251_C.C
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#include "INCLUDES.H"
/*$PAGE*/
/*
*********************************************************************************************************
* CREATE A TASK
*
* Notes: OSTaskCreate() builds the stack frame to look as if an interrupt just occurred.
* The interrupt stack frame assumes the 8051 model (i.e. INTR=0)
*********************************************************************************************************
*/
UBYTE OSTaskCreate(void (*task)(void *pd), void *pdata, void *pstk, UBYTE p)
{
UWORD *pwstk;
UBYTE err;
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[p] == (OS_TCB *)0) { /* Make sure no task at this priority */
OS_EXIT_CRITICAL();
pwstk = (UWORD *)pstk; /* Load stack pointer */
*pwstk++ = (UWORD)task; /* Simulate CALL to task */
*pwstk++ = (UWORD)task; /* PC on top of stack */
*pwstk++ = (UWORD)0x0000; /* PSW = 0, PSW1 = 0 */
*pwstk++ = (UWORD)pdata; /* WR0 = Pointer to task arguments (i.e. pdata) */
*pwstk++ = (UWORD)0x0000; /* WR2 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR4 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR6 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR8 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR10 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR12 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR14 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR16 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR18 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR20 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR22 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR24 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR26 = 0 */
*pwstk++ = (UWORD)0x0000; /* WR28 = 0 */
*pwstk = (UWORD)0x0000; /* WR30 = 0 */
err = OSTCBInit(p, (void *)pwstk); /* Get and initialize a TCB */
if (err == OS_NO_ERR) {
if (OSRunning) { /* Find highest priority task if tasking */
OSSched();
}
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
/*$PAGE*/
/*
**********************************************************************************************************
* START MULTITASKING
* void OSStartHighRdy(void)
*
* Total execution time : 92 machine cycles
**********************************************************************************************************
*/
void OSStartHighRdy(void)
{
asm(" EXTERN _OSTCBHighRdy \n");
asm(" \n");
asm(" MOV WR4,00:_OSTCBHighRdy ; 3~ Get pointer to highest priority top of stack \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 ; 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 task level)
* void OSCtxSw(void)
*
* Total execution time : 172 machine cycles
**********************************************************************************************************
*/
void OSCtxSw(void)
{
asm(" EXTERN _OSTCBHighRdy \n");
asm(" EXTERN _OSTCBCur \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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -