
ãã¥ãŒã¯ã以åã®èšäºïŒïŒ5ïŒã®ããããã§èšåãããŸããã ã¡ãŒã«ããã¯ã¹ãšæ¯èŒããŠãã¿ã¹ã¯éã§ç°¡åãªã¡ãã»ãŒãžã転éããããæè»ãªæ¹æ³ãæäŸããŸãã
ã·ãªãŒãºã®ä»¥åã®èšäºïŒ
èšäºïŒ22ã ã¡ãŒã«ããã¯ã¹ïŒè£å©ãµãŒãã¹ãšããŒã¿æ§é
èšäºïŒ21ã ã¡ãŒã«ããã¯ã¹ïŒçŽ¹ä»ãšåºæ¬ãµãŒãã¹
èšäº20ã ã»ããã©ïŒè£å©ãµãŒãã¹ãšããŒã¿æ§é
èšäºïŒ19ã ã»ããã©ïŒçŽ¹ä»ãšåºæ¬ãµãŒãã¹
èšäºïŒ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åã®ãã¥ãŒãæã€ããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ãã¥ãŒããªãå Žåããã¥ãŒã«é¢é£ããããŒã¿æ§é ããµãŒãã¹ã³ãŒããã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŸããã
ãã¥ãŒãšã¯ãåäžã®ADDRèŠçŽ ã«ååãªå€§ããã®ã¡ã¢ãªå ã®é åã®ã»ããã§ãããè€æ°ã®ã¿ã¹ã¯ã䜿çšã§ããããã«ã¢ã¯ã»ã¹ãå¶åŸ¡ããŸãã ã¿ã¹ã¯ã¯ããã¹ãŠã®é åããã£ã±ãã«ãªããŸã§ãã¥ãŒã«ããŒã¿ãæžã蟌ãããšãã§ããŸãã ã¿ã¹ã¯ã¯ãã¥ãŒããããŒã¿ãèªã¿åãããšãã§ããŸããéåžžãããŒã¿ã¯FIFOïŒå å ¥ãå åºãïŒããŒã¹ã§åä¿¡ãããŸãã æ··éãããã¥ãŒã«ããŒã¿ãæžã蟌ãã ãã空ã®ãã¥ãŒããããŒã¿ãèªã¿åãããšãããšãéžæããAPIåŒã³åºããã©ã¡ãŒã¿ãŒãšNucleus SEã®èšå®ã«ãã£ãŠã¯ããšã©ãŒãŸãã¯ã¿ã¹ã¯ã®äžæåæ¢ãçºçããå ŽåããããŸãã
ãã¥ãŒãšããŒã¿ãªã³ã¯
Nucleus SEã¯ããŒã¿ãã£ãã«ããµããŒãããŠããŸããããã¯ã以åã®èšäºïŒïŒ5ïŒã§ãèšåãããŠããã以äžã®ããããã§è©³çŽ°ã«èª¬æãããŸãã ãã¥ãŒãšãã£ãã«ã®äž»ãªéãã¯ãã¡ãã»ãŒãžã®ãµã€ãºã§ãã ãã¥ãŒã«ã¯ã ADDRã¿ã€ãã®åäžå€æ°ã§æ§æãããã¡ãã»ãŒãžãå«ãŸããŸãïŒéåžžããããã¯ãã€ã³ã¿ãŒã§ãïŒã ãã£ã³ãã«ã«ã¯ãã¢ããªã±ãŒã·ã§ã³å ã®åãã£ã³ãã«ã«åå¥ã®ä»»æã®ãµã€ãºã®ã¡ãã»ãŒãžãå«ãŸãããã©ã¡ãŒã¿ãŒèšå®æã«å²ãåœãŠãããŸãã
ãã¥ãŒèšå®
ãã¥ãŒã®æ°
ã»ãšãã©ã®Nucleus SEãªããžã§ã¯ããšåæ§ã«ããã¥ãŒæ§æã¯äž»ã«nuse_config.hãã¡ã€ã«ã®#defineãã£ã¬ã¯ãã£ãã«ãã£ãŠå¶åŸ¡ãããŸãã äž»ãªãã©ã¡ãŒã¿ãŒã¯NUSE_QUEUE_NUMBERã§ãã¢ããªã±ãŒã·ã§ã³ã§æ§æãããŠãããã¥ãŒã®æ°ã決å®ããŸãã ããã©ã«ãå€ã¯ãŒãïŒã€ãŸããã¢ããªã±ãŒã·ã§ã³ã«ãã¥ãŒããããŸããïŒã§ãæ倧16ã®å€ãåãããšãã§ããŸãã誀ã£ãå€ã¯ã³ã³ãã€ã«äžã«ãšã©ãŒã«ãªãã nuse_config_check.hãã¡ã€ã«ïŒ nuse_config.cãã¡ã€ã«ã«å«ãŸãã³ã³ãã€ã«ãããŸãïŒãããšãšãã«ïŒã ïŒerrorãã£ã¬ã¯ãã£ããããªã¬ãŒããŸãã
ãŒã以å€ã®å€ãéžæãããšããã¥ãŒã®äž»èŠãªã¢ã¯ãã£ããŒã¿ãšããŠæ©èœããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯ãããŒã¿æ§é ãå®çŸ©ãããšãã«äœ¿çšããããã®ãµã€ãºã¯ãã®å€ã«äŸåããŸãïŒããã«ã€ããŠã¯æ¬¡ã®èšäºã§è©³ãã説æããŸãïŒã ããã«ããŒã以å€ã®å€ã¯APIèšå®ãã¢ã¯ãã£ãã«ããŸãã
APIåŒã³åºããã¢ã¯ãã£ãã«ãã
Nucleus SEã®åAPIé¢æ°ïŒãŠãŒãã£ãªãã£åŒã³åºãïŒã«ã¯ã nuse_config.hã« #defineãã£ã¬ã¯ãã£ããã¢ã¯ãã£ãåããæ©èœããããŸãã ãã¥ãŒã®å Žåããããã®ãã£ã¬ã¯ãã£ãã¯æ¬¡ã®ãšããã§ãã
NUSE_QUEUE_SEND NUSE_QUEUE_RECEIVE NUSE_QUEUE_JAM NUSE_QUEUE_RESET NUSE_QUEUE_INFORMATION NUSE_QUEUE_COUNT
ããã©ã«ãã§ã¯ããããã¯FALSEã«èšå®ãããŠããããããã¹ãŠã®ãµãŒãã¹åŒã³åºããç¡å¹ã«ãªããããããå®è£ ããã³ãŒãã®çµã¿èŸŒã¿ããããã¯ãããŸãã ã¢ããªã±ãŒã·ã§ã³ã§ãã¥ãŒãæ§æããã«ã¯ãå¿ èŠãªAPIåŒã³åºããéžæããŠTRUEã«èšå®ããå¿ èŠããããŸãã
以äžã¯ã nuse_config.hãã¡ã€ã«ããã®ã³ãŒãã¹ããããã§ãã
#define NUSE_QUEUE_NUMBER 0 /* Number of queues in the system - 0-16 */ /* Service call enablers */ #define NUSE_QUEUE_SEND FALSE #define NUSE_QUEUE_RECEIVE FALSE #define NUSE_QUEUE_JAM FALSE #define NUSE_QUEUE_RESET FALSE #define NUSE_QUEUE_INFORMATION FALSE #define NUSE_QUEUE_COUNT FALSE
ãã¥ãŒAPIã®æ©èœãã¢ã¯ãã£ãã«ãªã£ãŠããããã¢ããªã±ãŒã·ã§ã³ã«ãã¥ãŒããªãå ŽåïŒåžžã«æå¹ã«ãªã£ãŠããNUSE_Queue_CountïŒïŒãé€ãïŒãã³ã³ãã€ã«ãšã©ãŒã衚瀺ãããŸãã ã¢ã¯ãã£ãåãããŠããªãAPIåŒã³åºããã³ãŒãã§äœ¿çšãããšãå®è£ ã³ãŒããã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããŠããªããããã¬ã€ã¢ãŠããšã©ãŒãçºçããŸãã
ã³ãŒã«ãã¥ãŒã€ã³ã°
Nucleus RTOSã¯ã次ã®æ©èœãæäŸãã10åã®ãã¥ãŒãµãŒãã¹ã³ãŒã«ããµããŒãããŠããŸãã
- ã¡ãã»ãŒãžã®ãã¥ãŒã€ã³ã°ã Nucleus SEã¯NUSE_Queue_SendïŒïŒé¢æ°ã«å®è£ ãããŠããŸãã
- ãã¥ãŒããã®ã¡ãã»ãŒãžãåãå ¥ããŸãã Nucleus SEã¯NUSE_Queue_ReceiveïŒïŒé¢æ°ãå®è£ ããŠããŸãã
- ãã¥ãŒã®å é ãžã®æçš¿ã Nucleus SEã¯NUSE_Queue_JamïŒïŒãå®è£ ããŠããŸãã
- äžæåæ¢ãããŠãããã¹ãŠã®ã¿ã¹ã¯ã解æŸããŠããã¥ãŒãæªäœ¿çšç¶æ ã«åŸ©å ããïŒãªã»ããïŒ Nucleus SEã§ã¯ã NUSE_Queue_ResetïŒïŒã§å®è£ ãããŠããŸãã
- ç¹å®ã®ãã¥ãŒã«é¢ããæ å ±ãæäŸããŸãã Nucleus SEã¯NUSE_Queue_InformationïŒïŒã«å®è£ ãããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã§çŸåšæ§æãããŠãããã¥ãŒã®æ°ãè¿ããŸãã Nucleus SEã§ã¯ã NUSE_Queue_CountïŒïŒã§å®è£ ãããŠããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã«æ°ãããã¥ãŒãè¿œå ããïŒãã¥ãŒãäœæããïŒã Nucleus SEã¯å®è£ ãããŠããŸããã
- ã¢ããªã±ãŒã·ã§ã³ãããã¥ãŒãåé€ããŸãã Nucleus SEã¯å®è£ ãããŠããŸããã
- ã¢ããªã±ãŒã·ã§ã³å ã®ãã¹ãŠã®ãã¥ãŒãžã®ãã€ã³ã¿ãŒãè¿ããŸãã Nucleus SEã¯å®è£ ãããŠããŸããã
- ãã¥ãŒã§äžæãããŠãããã¹ãŠã®ã¿ã¹ã¯ã«ã¡ãã»ãŒãžãéä¿¡ããïŒãããŒããã£ã¹ãïŒã Nucleus SEã¯å®è£ ãããŠããŸããã
ãããã®åãªãŒããŒãããã³ãŒã«ã®å®è£ ã«ã€ããŠã以äžã§è©³ãã説æããŸãã
ãã¥ãŒããã®æžã蟌ã¿ããã³èªã¿åãã®ãµãŒãã¹åŒã³åºã
ãã¥ãŒã§å®è¡ãããåºæ¬çãªæäœã¯ãæžã蟌ã¿ïŒãã¥ãŒã¡ãã»ãŒãžãšåŒã°ããããšããããŸãïŒããã³èªã¿åãïŒã¡ãã»ãŒãžã®åä¿¡ãšãåŒã°ããŸãïŒã§ãã ãã¥ãŒã®å é ã«æžã蟌ãããšãã§ããŸãïŒãžã£ãã³ã°ïŒã Nucleus RTOSããã³Nucleus SEã¯ããããã®æäœã®ããã®3ã€ã®åºæ¬çãªAPIåŒã³åºããæäŸããŸããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
åŸ ã¡è¡å
ãã¥ãŒã«æžã蟌ãNucleus RTOS APIãŠãŒãã£ãªãã£ã³ãŒã«ã¯éåžžã«æè»ã§ãããæé»çã«ããŸãã¯æäœãããã«å®äºã§ããªãå ŽåïŒããšãã°ããã«ãã¥ãŒã«æžã蟌ãå ŽåïŒã«ç¹å®ã®ã¿ã€ã ã¢ãŠãã§ã¿ã¹ã¯ãäžæåæ¢ã§ããŸãã Nucleus SEã¯åãæ©èœãæäŸããŸãããã¿ã¹ã¯ã®äžæåæ¢ã¯ãªãã·ã§ã³ã§ãããã¿ã€ã ã¢ãŠãã¯å®è£ ãããŠããŸããã
Nucleus RTOSã§ã®ã¡ãã»ãŒãžã®ãã¥ãŒã€ã³ã°
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NU_Send_To_QueueïŒNU_QUEUE *ãã¥ãŒãVOID *ã¡ãã»ãŒãžãUNSIGNEDãµã€ãºãUNSIGNEDãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãŠãŒã¶ãŒãæäŸãããã¥ãŒå¶åŸ¡ãããã¯ãžã®ãã€ã³ã¿ãŒã
message-éä¿¡ãããã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãŒã
size-ã¡ãã»ãŒãžå ã®UNSIGNEDããŒã¿èŠçŽ ã®æ°ã ãã¥ãŒãå¯å€é·ã®ã¡ãã»ãŒãžããµããŒãããŠããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯ã¡ãã»ãŒãžã®ãµã€ãºãšåããããã¥ãŒã§ãµããŒããããŠããã¡ãã»ãŒãžã®ãµã€ãºããå°ãããªããã°ãªããŸããã ãã¥ãŒãåºå®ãµã€ãºã®ã¡ãã»ãŒãžããµããŒãããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯ãã¥ãŒã§ãµããŒããããã¡ãã»ãŒãžã®ãµã€ãºãšæ£ç¢ºã«äžèŽããå¿ èŠããããŸãã
suspend-ã¿ã¹ã¯ã®äžæåæ¢ã®æå®ãNU_NO_SUSPENDãŸãã¯NU_SUSPENDã®å€ããŸãã¯ã¿ã€ã ã¢ãŠãå€ãåãããšãã§ããŸãã
æ»ãå€ïŒ
NU_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NU_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒãã€ã³ã¿ãŒã
NU_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NU_INVALID_SIZE-ã¡ãã»ãŒãžãµã€ãºã¯ããã¥ãŒã§ãµããŒããããŠããã¡ãã»ãŒãžãµã€ãºãšäºææ§ããããŸããã
NU_INVALID_SUSPEND-äžæã¯ã¿ã¹ã¯ã«é¢ä¿ã®ãªãã¹ã¬ããããå®è¡ãããŸããã
NU_QUEUE_FULL-ãã¥ãŒããã£ã±ãã§ãäžæãæå®ãããŠããŸããã
NU_TIMEOUT-æå®ãããã¿ã€ã ã¢ãŠãã§ã¿ã¹ã¯ãäžæãããåŸã§ããã¥ãŒã¯ãã£ã±ãã§ãã
NU_QUEUE_DELETED-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒãåé€ãããŸããã
NU_QUEUE_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEã§ã®ã¡ãã»ãŒãžã®ãã¥ãŒã€ã³ã°
ãã®APIãµãŒãã¹ã³ãŒã«ã¯ãNucleus RTOS APIã®ã³ã¢æ©èœããµããŒãããŠããŸãã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NUSE_Queue_SendïŒNUSE_QUEUEãã¥ãŒãADDR *ã¡ãã»ãŒãžãU8ãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãã¥ãŒã€ã³ããã¯ã¹ïŒIDïŒ;
message-éä¿¡ãããã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãŒ;ããã¯ADDRã¿ã€ãã®1ã€ã®å€æ°ã§ãã
suspend-ã¿ã¹ã¯ãäžæåæ¢ããããã®æå®; NUSE_NO_SUSPENDãŸãã¯NUSE_SUSPENDã®å€ãåãããšãã§ããŸãã
æ»ãå€ïŒ
NUSE_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NUSE_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒã€ã³ããã¯ã¹ã
NUSE_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NUSE_INVALID_SUSPEND-ã¿ã¹ã¯ã«é¢é£ä»ããããŠããªãã¹ã¬ããããã¿ã¹ã¯ãäžæåæ¢ããè©Šã¿ããŸãã¯APIãµãŒãã¹åŒã³åºããã¿ã¹ã¯ããããã¯ããããã«ç¡å¹ã«ãªã£ãŠããå Žåã
NUSE_QUEUE_FULL-ãã¥ãŒããã£ã±ãã§ãäžæãæå®ãããŠããŸããã
NUSE_QUEUE_WAS_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEã§ãã¥ãŒã€ã³ã°ãå®è£ ãã
APIé¢æ°ã³ãŒãNUSE_Queue_SendïŒïŒã®ããŒãžã§ã³ïŒãã©ã¡ãŒã¿ãŒã確èªããåŸïŒã¯ãã¿ã¹ã¯ããã¯ã®ãµããŒããã¢ã¯ãã£ããã©ããã«å¿ããŠãæ¡ä»¶ä»ãã³ã³ãã€ã«ã䜿çšããŠéžæãããŸãã äž¡æ¹ã®ãªãã·ã§ã³ãæ€èšããŸãã
ã¿ã¹ã¯ã®ããã¯ãæå¹ã«ãªã£ãŠããªãå Žåããã®ãµãŒãã¹åŒã³åºãã®ã³ãŒãã¯éåžžã«ç°¡åã§ãã
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
ãã®é¢æ°ã¯ããã¥ãŒã«ç©ºãé åããããã©ããã確èªããã ãã§ã NUSE_Queue_Head []ã€ã³ããã¯ã¹ã䜿çšããŠã¡ãã»ãŒãžããã¥ãŒããŒã¿é åã«æ ŒçŽããŸãã
ã¿ã¹ã¯ã®ããã¯ãæå¹ã«ãªã£ãŠããå Žåãã³ãŒãã¯ããè€éã«ãªããŸãã
do { if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_FULL; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* queue element available */ NUSE_Queue_Data[queue][NUSE_Queue_Head[queue]++] = *message; if (NUSE_Queue_Head[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Head[queue] = 0; } NUSE_Queue_Items[queue]++; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
ããã€ãã®èª¬æã圹ç«ã€å ŽåããããŸãã
ã³ãŒãã¯do ... whileã«ãŒãã§å²ãŸããŠããŸãããã®ã«ãŒãã¯ãã¿ã¹ã¯ã®ããŒãºãã©ã¡ãŒã¿ãŒãNUSE_SUSPENDã®éã«å®è¡ãããŸãã
ãã¥ãŒããã£ã±ãã§ãµã¹ãã³ããNUSE_NO_SUSPENDã®å ŽåãAPIåŒã³åºãã¯NUSE_QUEUE_FULLã§çµäºããŸã ã äžæãã©ã¡ãŒã¿ãŒãNUSE_SUSPENDã®å Žåãã¿ã¹ã¯ã¯äžæåæ¢ããŸãã å®äºæïŒã¿ã¹ã¯ã®åéæïŒãæ»ãå€ãNUSE_SUCCESSã®å Žåãã€ãŸããã¡ãã»ãŒãžãèªã¿åãããããã«ïŒãã¥ãŒããªã»ãããããããã§ã¯ãªãïŒã¿ã¹ã¯ãåéãããå Žåãã³ãŒãã¯ã«ãŒãã®å é ã«æ»ããŸãã
ãã¥ãŒããã£ã±ãã§ãªãå ŽåãæäŸãããã¡ãã»ãŒãžã¯ãã¥ãŒã®ããŒã¿é åã®NUSE_Queue_Head []ã€ã³ããã¯ã¹ã䜿çšããŠä¿åãããŸãã ãã¥ãŒã«äžæåæ¢ãããã¿ã¹ã¯ããããã©ããã確èªããŸãïŒä¿çäžã®ã¡ãã»ãŒãžïŒã ãã®ãããªã¿ã¹ã¯ãããå Žåãæåã®ã¿ã¹ã¯ãåéãããŸãã äžæå€æ°ã¯NUSE_NO_SUSPENDã«èšå®ãããAPIåŒã³åºãã¯å€NUSE_SUCCESSã§çµäºããŸãã
ãã¥ãŒããã®èªã¿åã
Nucleus RTOS APIãŠãŒãã£ãªãã£ã®ãã¥ãŒããã®èªã¿åãåŒã³åºãã¯éåžžã«æè»ã§ãæé»çã«ããŸãã¯æäœãããã«å®äºã§ããªãå ŽåïŒç©ºã®ãã¥ãŒããèªã¿åãããšããå Žåãªã©ïŒã«ç¹å®ã®ã¿ã€ã ã¢ãŠãã§ã¿ã¹ã¯ãäžæåæ¢ã§ããŸãã Nucleus SEã¯åãæ©èœãæäŸããŸãããã¿ã¹ã¯ã®äžæåæ¢ã¯ãªãã·ã§ã³ã§ãããã¿ã€ã ã¢ãŠãã¯å®è£ ãããŠããŸããã
Nucleus RTOSã®ãã¥ãŒããã¡ãã»ãŒãžãåä¿¡ããããã®åŒã³åºã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NU_Receive_From_QueueïŒNU_QUEUE *ãã¥ãŒãVOID *ã¡ãã»ãŒãžãUNSIGNEDãµã€ãºãUNSIGNED * actual_sizeãUNSIGNEDãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãŠãŒã¶ãŒãæäŸãããã¥ãŒå¶åŸ¡ãããã¯ãžã®ãã€ã³ã¿ãŒã
message-åä¿¡ããã¡ãã»ãŒãžã®ã¹ãã¬ãŒãžãžã®ãã€ã³ã¿ãŒã
size-ã¡ãã»ãŒãžå ã®UNSIGNEDããŒã¿èŠçŽ ã®æ°ã ãã®æ°ã¯ããã¥ãŒãäœæããããšãã«å®çŸ©ãããã¡ãã»ãŒãžãµã€ãºãšäžèŽããå¿ èŠããããŸãã
suspend-ã¿ã¹ã¯ã®äžæåæ¢ã®æå®ãNU_NO_SUSPENDãŸãã¯NU_SUSPENDã®å€ããŸãã¯ã¿ã€ã ã¢ãŠãå€ãåãããšãã§ããŸãã
æ»ãå€ïŒ
NU_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NU_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒãã€ã³ã¿ãŒã
NU_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NU_INVALID_SUSPEND-ã¿ã¹ã¯ã«é¢ä¿ã®ãªãã¹ã¬ããããã¿ã¹ã¯ãäžæåæ¢ããããšããŸãã
NU_QUEUE_EMPTY-ãã¥ãŒã¯ç©ºã§ãããäžæåæ¢ã¯æå®ãããŠããŸããã
NU_TIMEOUT-ã¿ã¹ã¯ãæå®ãããæéäžæãããåŸã§ãããã¥ãŒããŸã 空ã§ããããšã瀺ããŸãã
NU_QUEUE_DELETED-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒãåé€ãããŸããã
NU_QUEUE_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEãã¥ãŒããã¡ãã»ãŒãžãåä¿¡ããããã®åŒã³åºã
ãã®APIã³ãŒã«ã¯ãNucleus RTOS APIã®ã³ã¢æ©èœããµããŒãããŠããŸãã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NUSE_Queue_ReceiveïŒNUSE_QUEUEãã¥ãŒãADDR *ã¡ãã»ãŒãžãU8ãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãã¥ãŒã€ã³ããã¯ã¹ïŒIDïŒ;
message-åä¿¡ããã¡ãã»ãŒãžã®ãªããžããªãžã®ãã€ã³ã¿ã¯ãã¿ã€ãADDRã® 1ã€ã®å€æ°ã§ãã
suspend-ã¿ã¹ã¯ã®äžæã®æå® ãå€NUSE_NO_SUSPENDãŸãã¯NUSE_SUSPENDãåãããšãã§ããŸãã
æ»ãå€ïŒ
NUSE_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NUSE_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒã€ã³ããã¯ã¹ã
NUSE_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NUSE_INVALID_SUSPEND-ã¿ã¹ã¯ã«é¢é£ä»ããããŠããªãã¹ã¬ããããŸãã¯ã¿ã¹ã¯ãããã¯ã®ãµããŒããç¡å¹ã«ãªã£ãŠããã¹ã¬ããããã¿ã¹ã¯ãäžæããããšããè©Šã¿ã
NUSE_QUEUE_EMPTY-ãã¥ãŒã¯ç©ºã§ãããäžæã¯æå®ãããŠããŸããã
NUSE_QUEUE_WAS_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEã§ã®ãã¥ãŒã¡ãã»ãŒãžã®å®è£
ã¿ã¹ã¯ããã¯ã®ãµããŒããã¢ã¯ãã£ããã©ããã«å¿ããŠãæ¡ä»¶ä»ãã³ã³ãã€ã«ã䜿çšããŠãAPIé¢æ°ã³ãŒãããªã¢ã³ãNUSE_Queue_ReceiveïŒïŒ ïŒãã©ã¡ãŒã¿ãŒã®ãã§ãã¯åŸïŒãéžæãããŸãã äž¡æ¹ã®ãªãã·ã§ã³ãæ€èšããŠãã ããã
ããã¯ã®ãµããŒããæå¹ã«ãªã£ãŠããå Žåããã®APIåŒã³åºãã®ã³ãŒãã¯éåžžã«ç°¡åã§ãã
if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { return_value = NUSE_QUEUE_EMPTY; } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; return_value = NUSE_SUCCESS; }
ãã®é¢æ°ã¯ããã¥ãŒã«ã¡ãã»ãŒãžããããã©ããã確èªãã NUSE_Queue_Tail []ã€ã³ããã¯ã¹ã䜿çšããŠãã¥ãŒããã¡ãã»ãŒãžãååŸããã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãŒã䜿çšããŠããŒã¿ãè¿ããŸãã
ã¿ã¹ã¯ã®ããã¯ãæå¹ã«ãªã£ãŠããå Žåãã³ãŒãã¯ããè€éã«ãªããŸãã
do { if (NUSE_Queue_Items[queue] == 0) /* queue empty */ { if (suspend == NUSE_NO_SUSPEND) { return_value = NUSE_QUEUE_EMPTY; } else { /* block task */ NUSE_Queue_Blocking_Count[queue]++; NUSE_Suspend_Task(NUSE_Task_Active, (queue << 4) | NUSE_QUEUE_SUSPEND); return_value = NUSE_Task_Blocking_Return[NUSE_Task_Active]; if (return_value != NUSE_SUCCESS) { suspend = NUSE_NO_SUSPEND; } } } else { /* message available */ *message = NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]++]; if (NUSE_Queue_Tail[queue] == NUSE_Queue_Size[queue]) { NUSE_Queue_Tail[queue] = 0; } NUSE_Queue_Items[queue]--; if (NUSE_Queue_Blocking_Count[queue] != 0) { U8 index; /* check whether a task is blocked */ /* on this queue */ NUSE_Queue_Blocking_Count[queue]--; for (index=0; index<NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_QUEUE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == queue)) { NUSE_Task_Blocking_Return[index] = NUSE_SUCCESS; NUSE_Wake_Task(index); break; } } } return_value = NUSE_SUCCESS; suspend = NUSE_NO_SUSPEND; } } while (suspend == NUSE_SUSPEND);
ããã€ãã®èª¬æã圹ç«ã¡ãŸãã
ã³ãŒãã¯do ... whileã«ãŒãã§å²ãŸããŠããŸãããã®ã«ãŒãã¯ãã¿ã¹ã¯ã®ããŒãºãã©ã¡ãŒã¿ãŒãNUSE_SUSPENDã®éã«å®è¡ãããŸãã
ãã¥ãŒã空ã§ãµã¹ãã³ããNUSE_NO_SUSPENDã®å ŽåãAPIåŒã³åºãã¯NUSE_QUEUE_EMPTYã§çµäºããŸã ã äžæãã©ã¡ãŒã¿ãŒãNUSE_SUSPENDã®å Žåãã¿ã¹ã¯ã¯äžæåæ¢ããŸãã å®äºæã«ïŒã€ãŸããã¿ã¹ã¯ãåéãããšãïŒãæ»ãå€ãNUSE_SUCCESSã®å Žåãã€ãŸããã¡ãã»ãŒãžãéä¿¡ãããããã«ïŒãã¥ãŒããªã»ãããããããã§ã¯ãªãïŒã¿ã¹ã¯ãåéãããå Žåãã³ãŒãã¯ã«ãŒãã®å é ã«æ»ããŸãã
ãã¥ãŒã«ã¡ãã»ãŒãžãå«ãŸããŠããå Žåãä¿åãããã¡ãã»ãŒãžã¯NUSE_Queue_Tail []ã€ã³ããã¯ã¹ã䜿çšããŠè¿ãããŸãã ãã®ãã¥ãŒã«äžæåæ¢ïŒéä¿¡åŸ ã¡ïŒã¿ã¹ã¯ããããã©ããã確èªããŸãã ãã®ãããªã¿ã¹ã¯ãããå Žåãæåã®ã¿ã¹ã¯ãåéãããŸãã äžæå€æ°ã¯NUSE_NO_SUSPENDã«èšå®ãããAPIåŒã³åºãã¯ã³ãŒãNUSE_SUCCESSã§çµäºããŸãã
ãã¥ãŒã®å é ã«æžã蟌ã
ã¡ãã»ãŒãžããã¥ãŒãããã«æžã蟌ãNucleus RTOS APIãŠãŒãã£ãªãã£ã³ãŒã«ã¯éåžžã«æè»ã§ãããæé»çã«ããŸãã¯æäœãããã«å®äºã§ããªãå ŽåïŒæ··éãããã¥ãŒãžã®æžã蟌ã¿ãè©Šè¡ããå Žåãªã©ïŒãç¹å®ã®ã¿ã€ã ã¢ãŠãã§ã¿ã¹ã¯ãäžæåæ¢ã§ããŸãã Nucleus SEã¯åãæ©èœãæäŸããŸãããã¿ã¹ã¯ã®äžæåæ¢ã¯ãªãã·ã§ã³ã§ãããã¿ã€ã ã¢ãŠãã¯å®è£ ãããŠããŸããã
Nucleus RTOSãã¥ãŒã®å é ã«ã¡ãã»ãŒãžãæžã蟌ãåŒã³åºã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NU_Send_To_Front_Of_QueueïŒNU_QUEUE *ãã¥ãŒãVOID *ã¡ãã»ãŒãžãUNSIGNEDãµã€ãºãUNSIGNEDãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãŠãŒã¶ãŒãæäŸãããã¥ãŒå¶åŸ¡ãããã¯ãžã®ãã€ã³ã¿ãŒã
message-éä¿¡ãããã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãŒã
size-ã¡ãã»ãŒãžå ã®UNSIGNEDããŒã¿èŠçŽ ã®æ°ã ãã¥ãŒãå¯å€é·ã¡ãã»ãŒãžããµããŒãããŠããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯ã¡ãã»ãŒãžãµã€ãºãšåããããã¥ãŒã§ãµããŒããããŠããã¡ãã»ãŒãžãµã€ãºããå°ããå¿ èŠããããŸãã ãã¥ãŒãåºå®é·ã®ã¡ãã»ãŒãžããµããŒãããå Žåããã®ãã©ã¡ãŒã¿ãŒã¯ãã¥ãŒã§ãµããŒããããã¡ãã»ãŒãžã®ãµã€ãºãšæ£ç¢ºã«äžèŽããå¿ èŠããããŸãã
suspend-ã¿ã¹ã¯ã®äžæåæ¢ã®æå®ãNU_NO_SUSPENDãŸãã¯NU_SUSPENDã®å€ããŸãã¯ã¿ã€ã ã¢ãŠãå€ãåãããšãã§ããŸãã
æ»ãå€ïŒ
NU_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NU_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒãã€ã³ã¿ãŒã
NU_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NU_INVALID_SIZE-ã¡ãã»ãŒãžãµã€ãºã¯ããã¥ãŒã§ãµããŒããããŠããã¡ãã»ãŒãžãµã€ãºãšäºææ§ããããŸããã
NU_INVALID_SUSPEND-éã¿ã¹ã¯ãããŒããäžæåæ¢ãè©Šã¿ãŸã
NU_QUEUE_FULL-ãã¥ãŒããã£ã±ãã§ãäžæãæå®ãããŠããŸããã
NU_TIMEOUT-ç¹å®ã®ã¿ã€ã ã¢ãŠãã®ããã«ã¿ã¹ã¯ãäžæãããåŸã§ãããã¥ãŒã¯ãã£ã±ãã§ãã
NU_QUEUE_DELETED-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒãåé€ãããŸããã
NU_QUEUE_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEã®ãã¥ãŒã®å é ã«ã¡ãã»ãŒãžãæžã蟌ãåŒã³åºã
ãã®APIã³ãŒã«ã¯ãNucleus RTOS APIã®ã³ã¢æ©èœããµããŒãããŠããŸãã
ãµãŒãã¹ã³ãŒã«ã®ãããã¿ã€ãïŒ
STATUS NUSE_Queue_JamïŒNUSE_QUEUEãã¥ãŒãADDR *ã¡ãã»ãŒãžãU8ãµã¹ãã³ãïŒ;
ãã©ã¡ãŒã¿ïŒ
queue-ãã¥ãŒã€ã³ããã¯ã¹ïŒIDïŒ;
message-ã¡ãã»ãŒãžãžã®ãã€ã³ã¿ãŒã¯ãã¿ã€ãADDRã® 1ã€ã®å€æ°ã§ãã
suspend-ã¿ã¹ã¯ã®äžæã®æå® ãå€NUSE_NO_SUSPENDãŸãã¯NUSE_SUSPENDãåãããšãã§ããŸãã
æ»ãå€ïŒ
NUSE_SUCCESS-åŒã³åºãã¯æ£åžžã«å®äºããŸããã
NUSE_INVALID_QUEUE-ç¡å¹ãªãã¥ãŒã€ã³ããã¯ã¹ã
NUSE_INVALID_POINTER-ã¡ãã»ãŒãžãžã®NULLãã€ã³ã¿ãŒïŒ NULL ïŒ;
NUSE_INVALID_SUSPEND-ã¿ã¹ã¯ã«é¢é£ä»ããããŠããªãã¹ã¬ããããŸãã¯ã¿ã¹ã¯ãããã¯ã®ãµããŒããç¡å¹ã«ãªã£ãŠããã¹ã¬ããããã¿ã¹ã¯ãäžæããããšããè©Šã¿ã
NUSE_QUEUE_FULL-ãã¥ãŒããã£ã±ãã§ãäžæãæå®ãããŠããŸããã
NUSE_QUEUE_WAS_RESET-ã¿ã¹ã¯ã®äžæäžã«ãã¥ãŒããªã»ãããããŸããã
Nucleus SEã§ã®ãã¥ãŒãããã¬ã³ãŒãã®å®è£
APIé¢æ°ã³ãŒãã®ããªã¢ã³ãã§ããNUSE_Queue_JamïŒïŒã¯NUSE_Queue_SendïŒïŒãšéåžžã«ãã䌌ãŠããŸããããŒã¿ã®ã¿ãNUSE_Queue_Tail []ã€ã³ããã¯ã¹ã䜿çšããŠä¿åãããŸãã
if (NUSE_Queue_Items[queue] == NUSE_Queue_Size[queue]) /* queue full */ { return_value = NUSE_QUEUE_FULL; } else /* queue element available */ { if (NUSE_Queue_Tail[queue] == 0) { NUSE_Queue_Tail[queue] = NUSE_Queue_Size[queue] - 1; } else { NUSE_Queue_Tail[queue]--; } NUSE_Queue_Data[queue][NUSE_Queue_Tail[queue]] = *message; NUSE_Queue_Items[queue]++; return_value = NUSE_SUCCESS; }
次ã®èšäºã§ã¯ããã¥ãŒã«é¢é£ä»ããããè¿œå ã®APIåŒã³åºããšããŒã¿æ§é ã«ã€ããŠèª¬æããŸãã
èè ã«ã€ããŠïŒ Colin Wallsã¯é»åæ¥çã§30幎以äžåããŠãããã»ãšãã©ã®æéããã¡ãŒã ãŠã§ã¢ã«è²»ãããŠããŸãã çŸåšãMentor EmbeddedïŒMentor Graphicsã®äžéšéïŒã®ãã¡ãŒã ãŠã§ã¢ãšã³ãžãã¢ã§ãã Colin Wallsã¯ãã«ã³ãã¡ã¬ã³ã¹ãã»ãããŒãå€ãã®æè¡èšäºã®èè ããã¡ãŒã ãŠã§ã¢ã«é¢ãã2åã®æ¬ã§ãã話ããŸãã è±åœã«äœãã§ããŸãã Colinã®ãããã§ãã·ã§ãã«ããã° ãé»åã¡ãŒã«ïŒcolin_walls@mentor.comã