RTOSに぀いおの真実。 蚘事23。 キュヌ玹介ず基本サヌビス





キュヌは、以前の蚘事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 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。



All Articles