/*
*********************************************************************************************************
*                                                uC/OS-II
*                                          The Real-Time Kernel
*                                             CORE FUNCTIONS
*
*                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
*                                           All Rights Reserved
*
*                                                  V2.00
*
* File : OS_CORE.C
* By   : Jean J. Labrosse
*********************************************************************************************************
*/

#ifndef  OS_MASTER_FILE
#define  OS_GLOBALS
#include "includes.h"
#endif

/*
*********************************************************************************************************
*                                            Áö¿ªÀû Àü¿ª º¯¼ö
*********************************************************************************************************
*/

static  INT8U        OSIntExitY;                        /* 'OSIntExit'¿¡¼­ Áö¿ªº¯¼ö ´ë½Å »ç¿ëÇÏ´Â º¯¼ö */

static  OS_STK       OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];      /* Idle ŽºÅ© ½ºÅà                    */

#if     OS_TASK_STAT_EN
static  OS_STK       OSTaskStatStk[OS_TASK_STAT_STK_SIZE];      /* Åë°è ŽºÅ© ½ºÅà                    */
#endif

static  OS_TCB       OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];   /* TCB Å×ÀÌºí                          */

/*$PAGE*/
/*
*********************************************************************************************************
*                           ºñÆ® À§Ä¡¿¡ ´ëÇÑ ºñÆ® ¸¶½ºÅ©¸¦ ¸ÅÇÎÇϱâ À§ÇÑ Å×À̺í
*
* ³ëÆ® : Å×À̺í À妽º´Â ºñÆ® À§Ä¡(0..7)¸¦ ÀǹÌ.
*        Àε¦½ÌµÈ °ªÀº ºñÆ® ¸¶½ºÅ©¿¡ ÇØ´ç.
*********************************************************************************************************
*/

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

/*
*********************************************************************************************************
*                                         ¿ì¼±¼øÀ§ ¸ÅÇÎ Å×À̺í
*
* ³ëÆ® : Å×ÀÌºí¿¡ ´ëÇÑ À妽º´Â ÃÖ»óÀ§ ¿ì¼±¼øÀ§¸¦ °è»êÇϱâ À§ÇÑ ºñÆ® ÆÐÅÏÀÓ.
*        Àε¦½ÌµÈ °ªÀº ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ºñÆ® À§Ä¡(0..7)¿¡ ÇØ´ç.
*********************************************************************************************************
*/

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
};

/*$PAGE*/
/*
*********************************************************************************************************
*                           À̺¥Æ®ÀÇ Á¾·ù¿¡ µû¶ó ŽºÅ©¸¦ ½ÇÇàÁغñ »óÅ·Π¸¸µé±â
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-IIÀÇ ´Ù¸¥ ¼­ºñ½º¿¡ ÀÇÇØ È£ÃâµÇ¸ç, À̺¥Æ®°¡ ¹ß»ýÇϱ⸦ ±â´Ù¸®´Â ŽºÅ©¸¦
*              ½ÇÇàÁغñ »óÅ·Π¸¸µç´Ù.
*
* Àü´ÞÀÎÀÚ   : pevent    ÇØ´ç À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*
*              msg       ¸Þ½ÃÁö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ÀÌ Æ÷ÀÎÅÍ´Â ¸ÞÀϹڽº³ª Å¥ °°Àº ¸Þ½ÃÁö ó¸® ¼­ºñ½º°¡
*                        »ç¿ëÇÑ´Ù. ´Ù¸¥ ¼­ºñ½º ÇÔ¼ö°¡ È£ÃâÇÒ °æ¿ì, ÀÌ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.
*
*
*              msk       TCBÀÇ »óÅ ¹ÙÀÌÆ®¸¦ Ŭ¸®¾îÇϴµ¥ »ç¿ëÇÏ´Â ¸¶½ºÅ©. ¿¹¸¦ µé¾î, OSSemPost()´Â
*                        OS_STAT_SEM¸¦, OSMboxPost()´Â OS_STAT_MBOX¸¦ Àü´ÞÇÑ´Ù.
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*********************************************************************************************************
*/
#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
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];       /* ŽºÅ©ÀÇ TCB¸¦ °¡¸®Å²´Ù                       */
    ptcb->OSTCBDly       =  0;                        /* OSTimeTick()ÀÌ Áغñ»óÅ·Π¸¸µå´Â °ÍÀ» ¸·´Â´Ù  */
    ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* ŽºÅ©¿¡¼­ ECB¸¦ »èÁ¦                         */
#if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
    ptcb->OSTCBMsg       = msg;                       /* ´ë±â ŽºÅ©·Î Á÷Á¢ ¸Þ½ÃÁö¸¦ ¼ÛºÎ              */
#else
    msg                  = msg;                       /* ÀÎÀÚ¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì ÄÄÆÄÀÏ·¯ °æ°í ¹æÁö  */
#endif
    ptcb->OSTCBStat     &= ~msk;                      /* À̺¥Æ® Á¾·ù¿¡ °ü·ÃµÈ ºñÆ®¸¦ Áö¿ò              */
    if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* Áغñ »óÅÂÀÎÁö È®ÀÎ(´ë±â »óÅÂÀÏ ¼ö ÀÖ´Ù)       */
        OSRdyGrp        |=  bity;                     /* ŽºÅ©¸¦ ½ÇÇàÁغñ ¸®½ºÆ®¿¡ µî·Ï               */
        OSRdyTbl[y]     |=  bitx;
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                   ŽºÅ©¸¦ À̺¥Æ® ´ë±â»óÅ·Π¸¸µé±â
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ´Ù¸¥ uC/OS-IIÀÇ ¼­ºñ½º ÇÔ¼ö¿¡ ÀÇÇØ È£ÃâµÇ¸ç, ŽºÅ©¸¦ À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§±îÁö
*              ´ë±â½ÃŲ´Ù.
*
* Àü´ÞÀÎÀÚ   : pevent   ŽºÅ©°¡ ±â´Ù¸± À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*********************************************************************************************************
*/
#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
void  OSEventTaskWait (OS_EVENT *pevent)
{
    OSTCBCur->OSTCBEventPtr = pevent;            /* TCB¿¡ ÀÖ´Â À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀÇ Æ÷ÀÎÅÍ ÀúÀå        */
    if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {      /* Áغñ»óŰ¡ ¾Æ´Ô           */
        OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
    }
    pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* ŽºÅ©¸¦ ´ë±â ¸ñ·Ï¿¡ µî·Ï */
    pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                           À̺¥Æ® ŸÀӾƿô ¹ß»ý½Ã ŽºÅ©¸¦ Áغñ»óÅ·Π¸¸µé±â
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ŸÀӾƿôÀÌ ¹ß»ýÇßÀ» ¶§ ŽºÅ©¸¦ Áغñ»óÅ·Π¸¸µé±â À§ÇØ uC/OS-IIÀÇ
*              ´Ù¸¥ ¼­ºñ½º ÇÔ¼ö°¡ È£ÃâÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : pevent   ŽºÅ©¸¦ Áغñ»óÅ·Π¸¸µå´Â À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*********************************************************************************************************
*/
#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
void  OSEventTO (OS_EVENT *pevent)
{
    if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
        pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
    }
    OSTCBCur->OSTCBStat     = OS_STAT_RDY;       /* Áغñ»óÅ·ΠÇÑ´Ù                                    */
    OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /* À̺¥Æ® Æ÷ÀÎÅ͸¦ »èÁ¦                               */
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                    À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀÇ ´ë±â¸ñ·Ï ÃʱâÈ­
*
* ¼³¸í       : À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀÇ ´ë±â¸ô·ÏÀ» ÃʱâÈ­ Çϱâ À§ÇØ uC/OS-IIÀÇ ´Ù¸¥ ¼­ºñ½º°¡ È£ÃâÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : pevent    À̺¥Æ®¿¡ ÇÒ´çµÈ À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*********************************************************************************************************
*/
#if  (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
void  OSEventWaitListInit (OS_EVENT *pevent)
{
    INT8U i;


    pevent->OSEventGrp = 0x00;                   /* ¾Æ¹« ŽºÅ©µµ À̺¥Æ®¸¦ ±â´Ù¸®Áö ¾Ê´Â´Ù             */
    for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
        pevent->OSEventTbl[i] = 0x00;
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                                ÃʱâÈ­
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-IIÀÇ ³»ºÎ»óŸ¦ ÃʱâÈ­ ÇÑ´Ù. ´Ù¸¥ uC/OS-II ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇϱâ Àü¿¡
*              ¹Ýµå½Ã È£ÃâÇØ¾ß Çϸç, OSStart()¸¦ È£ÃâÇϱâ Àü¿¡ È£ÃâÇØ¾ß ÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

void OSInit (void)
{
    INT16U i;


    OSTime        = 0L;                                    /* 32ºñÆ® ½Ã½ºÅÛ Å¬·°À» Ŭ¸®¾î              */
    OSIntNesting  = 0;                                     /* ÀÎÅÍ·´Æ® Áßø Ä«¿îÅÍ Å¬¸®¾î              */
    OSLockNesting = 0;                                     /* ½ºÄÉÁÙ¸µ Àá±Ý Ä«¿îÅÍ Å¬¸®¾î              */
#if OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
    OSTaskCtr     = 0;                                     /* ŽºÅ© ¼ö Ŭ¸®¾î                         */
#endif
    OSRunning     = FALSE;                                 /* ¸ÖƼŽºÅ·ÀÌ ½ÃÀÛµÇÁö ¾Ê¾ÒÀ½À» ¸í½Ã      */
    OSIdleCtr     = 0L;                                    /* 32ºñÆ® idle Ä«¿îÅÍ Å¬¸®¾î                */
#if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
    OSIdleCtrRun  = 0L;
    OSIdleCtrMax  = 0L;
    OSStatRdy     = FALSE;                                 /* Åë°è ŽºÅ©°¡ ÁغñµÇÁö ¾ÊÀ½              */
#endif
    OSCtxSwCtr    = 0;                                     /* ¹®¸ÆÀüȯ Ä«¿îÅÍ Å¬¸®¾î                   */
    OSRdyGrp      = 0;                                     /* Áغñ ¸®½ºÆ® Ŭ¸®¾î                       */
    for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
        OSRdyTbl[i] = 0;
    }

    OSPrioCur     = 0;
    OSPrioHighRdy = 0;
    OSTCBHighRdy  = (OS_TCB *)0;                                 /* TCB ÃʱâÈ­                         */
    OSTCBCur      = (OS_TCB *)0;
    OSTCBList     = (OS_TCB *)0;
    for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) {                 /* ¿ì¼±¼øÀ§ Å×À̺í Ŭ¸®¾î             */
        OSTCBPrioTbl[i] = (OS_TCB *)0;
    }
    for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {  /* ÀÚÀ¯ TCB ¸®½ºÆ® ÃʱâÈ­             */
        OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
    }
    OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0;    /* ¸¶Áö¸· OS_TCB           */
    OSTCBFreeList                                         = &OSTCBTbl[0];

#if OS_MAX_EVENTS >= 2
    for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {            /* ÀÚÀ¯ À̺¥Æ® ÄÁÆ®·Ñ ºí·ÏÀÇ ¸®½ºÆ® ÃʱâÈ­  */
        OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
    }
    OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
    OSEventFreeList                          = &OSEventTbl[0];
#endif

#if OS_Q_EN && (OS_MAX_QS >= 2)
    OSQInit();                                             /* ¸Þ½ÃÁö Å¥ ±¸Á¶Ã¼ ÃʱâÈ­                  */
#endif

#if OS_MEM_EN && OS_MAX_MEM_PART >= 2
    OSMemInit();                                           /* ¸Þ¸ð¸® °ü¸®ÀÚ ÃʱâÈ­                     */
#endif

#if OS_STK_GROWTH == 1
    #if OS_TASK_CREATE_EXT_EN
    OSTaskCreateExt(OSTaskIdle,
                    (void *)0,                                 /* OSTaskIdle()¿¡ ÀÎÀÚ¸¦ Àü´ÞÇÏÁö ¾ÊÀ½  */
                    &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤                */
                    OS_IDLE_PRIO,                              /* ÃÖÇÏÀ§ ¿ì¼±¼øÀ§                      */
                    OS_TASK_IDLE_ID,
                    &OSTaskIdleStk[0],                         /* ½ºÅà ÃÖÇÏÀ§ À§Ä¡ ¼³Á¤                */
                    OS_TASK_IDLE_STK_SIZE,
                    (void *)0,                                 /* TCB È®Àå »ç¿ëÇÏÁö ¾ÊÀ½               */
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* ½ºÅà Á¡°Ë, Ŭ¸®¾î ±â´É Ȱ¼ºÈ­        */
    #else
    OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
    #endif
#else
    #if OS_TASK_CREATE_EXT_EN
    OSTaskCreateExt(OSTaskIdle,
                    (void *)0,                                 /* OSTaskIdle()¿¡ ÀÎÀÚ¸¦ Àü´ÞÇÏÁö ¾ÊÀ½  */
                    &OSTaskIdleStk[0],                         /* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤                */
                    OS_IDLE_PRIO,                              /* ÃÖÇÏÀ§ ¿ì¼±¼øÀ§                      */
                    OS_TASK_IDLE_ID,
                    &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* ½ºÅà ÃÖÇÏÀ§ À§Ä¡ ¼³Á¤                */
                    OS_TASK_IDLE_STK_SIZE,
                    (void *)0,                                 /* TCB È®Àå »ç¿ëÇÏÁö ¾ÊÀ½               */
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* ½ºÅà Á¡°Ë/Ŭ¸®¾î ±â´É Ȱ¼ºÈ­         */
    #else
    OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
    #endif
#endif

#if OS_TASK_STAT_EN
    #if OS_TASK_CREATE_EXT_EN
        #if OS_STK_GROWTH == 1
        OSTaskCreateExt(OSTaskStat,
                        (void *)0,                                /* OSTaskStat()¿¡ ÀÎÀÚ Àü´ÞÇÏÁö ¾ÊÀ½ */
                        &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤             */
                        OS_STAT_PRIO,                             /* idle ŽºÅ© º¸´Ù 1´Ü°è ³ôÀº ¼øÀ§  */
                        OS_TASK_STAT_ID,
                        &OSTaskStatStk[0],                        /* ½ºÅà ÃÖÇÏÀ§ À§Ä¡ ¼³Á¤             */
                        OS_TASK_STAT_STK_SIZE,
                        (void *)0,                                /* TCB È®Àå »ç¿ëÇÏÁö ¾ÊÀ½            */
                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* ½ºÅà Á¡°Ë, Ŭ¸®¾î ±â´É Ȱ¼ºÈ­  */
        #else
        OSTaskCreateExt(OSTaskStat,
                        (void *)0,                                /* OSTaskStat()¿¡ ÀÎÀÚ Àü´ÞÇÏÁö ¾ÊÀ½ */
                        &OSTaskStatStk[0],                        /* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤             */
                        OS_STAT_PRIO,                             /* idle ŽºÅ©º¸´Ù 1´Ü°è ³ôÀº ¼øÀ§   */
                        OS_TASK_STAT_ID,
                        &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* ½ºÅà ÃÖÇÏÀ§ À§Ä¡ ¼³Á¤             */
                        OS_TASK_STAT_STK_SIZE,
                        (void *)0,                                /* TCB È®Àå »ç¿ëÇÏÁö ¾ÊÀ½            */
                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);  /* ½ºÅà Á¡°Ë, Ŭ¸®¾î ±â´É Ȱ¼ºÈ­  */
        #endif
    #else
        #if OS_STK_GROWTH == 1
        OSTaskCreate(OSTaskStat,
                     (void *)0,                                   /* OSTaskStat()¿¡ ÀÎÀÚ Àü´ÞÇÏÁö ¾ÊÀ½ */
                     &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],   /* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤             */
                     OS_STAT_PRIO);                               /* idle ŽºÅ©º¸´Ù 1´Ü°è ³ôÀº ¼øÀ§   */
        #else
        OSTaskCreate(OSTaskStat,
                     (void *)0,                                   /* OSTaskStat()¿¡ ÀÎÀÚ Àü´ÞÇÏÁö ¾ÊÀ½ */
                     &OSTaskStatStk[0],                           /* ½ºÅà ÃÖ»óÀ§ À§Ä¡ ¼³Á¤             */
                     OS_STAT_PRIO);                               /* idle ŽºÅ©º¸´Ù 1´Ü°è ³ôÀº ¼øÀ§   */
        #endif
    #endif
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              ISR ÁøÀÔ
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II¿¡°Ô ÀÎÅÍ·´Æ® ¼­ºñ½º ·çƾ(ISR)À¸·Î ÁøÀÔÇÏ´Â °ÍÀ» ¾Ë·ÁÁØ´Ù
*              µû¶ó¼­ uC/OS-II´Â ÀÎÅÍ·´Æ® ÁßøÀ» ÁÖ½ÃÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¸¶Áö¸· ÁßøÀÌ ÇØÁ¦µÉ ¶§¸¸ ½ºÄÉÁÙ¸µÀ»
*              ¼öÇàÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : 1) OSIntNestingÀº Àü¿ªº¯¼ö·Î ¼±¾ðµÆÀ¸¹Ç·Î ISRÀº ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÊ¿ä ¾øÀÌ ±× °ªÀ»
*                 Áõ°¡½Ãų ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ º¯¼ö´Â ¸Å¿ì Áß¿äÇÑ º¯¼ö À̹ǷΠÇÁ·Î¼¼¼­°¡ Áõ°¡½Ãų ¶§
*                 ÇÑ °³ÀÇ ¸í·É¾î¸¸À» »ç¿ëÇϰųª ´Ù¸¥ ÀÎÅÍ·´Æ®°¡ Áß°£¿¡ ¹ß»ýµÇÁö ¾Êµµ·Ï ÀûÀýÇÑ Á¶Ä¡¸¦
*                 ÃëÇØ¾ß¸¸ ÇÑ´Ù.
*              2) OSIntNestingÀ» Á÷Á¢ Áõ°¡½Ãų ¼ö´Â ÀÖÁö¸¸, °¨¼Ò½Ãų ¶§´Â ¹Ýµå½Ã OSIntExit()¸¦ È£ÃâÇÑ´Ù.
*              3) OSIntEnter()¿Í OSIntExit()´Â ¹Ýµå½Ã ½ÖÀ¸·Î È£ÃâÇØ¾ß ÇÑ´Ù. Áï, ISRÀÌ ½ÃÀÛµÉ ¶§´Â 
*                 OSIntEnter()¸¦ È£ÃâÇϰí, ISR¿¡¼­ º¹±ÍÇÒ ¶§´Â ¹Ýµå½Ã OSIntExit()¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
*
*********************************************************************************************************
*/

void OSIntEnter (void)
{
    OS_ENTER_CRITICAL();
    OSIntNesting++;                              /* ISR Áßø ·¹º§À» Áõ°¡ÇÑ´Ù                           */
    OS_EXIT_CRITICAL();
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                               ISR º¹±Í
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II¿¡°Ô ISR°¡ ¿Ï·áµÆÀ½À» ¾Ë·ÁÁØ´Ù. ¸¶Áö¸·À¸·Î ÁßøµÈ ISRÀÌ ¿Ï·áµÈ °æ¿ì
*              uC/OS-II´Â ½ºÄÉÁÙ·¯¸¦ È£ÃâÇØ¼­ »õ·Î¿î ŽºÅ©°¡ ½ÇÇàÁغñ »óŰ¡ µÆ´ÂÁö °áÁ¤ÇÑ´Ù.
*
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* Notes      : 1) OSIntEnter()¿Í OSIntExit()´Â ¹Ýµå½Ã ½ÖÀ¸·Î È£ÃâÇØ¾ß ÇÑ´Ù. Áï, ISRÀÌ ½ÃÀÛµÉ ¶§´Â 
*                 OSIntEnter()¸¦ È£ÃâÇϰí, ISR¿¡¼­ º¹±ÍÇÒ ¶§´Â ¹Ýµå½Ã OSIntExit()¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
*              
*              2) ½ºÄÉÁÙ·¯°¡ Àá°Ü ÀÖ´Â °æ¿ì(OSSchedLock()ÂüÁ¶) ½ºÄÉÁÙ¸µÀº ÀÌ·ïÁöÁö ¾Ê´Â´Ù.
*********************************************************************************************************
*/

void OSIntExit (void)
{
    OS_ENTER_CRITICAL();
    if ((--OSIntNesting | OSLockNesting) == 0) { /* ¸ðµç ISRÀÌ Ã³¸®µÆ°í, ½ºÄÉÁÙ·¯°¡ ÇØÁ¦ »óÅÂÀΰ¡?     */
        OSIntExitY    = OSUnMapTbl[OSRdyGrp];
        OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
        if (OSPrioHighRdy != OSPrioCur) {        /* ÇöÀç ŽºÅ©°¡ ÃÖ»óÀ§¸é, ¹®¸ÆÀ» ÀüȯÇÏÁö ¾ÊÀ½       */
            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                        /* ¹®¸ÆÀüȯ Ƚ¼ö¸¦ °»½ÅÇÑ´Ù                           */
            OSIntCtxSw();                        /* ÀÎÅÍ·´Æ® ·¹º§ ¹®¸ÆÀüȯ                             */
        }
    }
    OS_EXIT_CRITICAL();
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              ½ºÄÉÁÙ·¯
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ¾î¶² ŽºÅ©°¡ ½ÇÇàÁغñµÈ ÃÖ»óÀ§ ¿ì¼±¼øÀ§ÀÎÁö °áÁ¤Çϱâ À§ÇØ uC/OS-IIÀÇ ´Ù¸¥
*              ÇÔ¼ö°¡ È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ŽºÅ© ·¹º§ Äڵ尡 È£ÃâÇØ¾ß Çϸç, ISR ³»¿¡¼­ ŽºÅ© ½ºÄÉÁÙ¸µÀ»
*              À§ÇØ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù(ISR¿¡¼­ÀÇ ½ºÄÉÁÙ¸µÀº OSIntExit() ÂüÁ¶).
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : 1) ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*              2) ½ºÄÉÁÙ·¯°¡ Àá°Ü ÀÖ´Â °æ¿ì(OSSchedLock()ÂüÁ¶) ½ºÄÉÁÙ¸µÀº ÀÌ·ïÁöÁö ¾Ê´Â´Ù.
*********************************************************************************************************
*/

void OSSched (void)
{
    INT8U y;


    OS_ENTER_CRITICAL();
    if ((OSLockNesting | OSIntNesting) == 0) {   /* ½ºÄÉÁÙ·¯°¡ ÇØÁ¦ »óÅÂÀ̰í ISR »óŰ¡ ¾Æ´Ñ °æ¿ì      */
        y             = OSUnMapTbl[OSRdyGrp];    /* ½ÇÇàÁغñ »óÅÂÀÎ ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ŽºÅ© Æ÷ÀÎÅÍ ¾òÀ½ */
        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) {         /* ÇöÀç ŽºÅ©°¡ ÃÖ»óÀ§ÀÎ °æ¿ì ¹®¸ÆÀüȯ ¾øÀ½         */
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                        /* ¹®¸ÆÀüȯ Ä«¿îÅÍ Áõ°¡                               */
            OS_TASK_SW();                        /* ¹®¸ÆÀüȯ ¼öÇà                                      */
        }
    }
    OS_EXIT_CRITICAL();
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                            ½ºÄÉÁÙ¸µ Àá±×±â
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ½ºÄÉÁÙ¸µÀÌ ¹ß»ýÇÏ´Â °ÍÀ» ¸·±â À§ÇØ »ç¿ëÇÑ´Ù. µû¶ó¼­ ÀÀ¿ëÇÁ·Î±×·¥Àº ¹®¸ÆÀüȯÀ»
*              Çã¿ëÇÒ Áغñ°¡ µÉ ¶§±îÁö ½ºÄÉÁÙ¸µÀ» Àá±Û ¼ö ÀÖ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : 1) OSSchedLock()°ú OSSchedUnlock()Àº ½ÖÀ¸·Î È£ÃâÇØ¾ß ÇÑ´Ù. Áï, OSSchedLock()À» È£ÃâÇÒ
*                 ¶§¸¶´Ù OSSchedUnlock()À» È£ÃâÇØ¾ß ÇÑ´Ù.
*********************************************************************************************************
*/

void OSSchedLock (void)
{
    if (OSRunning == TRUE) {                     /* ¸ÖƼŽºÅ·ÀÌ ½ÃÀ۵ƴÂÁö È®ÀÎ                       */
        OS_ENTER_CRITICAL();
        OSLockNesting++;                         /* Àá±Ý Áßø Ä«¿îÅ͸¦ Áõ°¡ÇÑ´Ù                        */
        OS_EXIT_CRITICAL();
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                           ½ºÄÉÁÙ¸µ ÇØÁ¦
*
* ¼³¸í       : ½ºÄÉÁÙ¸µÀ» ÇØÁ¦Çϱâ À§ÇØ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : 1) OSSchedLock()°ú OSSchedUnlock()Àº ½ÖÀ¸·Î È£ÃâÇØ¾ß ÇÑ´Ù. Áï, OSSchedLock()À» È£ÃâÇÒ
*                 ¶§¸¶´Ù OSSchedUnlock()À» È£ÃâÇØ¾ß ÇÑ´Ù.
*********************************************************************************************************
*/

void OSSchedUnlock (void)
{
    if (OSRunning == TRUE) {                           /* ¸ÖƼŽºÅ·ÀÌ ½ÃÀ۵ƴÂÁö È®ÀÎ                 */
        OS_ENTER_CRITICAL();
        if (OSLockNesting > 0) {                       /* Ä«¿îÅͰ¡ ÀÌ¹Ì 0ÀÌ¸é °¨¼ÒÇÏÁö ¾Ê´Â´Ù          */
            OSLockNesting--;                           /* Àá±Ý Áßø Ä«¿îÅ͸¦ °¨¼ÒÇÑ´Ù                  */
            if ((OSLockNesting | OSIntNesting) == 0) { /* ½ºÄÉÁÙ¸µÀÌ ÇØÁ¦µÆ°í ISRÀÌ ¾Æ´ÑÁö È®ÀÎ        */
                OS_EXIT_CRITICAL();
                OSSched();                             /* »óÀ§ ¿ì¼±¼øÀ§ ŽºÅ©°¡ ½ÇÇàÁغñ µÆ´ÂÁö È®ÀÎ  */
            } else {
                OS_EXIT_CRITICAL();
            }
        } else {
            OS_EXIT_CRITICAL();
        }
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                           ¸ÖƼŽºÅ· ½ÃÀÛ
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ¸ÖƼŽºÅ· ÇÁ·Î¼¼½º¸¦ ±âµ¿½ÃÄѼ­ uC/OS-II·Î ÇÏ¿©±Ý »ý¼ºµÈ ŽºÅ©¸¦ °ü¸®Çϵµ·Ï
*              ÇØ ÁØ´Ù. OSStart()¸¦ È£ÃâÇÏ·Á¸é ±× Àü¿¡ ¹Ýµå½Ã OSInit()À» È£ÃâÇϰí Çϳª ÀÌ»óÀÇ Å½ºÅ©¸¦
*              »ý¼ºÇØ¾ß ÇÑ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : OSStartHighRdy()´Â ´ÙÀ½ÀÏÀ» ÇØ¾ß ÇÑ´Ù
*                 a) OSTaskSwHook()À» È£ÃâÇÑ µÚ,
*                 b) OSRunningÀ» TRUE·Î ¼¼Æ®ÇÑ´Ù.
*********************************************************************************************************
*/

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


    if (OSRunning == FALSE) {
        y             = OSUnMapTbl[OSRdyGrp];        /* ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ŽºÅ©ÀÇ ½ÇÁ¦ ¿ì¼±¼øÀ§¸¦ °è»ê  */
        x             = OSUnMapTbl[OSRdyTbl[y]];
        OSPrioHighRdy = (INT8U)((y << 3) + x);
        OSPrioCur     = OSPrioHighRdy;
        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* ½ÇÇà ÁغñµÈ ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ŽºÅ©¸¦ °¡¸®Å²´Ù  */
        OSTCBCur      = OSTCBHighRdy;
        OSStartHighRdy();                            /* ŽºÅ©¸¦ ½ÃÀÛÇϴ Ÿ°Ù ÀÇÁ¸Àû Äڵ带 ½ÇÇà      */
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                             Åë°è ±â´É ÃʱâÈ­
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â, ´Ù¸¥ ŽºÅ©°¡ ¼öÇàµÇÁö ¾Ê´Â 1ÃÊ µ¿¾È 32ºñÆ® Ä«¿îÅͰ¡ ¾ó¸¸Å­ Áõ°¡ÇÏ´ÂÁö ¾Ë¾Æ
*              ³»¼­ ÀÀ¿ëÇÁ·Î±×·¥ÀÌ CPU »ç¿ëÀ²À» °è»êÇÒ ¶§ »ç¿ëÇϵµ·Ï ÇØÁØ´Ù.
*              ÀÌ ÈÄ, CPU »ç¿ëÀ²Àº 32ºñÆ® Ä«¿îÅ͸¦ Áö¼ÓÀûÀ¸·Î ÁÖ½ÃÇϰí ÀÖ´Â ³·Àº ¿ì¼±¼øÀ§ ŽºÅ©¿¡ ÀÇÇØ
*              °è»êµÈ´Ù. ±×·¯³ª ÀÌ °æ¿ì´Â Ÿ¸¥ ŽºÅ©°¡ ½ÇÇàµÇ°í ÀÖ´Â »óÅ´Ù.
*              CPU »ç¿ëÀ²Àº ´ÙÀ½°ú °°ÀÌ ÁÖ¾îÁø´Ù:
*
*                                             OSIdleCtr
*                 CPU »ç¿ëÀ²(%) = 100 * (1 - ------------)
*                                            OSIdleCtrMax
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

#if OS_TASK_STAT_EN
void OSStatInit (void)
{
    OSTimeDly(2);                                /* Ŭ·° ƽ¿¡ µ¿±âÈ­                                   */
    OS_ENTER_CRITICAL();
    OSIdleCtr    = 0L;                           /* idle Ä«¿îÅÍ Å¬¸®¾î                                 */
    OS_EXIT_CRITICAL();
    OSTimeDly(OS_TICKS_PER_SEC);                 /* 1ÃÊ µ¿¾ÈÀÇ ÃÖ´ë idle Ä«¿îÅÍ °ªÀ» ¾Ë¾Æ³½´Ù          */
    OS_ENTER_CRITICAL();
    OSIdleCtrMax = OSIdleCtr;                    /* ÀÌ °ªÀ» ÃÖ´ë Ä«¿îÅÍ º¯¼ö¿¡ ÀúÀå                    */
    OSStatRdy    = TRUE;
    OS_EXIT_CRITICAL();
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                              IDLE ŽºÅ©
*
* ¼³¸í       : ÀÌ Å½ºÅ©´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϸç, ´Ù¸¥ »óÀ§ ¿ì¼±¼øÀ§ ŽºÅ©°¡ ¼öÇàµÇÁö ¾ÊÀ» ¶§
*              ½ÇÇàµÈ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

void OSTaskIdle (void *pdata)
{
    pdata = pdata;                               /* ÄÄÆÄÀÏ·¯ °æ°í¸¦ ¹æÁöÇÑ´Ù                           */
    for (;;) {
        OS_ENTER_CRITICAL();
        OSIdleCtr++;
        OS_EXIT_CRITICAL();
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              Åë°è ŽºÅ©
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϸç, ¸ÖƼŽºÅ· ȯ°æ¿¡¼­ÀÇ ¸î °¡Áö Åë°è°ªÀ» °è»êÇÑ´Ù.
*              ±¸Ã¼ÀûÀ¸·Î, OSTaskStat()Àº CPU »ç¿ëÀ²À» °è»êÇÑ´Ù.
*              CPU »ç¿ëÀ²Àº ´ÙÀ½°ú °°ÀÌ ÁÖ¾îÁø´Ù:
*
*                                          OSIdleCtr
*                 OSCPUUsage = 100 * (1 - ------------)     (´ÜÀ§´Â %´Ù)
*                                         OSIdleCtrMax
*
* Àü´ÞÀÎÀÚ   : pdata     ÇöÀç ÀÌ Æ÷ÀÎÅÍ´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù.
*
* ¸®Åϰª     : ¾øÀ½
*
* ³ëÆ®       : 1) ÀÌ Å½ºÅ©´Â idle ŽºÅ©º¸´Ù ³ôÀº ¿ì¼±¼øÀ§·Î ½ÇÇàµÈ´Ù. ½ÇÁ¦, ÇÑ ´Ü°è ³ôÀº ¿ì¼±¼øÀ§ÀÎ
*                 OS_IDLE_PRIO-1·Î ½ÇÇàµÈ´Ù.
*              2) ¼³Á¤ ¸ÅÅ©·Î OS_TASK_STAT_ENÀ» 0À¸·Î ¼±¾ðÇϸé ÀÌ Å½ºÅ©¸¦ ºñȰ¼ºÈ­ ÇÒ ¼ö ÀÖ´Ù.
*              3) ´Ù¸¥ ¸ðµç ŽºÅ©°¡ »ý¼ºµÈ ÈÄ, ½Ã½ºÅÛÀÌ ¾ÈÁ¤µÈ »óŰ¡ µÉ ¶§±îÁö ±â´Ù¸®±â À§Çؼ­
*                 Åë°è ŽºÅ©¸¦ ½ÃÀÛÇϱâ Àü¿¡ 5ÃÊ Á¤µµ Áö¿¬ÇÑ´Ù. ½Ã½ºÅÛÀÌ idle ŽºÅ©ÀÇ ÃÖ´ë°ªÀ» ¾òÀ»
*                 ¼ö ÀÖµµ·Ï ÃÖ¼ÒÇÑ 2ÃÊ Á¤µµÀÇ ½Ã°£Áö¿¬À» Áà¾ßÇÑ´Ù.
*
*********************************************************************************************************
*/

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


    pdata = pdata;                               /* ÄÄÆÄÀÏ·¯ °æ°í ¹æÁö                                 */
    while (OSStatRdy == FALSE) {
        OSTimeDly(2 * OS_TICKS_PER_SEC);         /* Åë°è ŽºÅ©°¡ ÁغñµÉ ¶§ ±îÁö ´ë±âÇÑ´Ù              */
    }
    for (;;) {
        OS_ENTER_CRITICAL();
        OSIdleCtrRun = OSIdleCtr;                /* ´ë±â½Ã°£ µ¿¾È idle ŽºÅ©°¡ Áõ°¡ÇÑ Ä«¿îÅ͸¦ ¾ò´Â´Ù */
        run          = OSIdleCtr;
        OSIdleCtr    = 0L;                       /* ´ÙÀ½ ´ë±â½Ã°£À» À§ÇØ Ä«¿îÅ͸¦ ¸®¼Â                 */
        OS_EXIT_CRITICAL();
        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();                        /* »ç¿ëÀÚ ÈÅ(hook)ÇÔ¼ö È£Ãâ                           */
        OSTimeDly(OS_TICKS_PER_SEC);             /* 1Ãʰ£ ´ë±â ÇØ¼­ OSIdleCtr °ªÀ» ´©ÀûÇÑ´Ù            */
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                              TCB ÃʱâÈ­
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎ ÇÔ¼ö¸ç, ŽºÅ© »ý¼º½Ã ŽºÅ© ÄÁÆ®·Ñ ºí·ÏÀ» ÃʱâÈ­ÇÑ´Ù.
*              (OSTaskCreate(), OSTaskCreateExt() ÂüÁ¶)
*
* Àü´ÞÀÎÀÚ   : prio          »ý¼ºÇϴ ŽºÅ©ÀÇ ¿ì¼±¼øÀ§
*
*              ptos          CPU ·¹Áö½ºÅ͸¦ ÀÌ¹Ì ½ºÅÿ¡ ÀúÀåÇÑ »óÅ¿¡¼­ ½ºÅÿµ¿ª ½ÃÀÛÀ§Ä¡¸¦ °¡¸®Å°´Â
*                            Æ÷ÀÎÅÍ. OS_STK_GROWTH°¡ 1ÀÏ ¶§´Â ½ºÅÿµ¿ª ½ÃÀÛÀ§Ä¡°¡ »óÀ§ ¸Þ¸ð¸®¸¦ ÀǹÌÇϰí
*                            0ÀÎ °æ¿ì´Â ÇÏÀ§ ¸Þ¸ð¸®¸¦ ÀǹÌÇÑ´Ù. ½ºÅÃÀÌ »ç¿ëµÇ´Â ¹æÇâÀº CPU¿¡ µû¶ó
*                            ´Ù¸£´Ù´Â Á¡À» À¯ÀÇÇ϶ó.
*
*
*              pbos          ½ºÅÿµ¿ªÀÇ ³¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*                            'OSTaskCreate()'¸¦ È£ÃâÇÑ °æ¿ì´Â NULLÀÌ Àü´ÞµÈ´Ù.
*
*              id            ŽºÅ© ID(0..65535)
*
*              stk_size      ½ºÅÿä¼Ò ´ÜÀ§ÀÇ ½ºÅÃÅ©±â.  ½ºÅÿä¼Ò°¡ INT8UÀ̸é 'stk_size'´Â ½ºÅÃÀÇ ¹ÙÀÌÆ® 
*                            ¼ö¸¦ ÀǹÌÇÑ´Ù. ½ºÅÿä¼Ò°¡ INT32UÀÌ¸é ½ºÅÃÀÇ ¹ÙÀÌÆ® ¼ö´Â '4 * stk_size'´Ù.
*                            ½ºÅÿä¼Ò´Â OS_STK·Î °áÁ¤Çϸç CPU¿¡ ÀÇÁ¸ÀûÀÌ´Ù.
*                            'OSTaskCreate()'¸¦ È£ÃâÇÑ °æ¿ì 'stk_size'´Â 0ÀÌ´Ù.
*
*
*              pext          ŽºÅ© ÄÁÆ®·Ñ ºí·ÏÀ» È®ÀåÀ» À§ÇØ »ç¿ëÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ¸Þ¸ð¸® ¿µ¿ª.
*                            ¹®¸ÆÀüȯÀÌ ÀϾ ¶§ ºÎµ¿ ¼Ò¼ö ¿¬»ê ·¹Áö½ºÅÍ, MMU ·¹Áö½ºÅ͸¦ ÀúÀåÇÏ´Â ÀÏ µî
*                            ¾î¶² À¯¿ëÇÑ Àϵµ ÇÒ ¼ö ÀÖ´Ù.
*                            ¶Ç ŽºÅ©ÀÇ À̸§À» Áö¾î ÀÌ ¿µ¿ª¿¡ ÀúÀåÇÒ ¼öµµ ÀÖ´Ù.
*                            'OSTaskCreate()'¸¦ È£ÃâÇÑ °æ¿ì NULL Æ÷ÀÎÅͰ¡ Àü´ÞµÈ´Ù.
*
*
*              opt           'OSTaskCreateExt()'¸¦ È£ÃâÇßÀ» ¶§ Àü´ÞµÇ´Â ¿É¼ÇÀ̸ç,
*                            'OSTaskCreate()'¸¦ È£ÃâÇÑ °æ¿ì´Â 0ÀÌ´Ù.
*
* ¸®Åϰª     : OS_NO_ERR         È£Ãâ ¼º°ø
*              OS_NO_MORE_TCB    ÇÒ´çÇÒ ÀÚÀ¯ TCB°¡ ¾øÀ¸¹Ç·Î ŽºÅ©¸¦ »ý¼ºÇÒ ¼ö ¾øÀ½.
*
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â uC/OS-II ³»ºÎÀûÀ¸·Î »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥ÀÌ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¾ÈµÈ´Ù.
*********************************************************************************************************
*/

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


    OS_ENTER_CRITICAL();
    ptcb = OSTCBFreeList;                                  /* ÀÚÀ¯ TCB ¸®½ºÆ®¿¡¼­ TCB¸¦ Çϳª ¾ò´Â´Ù    */
    if (ptcb != (OS_TCB *)0) {
        OSTCBFreeList        = ptcb->OSTCBNext;            /* ÀÚÀ¯ TCB ¸®½ºÆ®ÀÇ Æ÷ÀÎÅÍ °»½Å            */
        OS_EXIT_CRITICAL();
        ptcb->OSTCBStkPtr    = ptos;                       /* TCB¿¡ ½ºÅà Æ÷ÀÎÅÍ ·Îµå                   */
        ptcb->OSTCBPrio      = (INT8U)prio;                /* TCB¿¡ ¿ì¼±¼øÀ§ ·Îµå                      */
        ptcb->OSTCBStat      = OS_STAT_RDY;                /* ŽºÅ© ½ÇÇà Áغñ »óÅ                    */
        ptcb->OSTCBDly       = 0;                          /* ŽºÅ© Áö¿¬ ¾øÀ½                         */

#if OS_TASK_CREATE_EXT_EN
        ptcb->OSTCBExtPtr    = pext;                       /* TCB È®Àå Æ÷ÀÎÅÍ ÀúÀå                     */
        ptcb->OSTCBStkSize   = stk_size;                   /* ½ºÅà ũ±â ÀúÀå                           */
        ptcb->OSTCBStkBottom = pbos;                       /* ½ºÅÿµ¿ª ³¡ Æ÷ÀÎÅÍ ÀúÀå                  */
        ptcb->OSTCBOpt       = opt;                        /* ŽºÅ© ¿É¼Ç ÀúÀå                         */
        ptcb->OSTCBId        = id;                         /* ŽºÅ© ID ÀúÀå                           */
#else
        pext                 = pext;                       /* »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì ÄÄÆÄÀÏ·¯ °æ°í ¹æÁö    */
        stk_size             = stk_size;
        pbos                 = pbos;
        opt                  = opt;
        id                   = id;
#endif

#if OS_TASK_DEL_EN
        ptcb->OSTCBDelReq    = OS_NO_ERR;
#endif

        ptcb->OSTCBY         = prio >> 3;                  /* X, Y, BitX, BitY¸¦ ¹Ì¸® °è»ê             */
        ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
        ptcb->OSTCBX         = prio & 0x07;
        ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];

#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN
        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;              /* À̺¥Æ®¸¦ ±â´Ù¸®Áö ¾ÊÀ½                   */
#endif

#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2))
        ptcb->OSTCBMsg       = (void *)0;                  /* ¸Þ½ÃÁö µµÂøÇÏÁö ¾Ê¾ÒÀ½                   */
#endif

        OS_ENTER_CRITICAL();
        OSTCBPrioTbl[prio]   = ptcb;
        ptcb->OSTCBNext      = OSTCBList;                  /* TCB ¸®½ºÆ®¿¡ ¿¬°á                        */
        ptcb->OSTCBPrev      = (OS_TCB *)0;
        if (OSTCBList != (OS_TCB *)0) {
            OSTCBList->OSTCBPrev = ptcb;
        }
        OSTCBList               = ptcb;
        OSRdyGrp               |= ptcb->OSTCBBitY;         /* ŽºÅ©¸¦ ½ÇÇà Áغñ »óÅ·ΠÇÔ             */
        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
        OS_EXIT_CRITICAL();
        return (OS_NO_ERR);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_NO_MORE_TCB);
    }
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                         ½Ã½ºÅÛ Å¬·° ƽ ó¸®
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â '½Ã½ºÅÛ Æ½'À̶ó°íµµ ÇÏ´Â 'Ŭ·° ƽ'ÀÌ ¹ß»ýÇÑ °ÍÀ» uC/OS-II·Î ¾Ë·ÁÁÖ°í
*              ÇÊ¿äÇÑ ÀÏÀ» ó¸®ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ƼĿ ISRÀÌ È£ÃâÇØ¾ß ÇÏÁö¸¸ ¿ì¼±¼øÀ§°¡ ³ôÀº ŽºÅ©°¡
*              È£ÃâÇÒ ¼öµµ ÀÖ´Ù.
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¾øÀ½
*********************************************************************************************************
*/

void OSTimeTick (void)
{
    OS_TCB *ptcb;


    OSTimeTickHook();                                      /* »ç¿ëÀÚ ÈÅ(hook)ÇÔ¼ö È£Ãâ                 */
    ptcb = OSTCBList;                                      /* TCB ¸®½ºÆ®¿¡¼­ ù ¹øÂ° TCB¸¦ °¡¸®Å²´Ù    */
    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* ¸ðµç TCB¸¦ ó¸®ÇÑ´Ù                      */
        OS_ENTER_CRITICAL();
        if (ptcb->OSTCBDly != 0) {                         /* ŸÀӾƿô°ú ÇÔ²² À̺¥Æ® ¶Ç´Â ½Ã°£Áö¿¬´ë±â */
            if (--ptcb->OSTCBDly == 0) {                   /* Ä«¿îÅͰ¡ 0ÀÌ µÉ ¶§±îÁö Ŭ·° ƽ ¼ö¸¦ °¨¼Ò */
                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* ŽºÅ©°¡ ÀϽà ÁßÁö »óÅÂÀΰ¡?         */
                    OSRdyGrp               |= ptcb->OSTCBBitY; /* No,ŽºÅ©¸¦ Áغñ»óÅ·Π¸¸µê(ŸÀӾƿô)*/
                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                } else {                                       /* Yes, ¼­½ºÆæÆ® »óŰ¡ ÇØÁ¦µÉ ¶§...    */
                    ptcb->OSTCBDly = 1;                        /* ... ŽºÅ©¸¦ ÀÒ¾î¹ö¸®´Â °ÍÀ»  ...    */
                }                                              /* ... ¹æÁöÇϱâ À§ÇØ 1ƽÀ» ³²°ÜµÐ´Ù     */
            }
        }
        ptcb = ptcb->OSTCBNext;                            /* TCB ¸®½ºÆ®¿¡¼­ ´ÙÀ½ TCB¸¦ °¡¸®Å²´Ù       */
        OS_EXIT_CRITICAL();
    }
    OS_ENTER_CRITICAL();                                   /* 32ºñÆ® ƽ Ä«¿îÅ͸¦ Áõ°¡ÇÑ´Ù              */
    OSTime++;
    OS_EXIT_CRITICAL();
}
/*$PAGE*/
/*
*********************************************************************************************************
*                                              ¹öÀü Á¤º¸
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-IIÀÇ ¹öÀüÁ¤º¸¸¦ ¸®ÅÏÇÑ´Ù. ¸®ÅϵǴ °ªÀº ½ÇÁ¦ ¹öÀü ¹øÈ£¿¡ 100À» °öÇÑ
*              °ªÀÌ´Ù. Áï, ¹öÀü 2.00ÀÎ °æ¿ì 200À» ¸®ÅÏÇÑ´Ù
*
*
* Àü´ÞÀÎÀÚ   : ¾øÀ½
*
* ¸®Åϰª     : ¹öÀü ¹øÈ£´Â 100À» °öÇÑ °ªÀÌ´Ù.
*********************************************************************************************************
*/

INT16U OSVersion (void)
{
    return (OS_VERSION);
}