⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcs251.c

📁 基于80251的UCOS II源代码,仅供参考和学习.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                                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 + -