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