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

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

/*
*********************************************************************************************************
*                                              Áö¿ª ÇÔ¼ö ¿øÇü
*********************************************************************************************************
*/


static  void  OSDummy(void);

/*
*********************************************************************************************************
*                                               ´õ¹Ì ÇÔ¼ö
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ¾Æ¹«°Íµµ ÇÏÁö ¾Ê´Â´Ù. It is called by OSTaskDel() to ensure that interrupts
*              are disabled immediately after they are enabled.
*
* Àü´ÞÀÎÀÚ   : none
*
* ¸®Åϰª     : none
*********************************************************************************************************
*/

static void  OSDummy (void)
{
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                           ŽºÅ© ¿ì¼±¼øÀ§ º¯°æ
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ŽºÅ© ¿ì¼±¼øÀ§¸¦ µ¿ÀûÀ¸·Î º¯°æÇϱâ À§ÇØ »ç¿ëÇÑ´Ù.
*              »õ·Î ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§¸¦ ÀÌ¹Ì »ç¿ëÇϰí ÀÖÁö ¾Ê¾Æ¾ß ÇÑ´Ù´Â °ÍÀ» ÁÖÀÇÇ϶ó.
*
* Àü´ÞÀÎÀÚ   : oldp     ÀÌÀü ¿ì¼±¼øÀ§
*
*              newp     »õ·Î ÁöÁ¤ÇÏ´Â ¿ì¼±¼øÀ§
*
* ¸®Åϰª     : OS_NO_ERR        È£Ãâ ¼º°ø.
*              OS_PRIO_INVALID  »õ·Î ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§°¡ ¼öÄ¡»óÀ¸·Î ÃÖ´ë°ªº¸´Ù Å­.
*                               (Áï, >= OS_LOWEST_PRIO)
*              OS_PRIO_EXIST    ÀÌ¹Ì »ç¿ëÇϰí ÀÖ´Â ¿ì¼±¼øÀ§¸¦ »ç¿ëÇßÀ½.
*              OS_PRIO_ERR      ÀÌÀü ¿ì¼±¼øÀ§¿¡ ÇØ´çÇϴ ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½.
*
*********************************************************************************************************
*/

#if OS_TASK_CHANGE_PRIO_EN
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
{
    OS_TCB   *ptcb;
    OS_EVENT *pevent;
    INT8U     x;
    INT8U     y;
    INT8U     bitx;
    INT8U     bity;


    if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF)  || 
         newprio >= OS_LOWEST_PRIO) {
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* ÀÌ¹Ì ¿ì¼±¼øÀ§¸¦ »ç¿ëÇϰí ÀÖÀ¸¸é ¾ÈµÊ*/
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    } else {
        OSTCBPrioTbl[newprio] = (OS_TCB *)1;                    /* ´Ù¸¥ ŽºÅ©ÀÇ ½Ãµµ¸¦ ¸·±â À§ÇØ ¿¹¾à */
        OS_EXIT_CRITICAL();
        y    = newprio >> 3;                                    /* INT. ÀÀ´ä½Ã°£À» ÁÙÀ̱â À§ÇØ ¹Ì¸®°è»ê*/
        bity = OSMapTbl[y];
        x    = newprio & 0x07;
        bitx = OSMapTbl[x];
        OS_ENTER_CRITICAL();
        if (oldprio == OS_PRIO_SELF) {                          /* ÀÚ½ÅÀ» º¯°æÇÏ´ÂÁö È®ÀÎ              */
            oldprio = OSTCBCur->OSTCBPrio;                      /* ¿¹, ¿ì¼±¼øÀ§¸¦ ¾òÀ½                 */
        }
        if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {    /* º¯°æÇÏ·Á´Â ŽºÅ©°¡ Á¸ÀçÇØ¾ß ÇÔ     */
            OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                /* ÀÌÀü ¿ì¼±¼øÀ§ TCB¸¦ »èÁ¦            */
            if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) {     /* ŽºÅ©°¡ Áغñ»óÅÂ¸é µî·Ï»óÅ º¯°æ   */
                if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
                    OSRdyGrp &= ~ptcb->OSTCBBitY;
                }
                OSRdyGrp    |= bity;                            /* »õ ¿ì¼±¼øÀ§ Áغñ»óÅ·Π¸¸µê         */
                OSRdyTbl[y] |= bitx;
            } else {
                if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { /* À̺¥Æ® ´ë±â ¸®½ºÆ®¿¡¼­ »èÁ¦  */
                    if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
                        pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
                    }
                    pevent->OSEventGrp    |= bity;              /* ´ë±â ¸®½ºÆ®¿¡ »õ ¿ì¼±¼øÀ§ µî·Ï      */
                    pevent->OSEventTbl[y] |= bitx;
                }
            }
            OSTCBPrioTbl[newprio] = ptcb;                       /* »õ ¿ì¼±¼øÀ§·Î TCB Æ÷ÀÎÅÍ µî·Ï       */
            ptcb->OSTCBPrio       = newprio;                    /* »õ ¿ì¼±¼øÀ§ ÀúÀå                    */
            ptcb->OSTCBY          = y;
            ptcb->OSTCBX          = x;
            ptcb->OSTCBBitY       = bity;
            ptcb->OSTCBBitX       = bitx;
            OS_EXIT_CRITICAL();
            OSSched();                                          /* Áغñ»óÅÂÀÇ ÃÖ¿ì¼±¼øÀ§ ŽºÅ© ½ÇÇà   */
            return (OS_NO_ERR);
        } else {
            OSTCBPrioTbl[newprio] = (OS_TCB *)0;                /* ¿¹¾àÇß´ø ¿ì¼±¼øÀ§¸¦ ¾çµµÇÑ´Ù        */
            OS_EXIT_CRITICAL();
            return (OS_PRIO_ERR);                               /* º¯°æÇÏ·Á´Â ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½   */
        }
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                             ŽºÅ© »ý¼º
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II°¡ ŽºÅ©ÀÇ ½ÇÇàÀ» °ü¸®ÇÒ ¶§ »ç¿ëÇÑ´Ù. ŽºÅ©´Â ¸ÖƼŽºÅ·À» ½ÃÀÛÇϱâ
*              Àü ¶Ç´Â ½ÇÇà µÚ ½ÇÇàÇϰí Àִ ŽºÅ©°¡ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ISRÀº ŽºÅ©¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù.
*
*
* Àü´ÞÀÎÀÚ   : task     ŽºÅ© ÄÚµåÀÇ ½ÃÀÛÁ¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ
*
*              pdata    ŽºÅ©°¡ óÀ½ ½ÇÇàµÉ ¶§ ŽºÅ© ³»¿¡¼­ »ç¿ëÇÏ´Â Àü´ÞÀÎÀÚ¸¦ °¡¸®Å°´Â ¼±ÅÃÀû Æ÷ÀÎÅÍ
*                       ŽºÅ©´Â ´ÙÀ½°ú °°ÀÌ Àü´ÞÀÎÀÚ 'pdata'¸¦ ³Ñ°Ü ¹ÞÀº °ÍÀ¸·Î »ý°¢ÇÑ´Ù
*
*
*                           void Task (void *pdata)
*                           {
*                               for (;;) {
*                                   Task code;
*                               }
*                           }
*
*              ptos     ŽºÅ© ½ºÅÃÀÇ ½ÃÀÛÀ§Ä¡¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ¼³Á¤ »ó¼ö OS_STK_GROWTH¸¦ 1·Î ¼³Á¤ÇÑ
*                       ¾Æ·¡ ¹æÇâ(¸Þ¸ð¸®ÀÇ »óÀ§ ¹øÁö¿¡¼­ ÇÏÀ§ ¹øÁö·Î)À¸·Î ½ºÅÃÀ» »ç¿ëÇÏ´Â °ÍÀ¸·Î °¡Á¤
*                       ÇÑ´Ù. ÀÌ °æ¿ì 'ptos'´Â ½ºÅÿµ¿ªÀÇ ÃÖ»óÀ§ ¹øÁö ¸Þ¸ð¸®¸¦ °¡¸®Å²´Ù. OS_STK_GROWTH¸¦
*                       0À¸·Î ¼³Á¤ÇÑ °æ¿ì 'ptos'´Â ½ºÅÿµ¿ªÀÇ ÃÖÇÏÀ§ ¹øÁö ¸Þ¸ð¸®¸¦ °¡¸®Å°¸ç, ½ºÅÃÀ» 
*                       »ç¿ëÇÔ¿¡ µû¶ó ¹øÁö´Â Áõ°¡ÇÒ °ÍÀÌ´Ù.
*
*
*
*              prio     ŽºÅ© ¿ì¼±¼øÀ§. °¢ ŽºÅ©¿¡´Â °íÀ¯ÇÑ ¿ì¼±¼øÀ§¸¦ ¹èÁ¤ÇØ¾ß Çϸç, °ªÀÌ ÀÛÀ»¼ö·Ï
*                       ½ÇÁ¦ ¿ì¼±¼øÀ§´Â ³ô´Ù.
*
* ¸®Åϰª     : OS_NO_ERR        ŽºÅ©¸¦ Á¤»óÀûÀ¸·Î »ý¼ºÇßÀ½
*              OS_PRIO_EXIT     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ÀÇŽºÅ©°¡ ÀÌ¹Ì Á¸ÀçÇÔ
*                               (°¢ ŽºÅ©¿¡´Â °íÀ¯ÇÑ ¿ì¼±¼øÀ§¸¦ ¹èÁ¤ÇØ¾ß ÇÑ´Ù)
*              OS_PRIO_INVALID  ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©´Ù
*
*********************************************************************************************************
*/

#if OS_TASK_CREATE_EN
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
{
    void   *psp;
    INT8U   err;


    if (prio > OS_LOWEST_PRIO) {             /* ¿ì¼±¼øÀ§°¡ ÀûÀýÇÑ °ªÀÎÁö È®ÀÎ                          */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§¸¦ °®´Â ŽºÅ©°¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎ        */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* ŽºÅ©°¡ »ý¼ºµÇ±â Àü¿¡ ´Ù¸¥ ŽºÅ©°¡ °°Àº ÀÛ¾÷À»...    */
                                             /* ...½ÃµµÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ ¿ì¼±¼øÀ§¸¦ ¿¹¾àÇÑ´Ù     */
        OS_EXIT_CRITICAL();
        psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); /* ŽºÅ© ½ºÅà ÃʱâÈ­                       */
        err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);         
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                   /* ŽºÅ© °³¼ö Ä«¿îÅÍ Áõ°¡                  */
            OSTaskCreateHook(OSTCBPrioTbl[prio]);          /* »ç¿ëÀÚ Á¤ÀÇ Hook ÇÔ¼ö È£Ãâ               */
            OS_EXIT_CRITICAL();
            if (OSRunning) {                 /* ¸ÖƼŽºÅ· °¡µ¿ ÁßÀ̸é ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ŽºÅ© ½ÇÇà     */
                OSSched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* ÀÌ ¿ì¼±¼øÀ§¸¦ ´Ù½Ã »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿¹¾à ÇØÁ¦          */
            OS_EXIT_CRITICAL();
        }
        return (err);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                          ŽºÅ© »ý¼º(È®Àå ¹öÀü)
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â uC/OS-II°¡ ŽºÅ©ÀÇ ½ÇÇàÀ» °ü¸®ÇÒ ¶§ »ç¿ëÇÑ´Ù. ŽºÅ©´Â ¸ÖƼŽºÅ·À» ½ÃÀÛÇϱâ
*              Àü ¶Ç´Â ½ÇÇà µÚ ½ÇÇàÇϰí Àִ ŽºÅ©°¡ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ISRÀº ŽºÅ©¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù.
*              ÀÌ ÇÔ¼ö´Â ŽºÅ© »ý¼º½Ã Ãß°¡ Á¤º¸¸¦ ´õ ¾Ë·ÁÁà¾ß ÇÑ´Ù´Â Á¡À» Á¦¿ÜÇϸé OSTaskCreate()¿Í
*              ºñ½ÁÇÏ´Ù.
*
* Àü´ÞÀÎÀÚ   : task     ŽºÅ© ÄÚµåÀÇ ½ÃÀÛÁ¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ
*
*              pdata    ŽºÅ©°¡ óÀ½ ½ÇÇàµÉ ¶§ ŽºÅ© ³»¿¡¼­ »ç¿ëÇÏ´Â Àü´ÞÀÎÀÚ¸¦ °¡¸®Å°´Â ¼±ÅÃÀû Æ÷ÀÎÅÍ
*                       ŽºÅ©´Â ´ÙÀ½°ú °°ÀÌ Àü´ÞÀÎÀÚ 'pdata'¸¦ ³Ñ°Ü ¹ÞÀº °ÍÀ¸·Î »ý°¢ÇÑ´Ù
*
*
*                           void Task (void *pdata)
*                           {
*                               for (;;) {
*                                   Task code;
*                               }
*                           }
*
*              ptos     ŽºÅ© ½ºÅÃÀÇ ½ÃÀÛÀ§Ä¡¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ¼³Á¤ »ó¼ö OS_STK_GROWTH¸¦ 1·Î ¼³Á¤ÇÑ
*                       °æ¿ì, ¾Æ·¡ ¹æÇâ(¸Þ¸ð¸®ÀÇ »óÀ§ ¹øÁö¿¡¼­ ÇÏÀ§ ¹øÁö·Î)À¸·Î ½ºÅÃÀ» »ç¿ëÇÏ´Â °ÍÀ¸·Î
*                       °¡Á¤ÇÑ´Ù. ÀÌ °æ¿ì 'ptos'´Â ½ºÅÿµ¿ªÀÇ ÃÖ»óÀ§ ¹øÁö ¸Þ¸ð¸®¸¦ °¡¸®Å²´Ù.
*                       OS_STK_GROWTH¸¦ 0À¸·Î ¼³Á¤ÇÑ °æ¿ì 'ptos'´Â ½ºÅÿµ¿ªÀÇ ÃÖÇÏÀ§ ¹øÁö ¸Þ¸ð¸®¸¦
*                       °¡¸®Å°¸ç, ½ºÅÃÀ» »ç¿ëÇÔ¿¡ µû¶ó ¹øÁö´Â Áõ°¡ÇÑ´Ù.
*                       'ptos'´Â ½ÇÁ¦ ½ºÅÃÀ¸·Î ÇÒ´çÇÑ ¿µ¿ªÀ» °¡¸®ÄÑ¾ß ÇÑ´Ù.
*
*
*
*              prio     ŽºÅ© ¿ì¼±¼øÀ§. °¢ ŽºÅ©¿¡´Â °íÀ¯ÇÑ ¿ì¼±¼øÀ§¸¦ ¹èÁ¤ÇØ¾ß Çϸç, °ªÀÌ ÀÛÀ»¼ö·Ï
*                       ½ÇÁ¦ ¿ì¼±¼øÀ§´Â ³ô´Ù.
*
*              id       ŽºÅ© ID(0..65535)
*
*              pbos     ŽºÅ© ½ºÅÃÀÇ ÃÖÇÏÀ§ ¹øÁö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ¼³Á¤ »ó¼ö OS_STK_GROWTH¸¦ 1·Î ¼³Á¤ÇÑ
*                       °æ¿ì, ¾Æ·¡ ¹æÇâ(¸Þ¸ð¸®ÀÇ »óÀ§ ¹øÁö¿¡¼­ ÇÏÀ§ ¹øÁö·Î)À¸·Î ½ºÅÃÀ» »ç¿ëÇÏ´Â °ÍÀ¸·Î
*                       °¡Á¤ÇÑ´Ù. ÀÌ °æ¿ì 'pbos' ½ºÅÿµ¿ªÀÇ ÃÖÇÏÀ§ ¹øÁö ¸Þ¸ð¸®¸¦ °¡¸®Å²´Ù.
*                       OS_STK_GROWTH¸¦ 0À¸·Î ¼³Á¤ÇÑ °æ¿ì, 'pbos'´Â ½ºÅÿµ¿ªÀÇ ÃÖ»óÀ§ ¹øÁö ¸Þ¸ð¸®¸¦
*                       °¡¸®Å°¸ç ½ºÅÃÀ» »ç¿ëÇÔ¿¡ µû¶ó ¹øÁö´Â °¨¼ÒÇÑ´Ù.
*                       'pbos'´Â ½ÇÁ¦ ½ºÅÃÀ¸·Î ÇÒ´çÇÑ ¿µ¿ªÀ» °¡¸®ÄÑ¾ß ÇÑ´Ù.
*
*              stk_size ½ºÅà ũ±â¸¦ ½ºÅà ¿¤¸®¸ÕÆ®¼ö·Î ÁöÁ¤ÇÑ °ª. OS_STK¸¦ INT8U·Î Á¤ÀÇÇÑ °æ¿ì,
*                       'stk_size'´Â ½ºÅÃÀÇ ¹ÙÀÌÆ®¼ö¿Í °°´Ù. OS_STK¸¦ INT16U·Î Á¤ÀÇÇÑ °æ¿ì, 'stk_size'´Â
*                       16ºñÆ® ½ºÅà ¿¤¸®¸ÕÆ®¼ö¿Í °°´Ù. ³¡À¸·Î OS_STK¸¦ INT32U·Î Á¤ÀÇÇÑ °æ¿ì´Â 
*                       'stk_size'°¡ ½ºÅÿ¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â 32ºñÆ® ¿¤¸®¸ÕÆ®¼ö¸¦ ÀǹÌÇÑ´Ù.
*
*
*              pext     TCB È®Àå¿¡ »ç¿ëÇÒ »ç¿ëÀÚ Á¤ÀÇ ¸Þ¸ð¸®¸¦ °¡¸®Å°´ÂÆ÷ÀÎÅÍ.
*                       ¿¹¸¦ µé¾î, ¹®¸ÆÀüȯ½Ã ÀÌ ¸Þ¸ð¸® ¿µ¿ª¿¡ ¹®¸ÆÀüȯ ºÎµ¿¼Ò¼ö ¿¬»ê ·¹Áö½ºÅÍÀÇ ³»¿ë,
*                       ŽºÅ©°¡ ½ÇÇàÇÑ ½Ã°£, ÀÌ Å½ºÅ©·Î ¹®¸ÆÀüȯÀÌ ¹ß»ýÇÑ È¸¼ö µîÀ» ÀúÀåÇÒ ¼ö ÀÖ´Ù.
*
*
*              opt      ŽºÅ©ÀÇ µ¿ÀÛ¿¡ ´ëÇÑ Ãß°¡ Á¤º¸ ¶Ç´Â ¿É¼Ç»çÇ×. ÇÏÀ§ 8ºñÆ®´Â uC/OS-II°¡ 
*                       »ç¿ëÇϹǷΠÀÀ¿ëÇÁ·Î±×·¥Àº »óÀ§ 8ºñÆ®¸¦ ÀÌ¿ëÇØ¼­ Ãß°¡Á¤º¸¸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù.
*                       uCOS-II.H ÆÄÀÏÀÇ OS_TASK_OPT_??? »ó¼ö ÂüÁ¶.
*
* ¸®Åϰª     : OS_NO_ERR        ŽºÅ©¸¦ Á¤»óÀûÀ¸·Î »ý¼ºÇßÀ½
*              OS_PRIO_EXIT     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ÀÇŽºÅ©°¡ ÀÌ¹Ì Á¸ÀçÇÔ
*                               (°¢ ŽºÅ©¿¡´Â °íÀ¯ÇÑ ¿ì¼±¼øÀ§¸¦ ¹èÁ¤ÇØ¾ß ÇÑ´Ù)
*              OS_PRIO_INVALID  ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©´Ù
*
*********************************************************************************************************
*/
/*$PAGE*/
#if   OS_TASK_CREATE_EXT_EN    
INT8U OSTaskCreateExt (void   (*task)(void *pd), 
                       void    *pdata, 
                       OS_STK  *ptos, 
                       INT8U    prio,
                       INT16U   id,
                       OS_STK  *pbos,
                       INT32U   stk_size,
                       void    *pext,
                       INT16U   opt)
{
    void    *psp;
    INT8U    err;
    INT16U   i;
    OS_STK  *pfill;


    if (prio > OS_LOWEST_PRIO) {             /* ¿ì¼±¼øÀ§°¡ ÀûÀýÇÑ °ªÀÎÁö È®ÀÎ                          */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§¸¦ °®´Â ŽºÅ©°¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎ        */
        OSTCBPrioTbl[prio] = (OS_TCB *)1;    /* ŽºÅ©°¡ »ý¼ºµÇ±â Àü¿¡ ´Ù¸¥ ŽºÅ©°¡ °°Àº ÀÛ¾÷À»...    */
                                             /* ...½ÃµµÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ ¿ì¼±¼øÀ§¸¦ ¿¹¾àÇÑ´Ù     */
        OS_EXIT_CRITICAL();
        
        if (opt & OS_TASK_OPT_STK_CHK) {     /* ½ºÅà Á¡°Ë±â´É Ȱ¼ºÈ­ È®ÀÎ                              */
            if (opt & OS_TASK_OPT_STK_CLR) { /* ½ºÅÿµ¿ª Ŭ¸®¾î È®ÀÎ                                   */
                pfill = pbos;                /* ¿¹, ½ºÅÃÀ» 0À¸·Î ä¿î´Ù                                */
                for (i = 0; i < stk_size; i++) {
                    #if OS_STK_GROWTH == 1
                    *pfill++ = (OS_STK)0;
                    #else
                    *pfill-- = (OS_STK)0;
                    #endif
                }
            }
        }
        
        psp = (void *)OSTaskStkInit(task, pdata, ptos, opt); /* ŽºÅ© ½ºÅà ÃʱâÈ­                     */
        err = OSTCBInit(prio, psp, pbos, id, stk_size, pext, opt);         
        if (err == OS_NO_ERR) {
            OS_ENTER_CRITICAL();
            OSTaskCtr++;                                     /* ŽºÅ© °³¼ö Ä«¿îÅÍ Áõ°¡                */
            OSTaskCreateHook(OSTCBPrioTbl[prio]);            /* »ç¿ëÀÚ Á¤ÀÇ Hook ÇÔ¼ö È£Ãâ             */
            OS_EXIT_CRITICAL();
            if (OSRunning) {                 /* ¸ÖƼŽºÅ· °¡µ¿ ÁßÀ̸é ÃÖ»óÀ§ ¿ì¼±¼øÀ§ ŽºÅ© ½ÇÇà     */
                OSSched();
            }
        } else {
            OS_ENTER_CRITICAL();
            OSTCBPrioTbl[prio] = (OS_TCB *)0;/* ÀÌ ¿ì¼±¼øÀ§¸¦ ´Ù½Ã »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿¹¾à ÇØÁ¦          */
            OS_EXIT_CRITICAL();
        }
        return (err);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_PRIO_EXIST);
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                             ŽºÅ© »èÁ¦
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ŽºÅ©¸¦ »èÁ¦ÇÑ´Ù. È£Ãâ ŽºÅ©´Â ÀÚ½ÅÀÇ ¿ì¼±¼øÀ§¸¦ ³Ñ°ÜÁÖ¾î ÀÚ½ÅÀ» »èÁ¦ÇÒ ¼öµµ
*              ÀÖ´Ù. »èÁ¦ÇÑ Å½ºÅ©´Â ¼ö¸é»óÅ·Πµé¾î°¡°í, ³ªÁß¿¡ ŽºÅ© »ý¼ºÇÔ¼ö¸¦ È£ÃâÇØ¼­ Àç½ÇÇà ÇÒ ¼ö
*              ÀÖ´Ù.
*
* Àü´ÞÀÎÀÚ   : prio    »èÁ¦ÇϰíÀÚ Çϴ ŽºÅ©ÀÇ ¿ì¼±¼øÀ§. Âü°í·Î, 'prio'¸¦ OS_PRIO_SELF·Î ¼³Á¤Çϸé
*                      ¿ì¼±¼øÀ§¸¦ ¸ô¶óµµ ¸í½ÃÀûÀ¸·Î ÀÚ½ÅÀ» »èÁ¦ÇÒ ¼ö ÀÖ´Ù.
*
*
* ¸®Åϰª     : OS_NO_ERR           ¼º°øÀûÀ¸·Î ŽºÅ©¸¦ »èÁ¦ÇßÀ½
*              OS_TASK_DEL_IDLE    uC/OS-IIÀÇ idle ŽºÅ© »èÁ¦¸¦ ½ÃµµÇßÀ½
*              OS_PRIO_INVALID     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©°Å³ª
*                                  OS_PRIO_SELF·Î ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*              OS_TASK_DEL_ERR     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ÀÇ Å½ºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½
*              OS_TASK_DEL_ISR     ISR ³»¿¡¼­ ŽºÅ© »èÁ¦¸¦ ½ÃµµÇßÀ½
*
* ³ëÆ®       : 1) OSTaskDel() ÀÎÅÍ·´Æ® Áö¿¬½Ã°£À» ÁÙÀ̱â À§ÇØ ´ÙÀ½ ¹æ¹ýÀ¸·Î ŽºÅ©¸¦ ºñȰ¼ºÈ­ÇÑ´Ù.
*                    a) ½ÇÇà Áغñ»óŰ¡ ¾Æ´Ï°Ô ÇÑ´Ù
*                    b) ¸ðµç ´ë±â¸ñ·Ï¿¡¼­ ŽºÅ©¸¦ Á¦°ÅÇÑ´Ù
*                    c) OSTimeTick()ÀÌ Å½ºÅ©¸¦ ½ÇÇà Áغñ»óÅ·Π¸¸µéÁö ¸øÇϵµ·Ï ÇÑ´Ù
*                 ÀÌÁ¦ ´Ù¸¥ ¿©·¯ ±¸Á¶Ã¼¿¡¼­ ŽºÅ©ÀÇ ¿¬°á »óŸ¦ ²÷À» ¼ö ÀÖ´Ù.
*              2) OS_EXIT_CRITICAL()À» È£ÃâÇÑ Á÷ÈÄ OSDummy() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î¼¼¼­´Â
*                 ÀÎÅÍ·´Æ® Ȱ¼ºÈ­ ¸í·É ´ÙÀ½ ¸í·ÉÀ» ¹«½ÃÇϱ⠶§¹®ÀÌ´Ù.
*                 OSDummy()¸¦ NO OP¸¦ ¼öÇàÇÏ´Â ¸ÅÅ©·Î(OS_NOP())·Î ´ëÄ¡ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ ¸ÅÅ©·Î¸¦
*                 »ç¿ëÇϸé ÇÔ¼ö¸¦ È£ÃâÇØ¼­ ¸®ÅÏÇÏ´Â ½Ã°£À» Àý¾àÇÒ ¼ö ÀÖ´Ù.
*              3) ISRÀº ŽºÅ©¸¦ »èÁ¦ÇÒ ¼ö ¾ø´Ù.
*              4) ¾ÆÁÖ Àá±ñ Àá±Ý Ä«¿îÅ͸¦ Áõ°¡Çϴµ¥, ŽºÅ©¸¦ »èÁ¦ ÁßÀ̶ó¸é Áغñ ¸®½ºÆ®¿¡¼­ »èÁ¦Çß±â
*                 ¶§¹®¿¡ ½ÇÇàµÉ ¼ö ¾øÀ» °ÍÀÌ´Ù. Àá±Ý Ä«¿îÅ͸¦ Áõ°¡ÇÏ¸é ´Ù¸¥ ŽºÅ©·Î ¹®¸ÆÀüȯÀÌ ¹ß»ýÇÒ
*                 ¼ö ¾ø´Ù. ISR¿¡¼­ ´Ù¸¥ ŽºÅ©¸¦ Áغñ»óÅ·Π¸¸µé¾îµµ ÀÌ ÇÔ¼ö¸¦ ½ÇÇàÇϰí Àִ ŽºÅ©·Î
*                 µ¹¾Æ¿Â´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. µû¶ó¼­ ³ª¸ÓÁö »èÁ¦ÀÛ¾÷À» ¸¶Ä¥ ¼ö ÀÖ´Ù.
*
*********************************************************************************************************
*/
/*$PAGE*/
#if OS_TASK_DEL_EN
INT8U OSTaskDel (INT8U prio)
{
    OS_TCB   *ptcb;
    OS_EVENT *pevent;


    if (prio == OS_IDLE_PRIO) {                                 /* idle ŽºÅ©´Â »èÁ¦ÇÏ¸é ¾ÈµÈ´Ù       */
        return (OS_TASK_DEL_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?            */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (OSIntNesting > 0) {                                     /* ISR¿¡¼­ »èÁ¦¸¦ ½ÃµµÇÏ´ÂÁö È®ÀÎ      */
        OS_EXIT_CRITICAL();
        return (OS_TASK_DEL_ISR);
    }
    if (prio == OS_PRIO_SELF) {                                 /* ÀÚ½ÅÀ» »èÁ¦ÇÏ´ÂÁö È®ÀÎ              */
        prio = OSTCBCur->OSTCBPrio;                             /* »èÁ¦ ¿ì¼±¼øÀ§¸¦ ÇöÀç °ªÀ¸·Î ¼³Á¤    */
    }
    if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {           /* »èÁ¦ÇÏ·Á´Â ŽºÅ©°¡ Á¸ÀçÇϴ°¡      */
        if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {/* Áغñ»óŰ¡ ¾Æ´Ï°Ô ¸¸µç´Ù            */
            OSRdyGrp &= ~ptcb->OSTCBBitY;
        }
        if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) {  /* ŽºÅ©°¡ À̺¥Æ®¸¦ ±â´Ù¸®´Â°¡        */
            if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { /* ECB¿¡¼­ ŽºÅ©¸¦ ... */
                pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... Á¦°ÅÇÑ´Ù         */
            }
        }
        ptcb->OSTCBDly  = 0;                                    /* OSTimeTick() ÇÔ¼öÀÇ  °»½ÅÀ» ¸·´Â´Ù  */
        ptcb->OSTCBStat = OS_STAT_RDY;                          /* ŽºÅ© Àç½ÇÇàÀ» ¹æÁö                */
        OSLockNesting++;
        OS_EXIT_CRITICAL();                                     /* ±×µ¿¾È ÀÎÅÍ·´Æ® ¿äûÀÌ ÀÖ¾úÀ» ...   */
        OSDummy();                                              /* ... °æ¿ì¸¦ ´ëºñÇØ Àá±ñ Ȱ¼ºÈ­ ÇÑ´Ù  */
        OS_ENTER_CRITICAL();                                    /* ´õ¹Ì ÇÔ¼ö°¡ ISRÀ» ¼öÇàÅä·Ï ÇØÁØ´Ù   */
        OSLockNesting--;
        OSTaskDelHook(ptcb);                                    /* »ç¿ëÀÚ Á¤ÀÇ hook ÇÔ¼ö È£Ãâ          */
        OSTaskCtr--;                                            /* µî·ÏµÈ ŽºÅ©ÀÇ ¼ö¸¦ °¨¼ÒÇÑ´Ù       */
        OSTCBPrioTbl[prio] = (OS_TCB *)0;                       /* ¿¹Àü ¿ì¼±¼øÀ§ ¿£Æ®¸® Ŭ¸®¾î         */
        if (ptcb->OSTCBPrev == (OS_TCB *)0) {                   /* TCB ¸®½ºÆ®¿¡¼­ Á¦°Å                 */
            ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
            OSTCBList                  = ptcb->OSTCBNext;
        } else {
            ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
            ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
        }
        ptcb->OSTCBNext = OSTCBFreeList;                        /* »èÁ¦ÇÑ TCB¸¦ ÀÚÀ¯ TCB ¸®½ºÆ®·Î ¹Ýȯ */
        OSTCBFreeList   = ptcb;
        OS_EXIT_CRITICAL();
        OSSched();                                              /* »õ ¿ì¼±¼øÀ§ ŽºÅ©¸¦ ã´Â´Ù         */
        return (OS_NO_ERR);
    } else {
        OS_EXIT_CRITICAL();
        return (OS_TASK_DEL_ERR);
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                        ŽºÅ© ÀڽŠ»èÁ¦ ¿äû
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ´ÙÀ½ ÀÏÀ» ÇÑ´Ù.
*                   a) ÀÚ½ÅÀ» »èÁ¦Çϵµ·Ï ŽºÅ©¿¡°Ô ¾Ë¸°´Ù.
*                   b) ÇöÀç ŽºÅ© ÀÚ½ÅÀ» »èÁ¦Ç϶ó°í ¿äûÇß´ÂÁö È®ÀÎ.
*              ÀÌ ÇÔ¼ö´Â ÀÌÇØÇϱⰡ ¾à°£ ¾î·Æ´Ù. ¾î¶² ŽºÅ©¸¦ »èÁ¦ÇØ¾ß Çϴµ¥ ±× ŽºÅ©°¡ ¸Þ¸ð¸® ¹öÆÛ,
*              ¼¼¸¶Æ÷¾î, ¸ÞÀϹڽº, Å¥ µî ÀÚ¿øÀ» ¼ÒÀ¯ÇÑ »óŶó°í °¡Á¤ÇÏÀÚ. ÀÌ ÀÚ¿øµéÀ» ¹ÝȯÇϱâ Àü¿¡
*              ŽºÅ©¸¦ »èÁ¦ÇÏ¸é ¾ÈµÇ´Â °ÍÀº ºÐ¸íÇÑ »ç½ÇÀÌ´Ù. »èÁ¦¸¦ ¿äûÇϴ ŽºÅ©´Â OSTaskDelReq()¸¦
*              È£ÃâÇØ¼­ »èÁ¦¸¦ ¿äûÇÑ´Ù°í ¾Ë·ÁÁÙ »ÓÀÌ´Ù. ½ÇÁ¦ ³ª¸ÓÁö »èÁ¦ ÀÛ¾÷Àº ÀÌ ¿äûÀ» ¹ÞÀº ŽºÅ©·Î
*              ³Ñ°ÜÁø´Ù.
*              ¿¹¸¦ µé¾î, ŽºÅ© #10À» »èÁ¦ÇÒ Çʿ䰡 ÀÖ´Ù. »èÁ¦¸¦ ¿äûÇϴ ŽºÅ© #5´Â OSTaskDelReq(10)¸¦
*              È£ÃâÇÑ´Ù. ŽºÅ© #10ÀÌ ½ÇÇàµÇ¸é OS_PRIO_SELF¸¦ ¼³Á¤Çؼ­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ µÚ, ¸®ÅÏ °ªÀ» 
*              »ìÇÉ´Ù. ¸®ÅϰªÀÌ OS_TASK_DEL_REQ¸é ´Ù¸¥ ŽºÅ©°¡ ŽºÅ© »èÁ¦¸¦ ¿äûÇÑ °ÍÀÌ´Ù.
*              ŽºÅ© #10Àº ´ÙÀ½°ú °°Àº ÇüÅÂÀÏ °ÍÀÌ´Ù.
*
*
*                   void Task(void *data)
*                   {
*                       .
*                       .
*                       while (1) {
*                           OSTimeDly(1);
*                           if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ) {
*                               ¼ÒÀ¯ÇÑ ÀÚ¿øÀ» ¹ÝȯÇÑ´Ù;
*                               µ¿Àû ¸Þ¸ð¸® ÇÒ´ç ÇØÁ¦;
*                               OSTaskDel(OS_PRIO_SELF);
*                           }
*                       }
*                   }
*
* Àü´ÞÀÎÀÚ   : prio    »èÁ¦¿ä±¸¸¦ Çϱâ À§ÇÑ ¿ì¼±¼øÀ§
*
* ¸®Åϰª     : OS_NO_ERR          ÇØ´ç ¿ì¼±¼øÀ§ ŽºÅ©°¡ Á¸ÀçÇÏ¸ç »èÁ¦ ¿äûÀ» ¼º°øÀûÀ¸·Î µî·ÏÇßÀ½
*              OS_TASK_NOT_EXIST  ŽºÅ©°¡ ÀÌ¹Ì »èÁ¦µÆÀ½. È£ÃâÀÚ´Â ¿äûÀ» ¼öÇàÇß´ÂÁö ¾Ë ¼ö ÀÖ´Ù.
*
*              OS_TASK_DEL_IDLE   uC/OS-IIÀÇ idle ŽºÅ© »èÁ¦¸¦ ¿äûÇßÀ½
*              OS_PRIO_INVALID     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©°Å³ª
*                                  OS_PRIO_SELF·Î ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*              OS_TASK_DEL_REQ    ´Ù¸¥ ŽºÅ©°¡ ½ÇÇàÁßÀΠŽºÅ© »èÁ¦¸¦ ¿äûÇßÀ½
*
*********************************************************************************************************
*/
/*$PAGE*/
#if OS_TASK_DEL_EN
INT8U OSTaskDelReq (INT8U prio)
{
    BOOLEAN  stat;
    INT8U    err;
    OS_TCB  *ptcb;


    if (prio == OS_IDLE_PRIO) {                                 /* idle ŽºÅ©´Â »èÁ¦ÇÏ¸é ¾ÈµÈ´Ù       */
        return (OS_TASK_DEL_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?            */
        return (OS_PRIO_INVALID);
    }
    if (prio == OS_PRIO_SELF) {                                 /* ÀÌ Å½ºÅ©·Î ¿äûÇϴ ŽºÅ©°¡ ...   */
        OS_ENTER_CRITICAL();                                    /* ... ÀÚ½ÅÀ» »èÁ¦ÇÏ·Á´ÂÁö È®ÀÎ        */
        stat = OSTCBCur->OSTCBDelReq;                           /* »óŰªÀ» È£ÃâÀÚ·Î ¸®ÅÏÇÑ´Ù          */
        OS_EXIT_CRITICAL();
        return (stat);
    } else {
        OS_ENTER_CRITICAL();
        if ((ptcb = OSTCBPrioTbl[prio]) != (OS_TCB *)0) {       /* »èÁ¦ÇÏ·Á´Â ŽºÅ©°¡ Á¸ÀçÇϴ°¡      */
            ptcb->OSTCBDelReq = OS_TASK_DEL_REQ;                /* »èÁ¦¿äû ÇÁ·¡±×¸¦ ¼³Á¤ÇÑ´Ù          */
            err               = OS_NO_ERR;
        } else {
            err               = OS_TASK_NOT_EXIST;              /* ÀÌ¹Ì »èÁ¦µÆÀ½                       */
        }
        OS_EXIT_CRITICAL();
        return (err);
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                        ÀϽà Áß´Ü Å½ºÅ© Àç½ÇÇà
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ÀϽà Áß´ÜÇÑ Å½ºÅ©¸¦ Àç½ÇÇà½ÃŲ´Ù. ¸í½ÃÀûÀ¸·Î ÀϽà Áß´ÜÇÑ Å½ºÅ©¸¦ Àç½ÇÇàÇÒ
*              ¼ö ÀÖ´Â À¯ÀÏÇÑ ÇÔ¼ö´Ù.
*
* Àü´ÞÀÎÀÚ   : prio     Àç½ÇÇàÇϰíÀÚ Çϴ ŽºÅ© ¿ì¼±¼øÀ§
*
* ¸®Åϰª     : OS_NO_ERR                ÇØ´ç ¿ì¼±¼øÀ§ ŽºÅ©¸¦ ¼º°øÀûÀ¸·Î Àç½ÇÇà ÇßÀ½
*              OS_PRIO_INVALID          ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©´Ù
*
*              OS_TASK_RESUME_PRIO      Àç½ÇÇàÇÏ·Á´Â ŽºÅ©°¡ ¾øÀ½
*              OS_TASK_NOT_SUSPENDED    ŽºÅ©°¡ ÀϽà Áß´Ü»óŰ¡ ¾Æ´Ô
*********************************************************************************************************
*/

#if OS_TASK_SUSPEND_EN
INT8U OSTaskResume (INT8U prio)
{
    OS_TCB   *ptcb;


    if (prio >= OS_LOWEST_PRIO) {                               /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?            */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {           /* Àç°³ÇÏ·Á´Â ŽºÅ©°¡ Á¸ÀçÇϴ°¡?     */
        OS_EXIT_CRITICAL();
        return (OS_TASK_RESUME_PRIO);
    } else {
        if (ptcb->OSTCBStat & OS_STAT_SUSPEND) {                           /* ÀϽà Áß´Ü »óÅÂÀΰ¡?      */
            if (((ptcb->OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) &&  /* Áß´Ü »óÅÂ ÇØÁ¦           */
                 (ptcb->OSTCBDly  == 0)) {                                 /* Áö¿¬µÇ¸é ¾ÈµÊ            */
                OSRdyGrp               |= ptcb->OSTCBBitY;                 /* ½ÇÇàÁغñ »óÅ·Π¸¸µç´Ù   */
                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                OS_EXIT_CRITICAL();
                OSSched();
            } else {
                OS_EXIT_CRITICAL();
            }
            return (OS_NO_ERR);
        } else {
            OS_EXIT_CRITICAL();
            return (OS_TASK_NOT_SUSPENDED);
        }
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                               ½ºÅà Á¡°Ë
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ÁöÁ¤ÇÑ Å½ºÅ©ÀÇ ½ºÅà ¿µ¿ª¿¡ ¾ó¸¸Å­ÀÇ ºó ½ºÅðø°£ÀÌ ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.
*
*
* Àü´ÞÀÎÀÚ   : prio     ŽºÅ© ¿ì¼±¼øÀ§
*
*              pdata    OS_STK_DATA ŸÀÔÀÇ ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ.
*
* ¸®Åϰª     : OS_NO_ERR           È£Ãâ ¼º°ø
*              OS_PRIO_INVALID     ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©°Å³ª
*                                  OS_PRIO_SELF·Î ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*              OS_TASK_NOT_EXIST   ÁöÁ¤ÇÑ Å½ºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½
*              OS_TASK_OPT_ERR     ŽºÅ© »ý¼º½Ã OS_TASK_OPT_STK_CHK¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*********************************************************************************************************
*/
#if   OS_TASK_CREATE_EXT_EN
INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)
{
    OS_TCB  *ptcb;
    OS_STK  *pchk;
    INT32U   free;
    INT32U   size;


    pdata->OSFree = 0;                                          /* ½ÇÆÐ¸¦ °¡Á¤Çϰí, Å©±â¸¦ 0À¸·Î ¼³Á¤  */
    pdata->OSUsed = 0;
    if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {        /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?            */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (prio == OS_PRIO_SELF) {                        /* ÀÚ½ÅÀ» Á¡°ËÇϴ°¡?                           */
        prio = OSTCBCur->OSTCBPrio;
    }
    ptcb = OSTCBPrioTbl[prio];
    if (ptcb == (OS_TCB *)0) {                         /* ŽºÅ©°¡ Á¸ÀçÇϴ°¡?                         */
        OS_EXIT_CRITICAL();
        return (OS_TASK_NOT_EXIST);
    }
    if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) { /* ½ºÅà Á¡°Ë ¿É¼ÇÀ» ¼³Á¤Çß´ÂÁö È®ÀÎ             */
        OS_EXIT_CRITICAL();
        return (OS_TASK_OPT_ERR);
    }
    free = 0;
    size = ptcb->OSTCBStkSize;
    pchk = ptcb->OSTCBStkBottom;
    OS_EXIT_CRITICAL();
#if OS_STK_GROWTH == 1
    while (*pchk++ == 0) {                            /* ½ºÅÿ¡¼­ 0 °ªÀ» °®´Â Ç׸ñÀ» °è»ê              */
        free++;
    }
#else
    while (*pchk-- == 0) {
        free++;
    }
#endif
    pdata->OSFree = free * sizeof(OS_STK);            /* »ç¿ëÇÏÁö ¾ÊÀº ½ºÅÃÀ» ¹ÙÀÌÆ® ´ÜÀ§·Î °è»ê       */
    pdata->OSUsed = (size - free) * sizeof(OS_STK);   /* »ç¿ëÇÑ ½ºÅÃÀ» ¹ÙÀÌÆ® ´ÜÀ§·Î °è»ê              */
    return (OS_NO_ERR);
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                            ŽºÅ© ÀϽà Áß´Ü
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ŽºÅ©¸¦ ÀϽà Áß´ÜÇÑ´Ù. È£Ãâ ŽºÅ©ÀÇ ¿ì¼±¼øÀ§³ª OS_PRIO_SELF¸¦ °¡Áö°í ÀÌ ÇÔ¼ö¸¦
*              È£ÃâÇÑ °æ¿ì Áß´Ü ´ë»ó ŽºÅ©´Â ÀÚ±â ÀÚ½ÅÀÌ´Ù.
*
* Àü´ÞÀÎÀÚ   : prio     Áß´ÜÇÏ·Á´Â ŽºÅ©ÀÇ ¿ì¼±¼øÀ§. OS_PRIO_SELF¸¦ ÁöÁ¤Çϸé ÀÚ½ÅÀ» Áß´ÜÇϰí
*                       ½ºÄÉÁÙ·¯°¡ µ¿ÀÛÇÑ´Ù.
*
* ¸®Åϰª     : OS_NO_ERR                ŽºÅ©¸¦ ¼º°øÀûÀ¸·Î Áß´ÜÇßÀ½
*              OS_TASK_SUSPEND_IDLE     idle ŽºÅ© Áß´ÜÀ» ½ÃµµÇßÀ½
*              OS_PRIO_INVALID          ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©°Å³ª
*                                       OS_PRIO_SELF·Î ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*              OS_TASK_SUSPEND_PRIO     ´ë»ó ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½
*
* ³ëÆ®       : ÀÌ ÇÔ¼ö´Â ¾ÆÁÖ Á¶½ÉÇØ¼­ »ç¿ëÇØ¾ß ÇÑ´Ù. À̺¥Æ®(¸Þ½ÃÁö, ¼¼¸¶Æ÷¾î, Å¥ µî)¸¦ ´ë±âÁßÀÎ 
*              ŽºÅ©¿¡ ´ëÇØ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϸé À̺¥Æ®°¡ ¹ß»ýÇßÀ» °æ¿ì ó¸®ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù.
*
*********************************************************************************************************
*/

#if OS_TASK_SUSPEND_EN
INT8U OSTaskSuspend (INT8U prio)
{
    BOOLEAN   self;
    OS_TCB   *ptcb;


    if (prio == OS_IDLE_PRIO) {                                 /* idle ŽºÅ©´Â Áß´ÜÇÏ¸é ¾ÈµÈ´Ù       */
        return (OS_TASK_SUSPEND_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?            */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (prio == OS_PRIO_SELF) {                                 /* ÀÚ½ÅÀ» Áß´ÜÇϴ°¡?                  */
        prio = OSTCBCur->OSTCBPrio;
        self = TRUE;
    } else if (prio == OSTCBCur->OSTCBPrio) {                   /* ÀÚ½ÅÀ» Áß´ÜÇϴ°¡?                  */
        self = TRUE;
    } else {
        self = FALSE;                                           /* ¾Æ´Ï¿À ´Ù¸¥ ŽºÅ©¸¦ Áß´ÜÇÔ         */
    }
    if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {                /* ŽºÅ©°¡ Á¸ÀçÇϴ°¡            */
        OS_EXIT_CRITICAL();
        return (OS_TASK_SUSPEND_PRIO);
    } else {
        if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {     /* Áغñ»óŰ¡ ¾Æ´Ï°Ô ¸¸µç´Ù       */
            OSRdyGrp &= ~ptcb->OSTCBBitY;
        }
        ptcb->OSTCBStat |= OS_STAT_SUSPEND;                          /* ŽºÅ© »óŸ¦ Áß´Ü »óÅ·ΠÇÔ   */
        OS_EXIT_CRITICAL();
        if (self == TRUE) {                                          /* ÀÚ½ÅÀÏ °æ¿ì ¹®¸ÆÀüȯ ¹ß»ý½ÃÅ´  */
            OSSched();
        }
        return (OS_NO_ERR);
    }
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
*                                          ŽºÅ© »óÅ ¾ò±â
*
* ¼³¸í       : ÀÌ ÇÔ¼ö´Â ÇØ´ç ŽºÅ©ÀÇ TCB »çº»À» ¾ò¾î¿Â´Ù.
*
* Àü´ÞÀÎÀÚ   : prio     »óŸ¦ ¾ò°íÀÚ Çϴ ŽºÅ©ÀÇ ¿ì¼±¼øÀ§.  
*
* ¸®Åϰª     : OS_NO_ERR       È£Ãâ ¼º°ø
*              OS_PRIO_INVALID ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©°Å³ª
*                              OS_PRIO_SELF·Î ÁöÁ¤ÇÏÁö ¾Ê¾ÒÀ½
*              OS_PRIO_ERR     ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½
*********************************************************************************************************
*/

INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata)
{
    OS_TCB *ptcb;


    if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {   /* ¿ì¼±¼øÀ§°¡ Çã¿ë¹üÀ§Àΰ¡?                 */
        return (OS_PRIO_INVALID);
    }
    OS_ENTER_CRITICAL();
    if (prio == OS_PRIO_SELF) {                            /* ÀÚ½ÅÀ» ÁöÁ¤Çߴ°¡?                       */
        prio = OSTCBCur->OSTCBPrio;
    }
    if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {      /* ŽºÅ©°¡ Á¸ÀçÇϴ°¡?                     */
        OS_EXIT_CRITICAL();
        return (OS_PRIO_ERR);
    }
    *pdata = *ptcb;                                        /* »ç¿ëÀÚ ÀúÀå ¿µ¿ª¿¡ TCB¸¦ º¹»çÇÑ´Ù        */
    OS_EXIT_CRITICAL();
    return (OS_NO_ERR);
}