ã»ããã©ã«ã€ããŠã¯ã以åã®èšäºïŒïŒ5ïŒã§èšåãããŠããŸãã äž»ãªã¿ã¹ã¯ã¯ããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããããšã§ãã
ã·ãªãŒãºã®ä»¥åã®èšäºïŒ
èšäºïŒ18ã ã€ãã³ããã©ã°ã°ã«ãŒãïŒãã«ããŒãµãŒãã¹ãšããŒã¿æ§é
èšäºïŒ17ã ã€ãã³ããã©ã°ã°ã«ãŒãïŒçŽ¹ä»ãšåºæ¬ãµãŒãã¹
èšäºïŒ16ã ä¿¡å·
èšäºïŒ15ã ã¡ã¢ãªããŒãã£ã·ã§ã³ïŒãµãŒãã¹ãšããŒã¿æ§é
èšäºïŒ14ã ã¡ã¢ãªã®ã»ã¯ã·ã§ã³ïŒçŽ¹ä»ãšåºæ¬ãµãŒãã¹
èšäºïŒ13ã ã¿ã¹ã¯ããŒã¿æ§é ãšãµããŒããããŠããªãAPIåŒã³åºã
èšäºïŒ12ã ã¿ã¹ã¯ãæäœããããã®ãµãŒãã¹
èšäºïŒ11ã ã¿ã¹ã¯ïŒAPIã®æ§æãšçŽ¹ä»
èšäºïŒ10ã ã¹ã±ãžã¥ãŒã©ïŒé«åºŠãªæ©èœãšã³ã³ããã¹ãã®ä¿å
èšäºïŒ9ã ã¹ã±ãžã¥ãŒã©ïŒå®è£
èšäºïŒ8ã Nucleus SEïŒå éšèšèšãšå±é
èšäºïŒ7ã Nucleus SEïŒã¯ããã«
èšäºïŒ6ã ãã®ä»ã®RTOSãµãŒãã¹
èšäº5ã ã¿ã¹ã¯ã®çžäºäœçšãšåæ
èšäº4ã ã¿ã¹ã¯ãã³ã³ããã¹ãã®åãæ¿ããããã³å²ã蟌ã¿
èšäºïŒ3ã ã¿ã¹ã¯ãšèšç»
èšäºïŒ2ã RTOSïŒæ§é ãšãªã¢ã«ã¿ã€ã
èšäºïŒ1ã RTOSïŒã¯ããã«ã
ã»ããã©ã®äœ¿çš
Nucleus SEã§ã¯ãã»ããã©ã¯ã¢ã»ã³ããªæ®µéã§å®çŸ©ãããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯æ倧16åã®ã»ããã©ãå«ããããšãã§ããŸãã ã»ããã©ãæå®ãããŠããªãå ŽåããµãŒãã¹åŒã³åºããšããŒã¿æ§é ã®ã³ãŒãã¯ã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŸããã
ã»ããã©ã¯U8åã®ã«ãŠã³ã¿ã§ãããè€æ°ã®ã¿ã¹ã¯ã䜿çšã§ããããã«ã¢ã¯ã»ã¹ãå¶åŸ¡ãããŸãã ã¿ã¹ã¯ã¯ãã»ããã©ã«ãŠã³ã¿ã®å€ãæžããïŒãã£ããã£ïŒããå¢ããïŒãªãªãŒã¹ïŒããšãã§ããŸãã å€ããŒãã®ã»ããã©ããã£ããã£ããããšãããšãéžæããAPIåŒã³åºããã©ã¡ãŒã¿ãšNucleus SEã®èšå®ã«ãã£ãŠã¯ããšã©ãŒãŸãã¯ã¿ã¹ã¯ã®äžæåæ¢ãçºçããå ŽåããããŸãã
ã»ããã©ã®ã»ããã¢ãã
ã»ããã©ã®æ°
ã»ãšãã©ã®Nucleus SEãªããžã§ã¯ããšåæ§ã«ãã»ããã©ã®èšå®ã¯nuse_config.hã® #defineãã£ã¬ã¯ãã£ãã«ãã£ãŠæ±ºå®ãããŸã ã äž»ãªãã©ã¡ãŒã¿ãŒã¯NUSE_SEMAPHORE_NUMBERã§ãã¢ããªã±ãŒã·ã§ã³å ã®ã»ããã©ã®æ°ã決å®ããŸãã ããã©ã«ãã§ã¯ããã©ã¡ãŒã¿ãŒã¯0ã«èšå®ããïŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ã»ããã©ã¯äœ¿çšãããŸããïŒãæ倧16ã®å€ããšãããšãã§ããŸããäžæ£ãªå€ã¯ã³ã³ãã€ã«ãšã©ãŒã«ã€ãªãããŸãããã®ã¢ãžã¥ãŒã«ãšãšãã«ïŒããã®çµæã #errorãã£ã¬ã¯ãã£ããèµ·åããŸãã
ãŒã以å€ã®å€ãéžæãããšãã»ããã©ã®äž»èŠãªã¢ã¯ãã£ããŒã¿ãšããŠæ©èœããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯ãããŒã¿æ§é ãå®çŸ©ãããšãã«äœ¿çšããããã®ãµã€ãºã¯ãã®å€ã«äŸåããŸãïŒè©³çŽ°ã«ã€ããŠã¯ããã®èšäºã®è©³çŽ°ãåç §ããŠãã ããïŒã ããã«ããŒã以å€ã®å€ã¯APIèšå®ãã¢ã¯ãã£ãã«ããŸãã
APIåŒã³åºããã¢ã¯ãã£ãã«ãã
Nucleus SEã®åAPIé¢æ°ïŒãŠãŒãã£ãªãã£åŒã³åºãïŒã¯ã nuse_config.hã® #defineãã£ã¬ã¯ãã£ãã«ãã£ãŠã¢ã¯ãã£ãã«ãããŸã ã ã»ããã©ã®å Žåã次ã®ãã®ãå«ãŸããŸãã
NUSE_SEMAPHORE_OBTAIN
NUSE_SEMAPHORE_RELEASE
NUSE_SEMAPHORE_RESET
NUSE_SEMAPHORE_INFORMATION
NUSE_SEMAPHORE_COUNT
ããã©ã«ãã§ã¯ããããã¯FALSEã«èšå®ãããŠãããããåãµãŒãã¹åŒã³åºããç¡å¹ã«ããããããå®è£ ããã³ãŒãã®çµã¿èŸŒã¿ããããã¯ããŸãã ã»ããã©ãèšå®ããã«ã¯ãå¿ èŠãªAPIåŒã³åºããéžæãã察å¿ãããã£ã¬ã¯ãã£ããTRUEã«èšå®ããå¿ èŠããããŸãã
以äžã¯ãããã©ã«ãã®nuse_config.hãã¡ã€ã«ããã®æç²ã§ãã
#define NUSE_SEMAPHORE_NUMBER 0 /* Number of semaphores in the system - 0-16 */ #define NUSE_SEMAPHORE_OBTAIN FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_RELEASE FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_RESET FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_INFORMATION FALSE /* Service call enabler */ #define NUSE_SEMAPHORE_COUNT FALSE /* Service call enabler */
ã¢ããªã±ãŒã·ã§ã³ã«ã»ããã©ããªãå Žåã«ã¢ã¯ãã£ãåãããAPIé¢æ°ã¯ãã³ã³ãã€ã«ãšã©ãŒã«ãªããŸãïŒåžžã«æå¹ã«ãªã£ãŠããNUSE_Semaphore_CountïŒïŒãé€ãïŒã ã¢ã¯ãã£ãåãããŠããªãAPIåŒã³åºããã³ãŒãã䜿çšããå Žåãå®è£ ã³ãŒããã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŠããªãã£ããããã¬ã€ã¢ãŠããšã©ãŒãçºçããŸãã
ãŠãŒãã£ãªãã£ã»ããã©åŒã³åºã
Nucleus RTOSã¯ã次ã®æ©èœãæäŸãã8ã€ã®ãµãŒãã¹ã³ãŒã«ããµããŒãããŠããŸãã
- ã»ããã©ã®ãã£ããã£ã Nucleus SEã¯NUSE_Semaphore_ObtainïŒïŒé¢æ°ã«å®è£ ãããŠããŸãã
- ã»ããã©ã解æŸããŸãã Nucleus SEã¯NUSE_Semaphore_ReleaseïŒïŒé¢æ°ã§å®è£ ãããŸãã
- ã»ããã©ããã¹ãŠã®äžæåæ¢ãããã¿ã¹ã¯ã®ãªãªãŒã¹ã§æªäœ¿çšç¶æ ã«æ»ãïŒãªããŒãïŒã Nucleus SEã§ã¯ã NUSE_Semaphore_ResetïŒïŒã§å®è£ ãããŠããŸãã
- ç¹å®ã®ã»ããã©ã«é¢ããæ å ±ãæäŸããŸãã Nucleus SEã§ã¯ã NUSE_Semaphore_InformationïŒïŒã§å®è£ ãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã§æ§æãããŠããã»ããã©ã®æ°ãè¿ããŸãã Nucleus SEã§ã¯ã NUSE_Semaphore_CountïŒïŒã§å®è£ ãããŠããŸãã
- æ°ããã»ããã©ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŸãã Nucleus SEã¯å®è£ ãããŠããŸããã
- ã¢ããªã±ãŒã·ã§ã³ããã»ããã©ãåé€ããŸãã Nucleus SEã¯å®è£ ãããŠããŸããã
- ãã¹ãŠã®ã»ããã©ãžã®ãã€ã³ã¿ãè¿ããŸãã Nucleus SEã¯å®è£ ãããŠããŸããã
åãµãŒãã¹ã³ãŒã«ã®å®è£ ã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
ã»ããã©ããã£ããã£ããã³ãªãªãŒã¹ãããŠãŒãã£ãªãã£åŒã³åºã
ã»ããã©ã§å®è¡ã§ããåºæ¬çãªæäœã¯ããã£ããã£ãšãªãªãŒã¹ïŒå€ã®å¢æžïŒã§ãã Nucleus RTOSããã³Nucleus SEã¯ããããã®æäœã«å¯ŸããŠ2ã€ã®åºæ¬çãªAPIåŒã³åºããæäŸããŸãã
ã»ããã©ã®ãã£ããã£
ã»ããã©ããã£ããã£ããããã®Nucleus RTOSãŠãŒãã£ãªãã£åŒã³åºãã¯éåžžã«æè»ã§ãçŸåšå€ããŒãã®ã»ããã©ããã£ããã£ããããšããå Žåãªã©ãæäœãçŸæç¹ã§å®è¡ã§ããªãå Žåãæé»çãŸãã¯ç¹å®ã®ã¿ã€ã ã¢ãŠãã§ã¿ã¹ã¯ãäžæåæ¢ã§ããŸãã Nucleus SEã¯åãæ©èœãæäŸããŸããã¿ã¹ã¯ã®äžæåæ¢ã®ã¿ããªãã·ã§ã³ã§ãããã¿ã€ã ã¢ãŠãã¯å®è£ ãããŠããŸããã
Nucleus RTOSã§ã»ããã©ããã£ããã£ããããã®èª²é¡
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NU_Obtain_SemaphoreïŒNU_SEMAPHORE *ã»ããã©ãUNSIGNEDãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
ã»ããã© -ãŠãŒã¶ãŒãæäŸããã»ããã©å¶åŸ¡ãããã¯ãžã®ãã€ã³ã¿ã
suspend-ã¿ã¹ã¯ã®äžæåæ¢ãã©ã¡ãŒã¿ãå€NU_NO_SUSPENDãŸãã¯NU_SUSPENDãšã¿ã€ã ã¢ãŠãå€ãåãããšãã§ããŸãã
æ»ãå€ïŒ
NU_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NU_UNAVAILABLE-ã»ããã©ã«ãã«å€ããããŸããã
NU_INVALID_SEMAPHORE-ã»ããã©ãžã®ç¡å¹ãªãã€ã³ã¿ã
NU_INVALID_SUSPEND-éã¿ã¹ã¯é¢é£ã¹ã¬ããããäžæåæ¢ãè©Šã¿ãŸãã
NU_SEMAPHORE_WAS_RESET-ã¿ã¹ã¯ã®äžæäžã«ã»ããã©ããªã»ãããããŸããã
Nucleus SEã§ã»ããã©ããã£ããã£ããããã®èª²é¡
ãã®APIã³ãŒã«ã¯ãNucleus RTOS APIã®ã³ã¢æ©èœããµããŒãããŠããŸãã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NUSE_Semaphore_ObtainïŒNUSE_SEMAPHOREã»ããã©ãU8ãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
semaphore-䜿çšãããŠããã»ããã©ã®ã€ã³ããã¯ã¹ïŒIDïŒã
suspend-ã¿ã¹ã¯äžæåæ¢ãã©ã¡ãŒã¿ãŒãNUSE_NO_SUSPENDãŸãã¯NUSE_SUSPENDã«ãªããŸãã
æ»ãå€ïŒ
NUSE_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NUSE_UNAVAILABLE-ã»ããã©ã«ãã«å€ããããŸããã
NUSE_INVALID_SEMAPHORE-ã»ããã©ã€ã³ããã¯ã¹ãç¡å¹ã§ãã
NUSE_INVALID_SUSPEND-éã¿ã¹ã¯é¢é£ã¹ã¬ããããã®äžæåæ¢ã®è©Šè¡ããŸãã¯APIãããã¯æ©èœãç¡å¹ã«ãªã£ãŠããå Žåã
NUSE_SEMAPHORE_WAS_RESET-ã¿ã¹ã¯ã®äžæäžã«ã»ããã©ããªã»ãããããŸããã
Nucleus SEã§ã®ã»ããã©ãã£ããã£ã®å®è£
æ©èœã³ãŒãNUSE_Semaphore_ObtainïŒïŒ ïŒãã©ã¡ãŒã¿ãŒã®ç¢ºèªåŸïŒã®ããŒãžã§ã³ã¯ããããã¯ïŒäžæåæ¢ïŒã¿ã¹ã¯ã®ãµããŒããã¢ã¯ãã£ããã©ããã«å¿ããŠãæ¡ä»¶ä»ãã³ã³ãã€ã«ã䜿çšããŠéžæãããŸãã äž¡æ¹ã®ãªãã·ã§ã³ãæ€èšããŠãã ããã
ããã¯ãæå¹ã«ãªã£ãŠããªãå Žåããã®APIåŒã³åºãã®ããžãã¯ã¯éåžžã«ç°¡åã§ãã
if (NUSE_Semaphore_Counter[semaphore] != 0) /* semaphore available */ { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; } else /* semaphore unavailable */ { return_value = NUSE_UNAVAILABLE; }
ã»ããã©ã«ãŠã³ã¿ã®å€ããã§ãã¯ããããŒãã«çãããªãå Žåã¯æžå°ããŸãã
ã¿ã¹ã¯ã®ããã¯ãæå¹ã«ãªã£ãŠããå Žåãããžãã¯ã¯ããè€éã«ãªããŸãã
do { if (NUSE_Semaphore_Counter[semaphore] != 0) /* semaphore available */ { NUSE_Semaphore_Counter[semaphore]--; return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } else /* semaphore unavailable */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_UNAVAILABLE; } else { /* block task */ NUSE_Semaphore_Blocking_Count[semaphore]++; NUSE_Suspend_Task(NUSE_Task_Active, semaphore << 4) | NUSE_SEMAPHORE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } } while (suspend == NUSE_SUSPEND);
ããã€ãã®èª¬æã圹ç«ã€å ŽåããããŸãã
ã³ãŒãã¯do ... whileã«ãŒãã«é 眮ãããŸã ããã®ã«ãŒãã¯ã suspendãã©ã¡ãŒã¿ãŒãNUSE_SUSPENDã®éã«å®è¡ãããŸãã
ã»ããã©ã«ãŒã以å€ã®å€ãããå Žåãå€ã¯æžå°ããŸãã ãµã¹ãã³ãå€æ°ã¯NUSE_NO_SUSPENDã«èšå®ãããAPIåŒã³åºãã¯çµäºãã NUSE_SUCESSãè¿ããŸãã
ã»ããã©ãnullã§ã ãµã¹ãã³ãå€æ°ãNUSE_NO_SUSPENDã«èšå®ãããŠããå ŽåãAPIåŒã³åºãã¯NUSE_UNAVAILABLEãè¿ããŸãã äžæåæ¢ãNUSE_SUSPENDã«èšå®ãããŠããå Žåãã¿ã¹ã¯ã¯äžæåæ¢ããŸãã åŒã³åºããå®äºããåŸïŒã¿ã¹ã¯ã®åéæãªã©ïŒãæ»ãå€ãNUSE_SUCCESS ïŒãªã»ããåŸã§ã¯ãªããã»ããã©ã®è§£æŸåŸã«ã¿ã¹ã¯ãåéãããããšã瀺ãïŒã®å Žåããµã€ã¯ã«ã¯æåããå§ãŸããŸãã
ã»ããã©è§£æŸ
Nucleus RTOS APIãåŒã³åºããŠã»ããã©ã解æŸãããŠãŒãã£ãªãã£ã¯éåžžã«ç°¡åã§ããã»ããã©ã«ãŠã³ã¿ã®å€ãå¢å ããæåã¡ãã»ãŒãžãè¿ãããŸãã Nucleus SEã¯åãæ©èœãæäŸããŸãããè¿œå ã®ãªãŒããŒãããŒãã§ãã¯ããããŸãã
Nucleus RTOSã§ã»ããã©ã解æŸãã課é¡
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NU_Release_SemaphoreïŒNU_SEMAPHORE *ã»ããã©ïŒ;
ãã©ã¡ãŒã¿ïŒ
semaphore-ãŠãŒã¶ãŒãæäŸããã»ããã©å¶åŸ¡ãããã¯ãžã®ãã€ã³ã¿ã
æ»ãå€ïŒ
NU_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NU_INVALID_SEMAPHORE-ç¡å¹ãªã»ããã©ãã€ã³ã¿ãŒã
Nucleus SEã§ã»ããã©ã解æŸããããã®èª²é¡
ãã®APIã³ãŒã«ã¯ãNucleus RTOS APIã®ã³ã¢æ©èœããµããŒãããŠããŸãã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NUSE_Semaphore_ReleaseïŒNUSE_SEMAPHOREã»ããã©ïŒ;
ãã©ã¡ãŒã¿ïŒ
ã»ããã© -解æŸãããã»ããã©ã®ã€ã³ããã¯ã¹ïŒIDïŒã
æ»ãå€ïŒ
NUSE_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NUSE_INVALID_SEMAPHORE-ã»ããã©ã€ã³ããã¯ã¹ãç¡å¹ã§ãã
NUSE_UNAVAILABLE-ã»ããã©ã®å€ã¯255ã§ãããå¢ããããšã¯ã§ããŸããã
Nucleus SEã§ã®ã»ããã©ãªãªãŒã¹ã®å®è£
æ©èœããã¯NUSE_Semaphore_ReleaseïŒïŒ ïŒãã©ã¡ãŒã¿ããã§ãã¯ããåŸïŒã¯ãã¿ã¹ã¯ããã¯ãã¢ã¯ãã£ãã«ãªã£ãŠãããã©ããã«é¢ä¿ãªãäžè¬çã§ãã ã»ããã©ã«ãŠã³ã¿ã®å€ããã§ãã¯ããã255æªæºã®å Žåã¯å¢å ããŸãã
APIåŒã³åºãã®ãããã¯ïŒã¿ã¹ã¯ã®äžæïŒã®ãµããŒããæå¹ã«ãªã£ãŠããå Žåãæ¡ä»¶ä»ãã³ã³ãã€ã«ã䜿çšããŠããã«ã³ãŒããéžæãããŸãã
NUSE_CS_Enter(); if (NUSE_Semaphore_Counter[semaphore] < 255) { NUSE_Semaphore_Counter[semaphore]++; return_value = NUSE_SUCCESS; #if NUSE_BLOCKING_ENABLE if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; /* check whether a task is blocked */ /* on this semaphore */ NUSE_Semaphore_Blocking_Count[semaphore]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } #endif } else { return_value = NUSE_UNAVAILABLE; } NUSE_CS_Exit(); return return_value;
ãã®ã»ããã©ã§ã¿ã¹ã¯ãäžæããããšãæåã®ã¿ã¹ã¯ãåéããŸãã
次ã®èšäºã§ã¯ãã»ããã©ãšãã®ããŒã¿æ§é ã«é¢é£ããè¿œå ã®APIåŒã³åºãã«ã€ããŠèª¬æããŸãã
èè ã«ã€ããŠïŒ Colin Wallsã¯é»åæ¥çã§30幎以äžåããŠãããã»ãšãã©ã®æéããã¡ãŒã ãŠã§ã¢ã«è²»ãããŠããŸãã çŸåšãMentor EmbeddedïŒMentor Graphicsã®äžéšéïŒã®ãã¡ãŒã ãŠã§ã¢ãšã³ãžãã¢ã§ãã Colin Wallsã¯ãã«ã³ãã¡ã¬ã³ã¹ãã»ãããŒãå€ãã®æè¡èšäºã®èè ããã¡ãŒã ãŠã§ã¢ã«é¢ãã2åã®æ¬ã§ãã話ããŸãã è±åœã«äœãã§ããŸãã Colinã®ãããã§ãã·ã§ãã«ããã° ãé»åã¡ãŒã«ïŒcolin_walls@mentor.comã