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

📄 ucos_ii.i

📁 ucos-II 基于pc的范例 中文解释 包涵全部源码
💻 I
📖 第 1 页 / 共 3 页
字号:










#line 29 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/includes.h"
#line 1 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

#line 15 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"


#line 21 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"




















































#line 77 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"















































#line 128 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"


typedef struct {
    void   *OSEventPtr;
    INT8U   OSEventTbl[((12) / 8 + 1)];
    INT16U  OSEventCnt;
    INT8U   OSEventType;
    INT8U   OSEventGrp;
} OS_EVENT;




#line 145 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"










#line 159 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"























#line 186 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"












#line 202 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"


typedef struct {
    INT16U  OSCnt;
    INT8U   OSEventTbl[((12) / 8 + 1)];
    INT8U   OSEventGrp;
} OS_SEM_DATA;



#line 216 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"










#line 230 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

typedef struct os_tcb {
    OS_STK        *OSTCBStkPtr;









    struct os_tcb *OSTCBNext;
    struct os_tcb *OSTCBPrev;


    OS_EVENT      *OSTCBEventPtr;






    INT16U         OSTCBDly;
    INT8U          OSTCBStat;
    INT8U          OSTCBPrio;

    INT8U          OSTCBX;
    INT8U          OSTCBY;
    INT8U          OSTCBBitX;
    INT8U          OSTCBBitY;




} OS_TCB;



#line 273 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

  INT32U       OSCtxSwCtr;


  OS_EVENT    *OSEventFreeList;
  OS_EVENT     OSEventTbl[2];


  INT32U       OSIdleCtr;


  INT8S        OSCPUUsage;
  INT32U       OSIdleCtrMax;
  INT32U       OSIdleCtrRun;
  BOOLEAN      OSStatRdy;


  INT8U        OSIntNesting;

  INT8U        OSLockNesting;

  INT8U        OSPrioCur;
  INT8U        OSPrioHighRdy;

  INT8U        OSRdyGrp;
  INT8U        OSRdyTbl[((12) / 8 + 1)];

  BOOLEAN      OSRunning;


  INT8U        OSTaskCtr;


  OS_TCB      *OSTCBCur;
  OS_TCB      *OSTCBFreeList;
  OS_TCB      *OSTCBHighRdy;
  OS_TCB      *OSTCBList;
  OS_TCB      *OSTCBPrioTbl[12 + 1];

  INT32U       OSTime;


extern  INT8U const  OSMapTbl[];
extern  INT8U const  OSUnMapTbl[];



#line 325 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"


#line 331 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"








#line 343 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"







#line 354 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"











#line 369 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

INT16U      OSSemAccept(OS_EVENT *pevent);
OS_EVENT   *OSSemCreate(INT16U value);
void        OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
INT8U       OSSemPost(OS_EVENT *pevent);
INT8U       OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);


#line 381 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"




INT8U       OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);



























INT8U       OSTaskQuery(INT8U prio, OS_TCB *pdata);


#line 420 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"
void        OSTimeDly(INT16U ticks);
INT8U       OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
INT8U       OSTimeDlyResume(INT8U prio);
INT32U      OSTimeGet(void);
void        OSTimeSet(INT32U ticks);
void        OSTimeTick(void);


#line 432 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

void        OSInit(void);

void        OSIntEnter(void);
void        OSIntExit(void);

void        OSSchedLock(void);
void        OSSchedUnlock(void);

void        OSStart(void);

void        OSStatInit(void);

INT16U      OSVersion(void);



#line 454 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"


void        OSEventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk);
void        OSEventTaskWait(OS_EVENT *pevent);
void        OSEventTO(OS_EVENT *pevent);
void        OSEventWaitListInit(OS_EVENT *pevent);










void        OSSched(void);

void        OSTaskIdle(void *data);


void        OSTaskStat(void *data);


INT8U       OSTCBInit(INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt);



#line 487 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/uCOS_II.H"

void        OSCtxSw(void);

void        OSIntCtxSw(void);

void        OSStartHighRdy(void);

void        OSTaskCreateHook(OS_TCB *ptcb);
void        OSTaskDelHook(OS_TCB *ptcb);
void        OSTaskStatHook(void);
void       *OSTaskStkInit(void (*task)(void *pd), void *pdata, void *ptos, INT16U opt);
void        OSTaskSwHook(void);

void        OSTickISR(void);

void        OSTimeTickHook(void);
#line 30 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/includes.h"
#line 18 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l\UCOS_II.C"



#line 1 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

#line 16 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"







#line 27 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

static  INT8U        OSIntExitY;

static  OS_STK       OSTaskIdleStk[512];


static  OS_STK       OSTaskStatStk[512];


static  OS_TCB       OSTCBTbl[11 + 2];



#line 47 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

INT8U const OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};


#line 58 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

INT8U const OSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};



#line 100 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void  OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
{
    OS_TCB *ptcb;
    INT8U   x;
    INT8U   y;
    INT8U   bitx;
    INT8U   bity;
    INT8U   prio;


    y    = OSUnMapTbl[pevent->OSEventGrp];
    bity = OSMapTbl[y];
    x    = OSUnMapTbl[pevent->OSEventTbl[y]];
    bitx = OSMapTbl[x];
    prio = (INT8U)((y << 3) + x);
    if ((pevent->OSEventTbl[y] &= ~bitx) == 0) {
        pevent->OSEventGrp &= ~bity;
    }
    ptcb                 =  OSTCBPrioTbl[prio];
    ptcb->OSTCBDly       =  0;
    ptcb->OSTCBEventPtr  = (OS_EVENT *)0;



    msg                  = msg;

    ptcb->OSTCBStat     &= ~msk;
    if (ptcb->OSTCBStat == 0x00) {
        OSRdyGrp        |=  bity;
        OSRdyTbl[y]     |=  bitx;
    }
}



#line 149 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void  OSEventTaskWait (OS_EVENT *pevent)
{
    OSTCBCur->OSTCBEventPtr = pevent;
    if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
        OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
    }
    pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
    pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
}



#line 175 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void  OSEventTO (OS_EVENT *pevent)
{
    if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
        pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
    }
    OSTCBCur->OSTCBStat     = 0x00;
    OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
}



#line 199 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void  OSEventWaitListInit (OS_EVENT *pevent)
{
    INT8U i;


    pevent->OSEventGrp = 0x00;
    for (i = 0; i <((12) / 8 + 1); i++) {
        pevent->OSEventTbl[i] = 0x00;
    }
}



#line 224 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSInit (void)
{
    INT16U i;


    OSTime        = 0L;
    OSIntNesting  = 0;
    OSLockNesting = 0;

    OSTaskCtr     = 0;

    OSRunning     = 0;
    OSIdleCtr     = 0L;





    OSCtxSwCtr    = 0;
    OSRdyGrp      = 0;
    for (i = 0; i <((12) / 8 + 1); i++) {
        OSRdyTbl[i] = 0;
    }

    OSPrioCur     = 0;
    OSPrioHighRdy = 0;
    OSTCBHighRdy  = (OS_TCB *)0;
    OSTCBCur      = (OS_TCB *)0;
    OSTCBList     = (OS_TCB *)0;
    for (i = 0; i < (12 + 1); i++) {
        OSTCBPrioTbl[i] = (OS_TCB *)0;
    }
    for (i = 0; i < (11 + 2 - 1); i++) {
        OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
    }
    OSTCBTbl[11 + 2 - 1].OSTCBNext = (OS_TCB *)0;
    OSTCBFreeList                                         = &OSTCBTbl[0];


    for (i = 0; i < (2 - 1); i++) {
        OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    }
    OSEventTbl[2 - 1].OSEventPtr = (OS_EVENT *)0;
    OSEventFreeList                          = &OSEventTbl[0];






















    OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[512 - 1],(12));










































        OSTaskCreate(OSTaskStat,
                     (void *)0,
                     &OSTaskStatStk[512 - 1],
(12 - 1));








}


#line 370 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSIntEnter (void)
{
 asm {PUSHF; CLI};
    OSIntNesting++;
 asm POPF;
}


#line 396 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSIntExit (void)
{
 asm {PUSHF; CLI};
    if ((--OSIntNesting | OSLockNesting) == 0) {
        OSIntExitY    = OSUnMapTbl[OSRdyGrp];
        OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
        if (OSPrioHighRdy != OSPrioCur) {
            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;
            OSIntCtxSw();
        }
    }
 asm POPF;
}


#line 428 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSSched (void)
{
    INT8U y;


 asm {PUSHF; CLI};
    if ((OSLockNesting | OSIntNesting) == 0) {
        y             = OSUnMapTbl[OSRdyGrp];
        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) {
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;
 asm INT 0x80;
        }
    }
 asm POPF;
}


#line 462 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSSchedLock (void)
{
    if (OSRunning == 1) {
 asm {PUSHF; CLI};
        OSLockNesting++;
 asm POPF;
    }
}


#line 486 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSSchedUnlock (void)
{
    if (OSRunning == 1) {
 asm {PUSHF; CLI};
        if (OSLockNesting > 0) {
            OSLockNesting--;
            if ((OSLockNesting | OSIntNesting) == 0) {
 asm POPF;
                OSSched();
            } else {
 asm POPF;
            }
        } else {
 asm POPF;
        }
    }
}


#line 522 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSStart (void)
{
    INT8U y;
    INT8U x;


    if (OSRunning == 0) {
        y             = OSUnMapTbl[OSRdyGrp];
        x             = OSUnMapTbl[OSRdyTbl[y]];
        OSPrioHighRdy = (INT8U)((y << 3) + x);
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();
    }
}


#line 559 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"


void OSStatInit (void)
{
    OSTimeDly(2);
 asm {PUSHF; CLI};
    OSIdleCtr    = 0L;
 asm POPF;
    OSTimeDly(200);
 asm {PUSHF; CLI};
    OSIdleCtrMax = OSIdleCtr;
    OSStatRdy    = 1;
 asm POPF;
}



#line 587 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSTaskIdle (void *pdata)
{
    pdata = pdata;
    for (;;) {
 asm {PUSHF; CLI};
        OSIdleCtr++;
 asm POPF;
    }
}


#line 623 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"


void OSTaskStat (void *pdata)
{
    INT32U run;
    INT8S  usage;


    pdata = pdata;
    while (OSStatRdy == 0) {
        OSTimeDly(2 * 200);
    }
    for (;;) {
 asm {PUSHF; CLI};
        OSIdleCtrRun = OSIdleCtr;
        run          = OSIdleCtr;
        OSIdleCtr    = 0L;
 asm POPF;
        if (OSIdleCtrMax > 0L) {
            usage = (INT8S)(100L - 100L * run / OSIdleCtrMax);
            if (usage > 100) {
                OSCPUUsage = 100;
            } else if (usage < 0) {
                OSCPUUsage =   0;
            } else {
                OSCPUUsage = usage;
            }
        } else {
            OSCPUUsage = 0;
        }
        OSTaskStatHook();
        OSTimeDly(200);
    }
}



#line 701 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
{
    OS_TCB *ptcb;


 asm {PUSHF; CLI};
    ptcb = OSTCBFreeList;
    if (ptcb != (OS_TCB *)0) {
        OSTCBFreeList        = ptcb->OSTCBNext;
 asm POPF;
        ptcb->OSTCBStkPtr    = ptos;
        ptcb->OSTCBPrio      = (INT8U)prio;
        ptcb->OSTCBStat      = 0x00;
        ptcb->OSTCBDly       = 0;








        pext                 = pext;
        stk_size             = stk_size;
        pbos                 = pbos;
        opt                  = opt;
        id                   = id;






        ptcb->OSTCBY         = prio >> 3;
        ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
        ptcb->OSTCBX         = prio & 0x07;
        ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];


        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;






 asm {PUSHF; CLI};
        OSTCBPrioTbl[prio]   = ptcb;
        ptcb->OSTCBNext      = OSTCBList;
        ptcb->OSTCBPrev      = (OS_TCB *)0;
        if (OSTCBList != (OS_TCB *)0) {
            OSTCBList->OSTCBPrev = ptcb;
        }
        OSTCBList               = ptcb;
        OSRdyGrp               |= ptcb->OSTCBBitY;
        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
 asm POPF;
        return (0);
    } else {
 asm POPF;
        return (70);
    }
}


#line 779 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

void OSTimeTick (void)
{
    OS_TCB *ptcb;


    OSTimeTickHook();
    ptcb = OSTCBList;
    while (ptcb->OSTCBPrio !=(12)) {
 asm {PUSHF; CLI};
        if (ptcb->OSTCBDly != 0) {
            if (--ptcb->OSTCBDly == 0) {
                if (!(ptcb->OSTCBStat & 0x08)) {
                    OSRdyGrp               |= ptcb->OSTCBBitY;
                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                } else {
                    ptcb->OSTCBDly = 1;
                }
            }
        }
        ptcb = ptcb->OSTCBNext;
 asm POPF;
    }
 asm {PUSHF; CLI};
    OSTime++;
 asm POPF;
}


#line 820 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_core.c"

INT16U OSVersion (void)
{
    return (200);
}
#line 22 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l\UCOS_II.C"
#line 1 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"

#line 16 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"







#line 36 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"




















#line 70 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"





















#line 117 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"


















































#line 183 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"


























#line 223 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mbox.c"
























#line 23 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l\UCOS_II.C"
#line 1 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mem.c"

#line 16 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mem.c"







#line 27 "D:\robocon\技术资料\ucos\Embedded\ucosii\samples\ex1l/os_mem.c"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -