/* ********************************************************************************************************* * uC/OS-II * The Real-Time Kernel * TIME MANAGEMENT * * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL * All Rights Reserved * * V2.00 * * File : OS_TIME.C * By : Jean J. Labrosse ********************************************************************************************************* */ #ifndef OS_MASTER_FILE #include "includes.h" #endif /* ********************************************************************************************************* * 'n'ƽ µ¿¾È ŽºÅ© Áö¿¬ (n : 0¿¡¼ 65535 »çÀÌ) * * ¼³¸í : ÀÌ ÇÔ¼ö´Â ÁöÁ¤ÇÑ ½Ã½ºÅÛ Æ½ ¸¸ÅÀÇ ½Ã°£ÀÌ Èê·¯ ŸÀӾƿôÀÌ ¸¸·áµÉ ¶§±îÁö ÇöÀç ½ÇÇà ÁßÀÎ * ŽºÅ©¸¦ Áö¿¬½ÃŲ´Ù. ¹°·Ð À̰ÍÀº ÇöÀçÀÇ Å½ºÅ©°¡ ÀÏÁ¤ÇÑ ½Ã°£ÀÌ ¸¸·áÇÒ ¶§±îÁö Áö¿¬ÇÏ´Â * °Í°ú °°Àº µ¿ÀÛÀÌ´Ù. Áö¿¬ °ªÀ» 0À¸·Î ÁöÁ¤ÇÑ °æ¿ì ½Ã°£Áö¿¬Àº ÀϾÁö ¾Ê´Â´Ù. * 0 ÀÌ¿ÜÀÇ °ªÀ» ÁöÁ¤ÇÏ¸é ¹®¸ÆÀüȯÀÌ ¹ß»ýÇÑ´Ù. * * Àü´ÞÀÎÀÚ : ticks ŽºÅ©°¡ Áö¿¬ÇϰíÀÚ Çϴ Ŭ·° ƽ ´ÜÀ§ÀÇ ½Ã°£ Áö¿¬ °ª. * ÀÌ °ªÀ» 0À¸·Î ÁöÁ¤Çϸé ŽºÅ©´Â Áö¿¬µÇÁö ¾Ê´Â´Ù. * * ¸®Åϰª : ¾øÀ½ ********************************************************************************************************* */ void OSTimeDly (INT16U ticks) { if (ticks > 0) { /* 0Àº Áö¿¬ÀÌ ¾øÀ½À» ÀǹÌ! */ OS_ENTER_CRITICAL(); if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* ÇöÀç ŽºÅ© Áö¿¬ */ OSRdyGrp &= ~OSTCBCur->OSTCBBitY; } OSTCBCur->OSTCBDly = ticks; /* TCB ƽ °ªÀ» ¼³Á¤ÇÑ´Ù */ OS_EXIT_CRITICAL(); OSSched(); /* ´ÙÀ½ ½ÇÇàÇÒ Å½ºÅ© °áÁ¤! */ } } /*$PAGE*/ /* ********************************************************************************************************* * ÁöÁ¤ÇÑ ½Ã°£ µ¿¾È ŽºÅ© Áö¿¬ * * ¼³¸í : ÀÌ ÇÔ¼ö´Â ÇöÀç ½ÇÇàµÇ°í Àִ ŽºÅ©ÀÇ ½ÇÇàÀ» ÀÏÁ¤ ½Ã°£ÀÌ ¸¸·áµÉ ¶§±îÁö Áö¿¬ÇϰíÀÚ * È£ÃâµÈ´Ù. ÀÌ ÇÔ¼ö´Â Ŭ·° ƽ °³¼ö ´ë½Å ½Ã°£, ºÐ, ÃÊ , ¹Ð¸® ÃÊ ´ÜÀ§·Î ½Ã°£À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. * * * Àü´ÞÀÎÀÚ : hours Áö¿¬ÇϰíÀÚ ÇÏ´Â ½Ã°£. 0ºÎÅÍ 255 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. * minutes Áö¿¬ÇϰíÀÚ ÇÏ´Â ºÐ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 59 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. * seconds Áö¿¬ÇϰíÀÚ ÇÏ´Â ÃÊ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 59 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. * milli Áö¿¬ÇϰíÀÚ ÇÏ´Â ¹Ð¸® ÃÊ ´ÜÀ§ ½Ã°£. 0ºÎÅÍ 999 »çÀÌÀÇ °ªÀ» °¡Áú ¼ö ÀÖ´Ù. * * ¸®Åϰª : OS_NO_ERR * OS_TIME_INVALID_MINUTES * OS_TIME_INVALID_SECONDS * OS_TIME_INVALID_MS * OS_TIME_ZERO_DLY * * ³ëÆ® : ¹Ð¸® ÃÊ ´ÜÀ§ÀÇ ½Ã°£Áö¿¬Àº ƽ ÁÖ±â¿Í °ü°è ÀÖ´Ù. ¿¹¸¦ µé¾î ƽ Çڵ鷯°¡ 100mS¸¶´Ù µ¿ÀÛ * ÇÏ´Â °æ¿ì 10mSÀÇ ½Ã°£Áö¿¬Àº ÀÌ·ïÁú ¼ö ¾ø´Ù. ÀÌ °æ¿ì Áö¿¬ °ªÀº 0ÀÇ Æ½ °ªÀ¸·Î °è»êµÈ´Ù. * ½ÇÁ¦ Áö¿¬ °ªÀº °¡Àå °¡±î¿î ƽ °ªÀ¸·Î °è»êµÈ´Ù. ********************************************************************************************************* */ INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli) { INT32U ticks; INT16U loops; if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) { if (minutes > 59) { return (OS_TIME_INVALID_MINUTES); /* Àü´ÞÀÎÀÚ°¡ ÀûÁ¤ÇÑ ¹üÀ§ ³»¿¡ ÀÖ´ÂÁö È®ÀÎ */ } if (seconds > 59) { return (OS_TIME_INVALID_SECONDS); } if (milli > 999) { return (OS_TIME_INVALID_MILLI); } /* Àü´ÞÀÎÀÚ¸¦ °¡Àå ±ÙÁ¢ÇÑ Æ½ °ªÀ¸·Î °è»êÇÑ´Ù ... */ /* ... (±ÙÁ¢ÇÑ Æ½ °ªÀ¸·Î ¹Ý¿Ã¸² ÇÑ´Ù) */ ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC + OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L; loops = ticks / 65536L; /* °è»êÇÑ Æ½ °ªÀÌ 65536À» ³ÑÀ» °æ¿ì¸¦ ´ëºñÇÑ´Ù */ ticks = ticks % 65536L; /* 65536À¸·Î ³ª´« ³ª¸ÓÁö °ªÀ» °è»ê */ OSTimeDly(ticks); while (loops > 0) { OSTimeDly(32768); OSTimeDly(32768); loops--; } return (OS_NO_ERR); } else { return (OS_TIME_ZERO_DLY); } } /*$PAGE*/ /* ********************************************************************************************************* * Áö¿¬µÈ ŽºÅ© Àç½ÇÇà * * ¼³¸í : ÀÌ ÇÔ¼ö´Â OSTimeDly()³ª OSTimeDlyHMSM()¸¦ È£ÃâÇØ¼ Áö¿¬½ÃŲ Å½ºÅ©¸¦ Àç½ÇÇàÇÑ´Ù. * ŸÀӾƿôÀ» °É¾î¼ À̺¥Æ® ¹ß»ýÀ» ±â´Ù¸®´Â ŽºÅ©¸¦ Àç½ÇÇàÇϱâ À§ÇØ ÀÌÇÔ¼ö¸¦ »ç¿ëÇϸé * ¾ÈµÈ´Ù´Â Á¡À» À¯ÀÇÇ϶ó. ±×·¸°Ô ÇÒ °æ¿ì À̺¥Æ®¸¦ ±â´Ù¸®´Â ŽºÅ©´Â ŸÀӾƿôÀÌ ¹ß»ýÇÑ * °ÍÀ¸·Î »ý°¢ÇÒ °ÍÀÌ´Ù(ÀÌ·± È¿°ú¸¦ ÀǵµÇÑ °æ¿ì´Â »ó°ü ¾ø´Ù). ¶Ç 65536 ÀÌ»óÀÇ Æ½ °ª¿¡ * ÇØ´çÇÏ´Â ½Ã°£À» ÁöÁ¤Çؼ OSTimeDlyHMSM()À» È£ÃâÇÑ Å½ºÅ©¸¦ Àç½ÇÇàÇϱâ À§ÇØ ÀÌ ÇÔ¼ö¸¦ * È£ÃâÇÏ¸é ¾ÈµÈ´Ù. Áï, 100Hz·Î Ŭ·° ƽÀÌ ¹ß»ýÇÏ´Â °æ¿ì, OSTimeDlyHMSM(0, 10, 55, 350)³ª * ±× ÀÌ»óÀÇ ½Ã°£À» Áö¿¬Çϴ ŽºÅ©¸¦ Àç°³ÇÏ¸é ¾ÈµÈ´Ù´Â ¸»ÀÌ´Ù. * * (10 Minutes * 60 + 55 Seconds + 0.35) * 100 ticks/second. * * Àü´ÞÀÎÀÚ : prio Àç°³ÇÒ Å½ºÅ©ÀÇ ¿ì¼±¼øÀ§ * * ¸®Åϰª : OS_NO_ERR ŽºÅ©¸¦ Àç°³ÇßÀ½ * OS_PRIO_INVALID ÁöÁ¤ÇÑ ¿ì¼±¼øÀ§ °ªÀÌ ÃÖ´ë°ª(OS_LOWEST_PRIO)º¸´Ù Å©´Ù * * OS_TIME_NOT_DLY ŽºÅ©°¡ Áö¿¬ »óŰ¡ ¾Æ´Ô * OS_TASK_NOT_EXIST ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½ ********************************************************************************************************* */ INT8U OSTimeDlyResume (INT8U prio) { OS_TCB *ptcb; if (prio >= OS_LOWEST_PRIO) { return (OS_PRIO_INVALID); } OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTbl[prio]; /* ŽºÅ©°¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎ */ if (ptcb != (OS_TCB *)0) { if (ptcb->OSTCBDly != 0) { /* Áö¿¬ÁßÀÎÁö È®ÀÎ */ ptcb->OSTCBDly = 0; /* Áö¿¬ Ä«¿îÆ® °ªÀ» Áö¿ò */ if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) { /* ÀϽà Áß´Ü »óŰ¡ ¾Æ´ÑÁö È®ÀÎ */ 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_TIME_NOT_DLY); /* ŽºÅ©°¡ Áö¿¬»óŰ¡ ¾Æ´ÔÀ» ¾Ë¸² */ } } else { OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST); /* ŽºÅ©°¡ Á¸ÀçÇÏÁö ¾ÊÀ½ */ } } /*$PAGE*/ /* ********************************************************************************************************* * ÇöÀç ½Ã½ºÅÛ ½Ã°£ È®ÀÎ * * ¼³¸í : ÀÌ ÇÔ¼ö´Â Áö¼ÓÀûÀ¸·Î Ŭ·° ƽÀ» °»½ÅÇÏ´Â 32ºñÆ® ½Ã½ºÅÛ Å¸ÀÓ¿ë º¯¼öÀÇ °ªÀ» µ¹·ÁÁØ´Ù. * * * Àü´ÞÀÎÀÚ : ¾øÀ½ * * ¸®Åϰª : OSTimeÀÇ ÇöÀç °ª ********************************************************************************************************* */ INT32U OSTimeGet (void) { INT32U ticks; OS_ENTER_CRITICAL(); ticks = OSTime; OS_EXIT_CRITICAL(); return (ticks); } /* ********************************************************************************************************* * ½Ã½ºÅÛ Å¬·° ¼³Á¤ * * ¼³¸í : ÀÌ ÇÔ¼ö´Â Áö¼ÓÀûÀ¸·Î ½Ã½ºÅÛ Å¬·° ƽÀ» °»½ÅÇÏ´Â 32ºñÆ® Ä«¿îÅÍ °ªÀ» ¼³Á¤ÇÑ´Ù * * Àü´ÞÀÎÀÚ : ticks OSTime¿¡ ¼³Á¤ÇϰíÀÚ ÇÏ´Â °ª * * ¸®Åϰª : ¾øÀ½ ********************************************************************************************************* */ void OSTimeSet (INT32U ticks) { OS_ENTER_CRITICAL(); OSTime = ticks; OS_EXIT_CRITICAL(); }