/* ********************************************************************************************************* * 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); }