Previous: 4.1.2. キューへの送信 |
Up: 4.1. キューへの追加(後ろへの追加・待ち時間なし) |
Next: 4.2. キューへの追加(後ろへの追加・Blocked状態) |
キューからのデータの受信用・ターミナルへのデータの送信用のタスクprvTask_USARTTX_Queue_Receive関数では、まずキューにデータが入っていないかをポーリングしてします。キューにデータが入っているかどうか、入っているならばいくつは入っているのかをチェックするための関数が、uxQueueMessagesWaiting関数です。
関数名 |
uxQueueMessagesWaiting関数 |
|
関数プロトタイプ |
portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ) |
|
動作 |
指定されたキューに入っているデータの個数を返します。 |
|
引数 |
xQueue |
チェックする対象のキューのハンドラを指定します。 |
戻り値 |
キューに入っているデータの個数 |
サンプルプログラムでは以下のようにして、キューにデータが入っている間、whileループを繰り返すようにしています(内側のループ)。
while(1) ??{ ??? //Checks a data is in queue ??? while(uxQueueMessagesWaiting(xQueue)) ????? { ??????? //Receive data from queue ??????? xStatus = xQueueReceive( xQueue, &Acquired_Data, 0); ??????? //Send data through COM port ??????? cputchar(Acquired_Data); ????? } ??? vTaskDelayUntil(&xLastWakeTime, 1000 / portTICK_RATE_MS ); ? } |
キューからデータを受け取るために使用するのがxQueueReceive関数です。
関数名 |
xQueueReceive関数 |
|||||
関数プロトタイプ |
portBASE_TYPE xQueueReceive ? ( ??? xQueueHandle xQueue, ??? void *pvBuffer, ??? portTickType xTicksToWait ? ) |
|||||
動作 |
キューの先頭にデータを取得します。 |
|||||
引数 |
xQueue |
データの取得元とする対象となるキューのハンドラを指定します。 |
||||
*pvBuffer |
キューから取得してきたデータを格納するポインタを指定します。 |
|||||
xTicksToWait |
データの取得元となるキューが空である場合の最大待ち時間を指定します。 |
|||||
戻り値 |
取得結果
|
キューからデータを取得しようとしたが取得元のキューが空であった場合に、直ちにエラーを返すのではなく、キューに空きができるまで待ちます。そのときの最大待ち時間をxTicksToWaitで指定します。指定はTick単位です。FreeRTOSConfig.hでINCLUDE_vTaskSuspendを1と定義している場合には、xTicksToWaitにマクロportMAX_DELAYを指定すると、待ち時間に制限を設けず、データが取得できるまで待ち続けます。この待ち時間の間は、xQueueReceive関数を実行したタスクはBlocked状態になります。
先ほどのサンプルでは、uxQueueMessagesWaiting関数でキューにデータが入っているかどうかをチェックしてから、xQueueReceive関数を実行していますので、待ち時間は0と指定しています。Acquired_Dataはデータの格納用に関数の冒頭で宣言しておいたint8_t型のローカル変数です。
このサンプルプログラムでは、外側のwhileループで、1000ms毎に処理を実行しています。そして内側のループでは、キューにデータがある限り、キューからデータを取得してターミナルに送信しています。結果、ターミナルから連続して送信した文字は、1秒毎にまとめてエコーバックされるという結果になります。
Previous: 4.1.2. キューへの送信 |
Up: 4.1. キューへの追加(後ろへの追加・待ち時間なし) |
Next: 4.2. キューへの追加(後ろへの追加・Blocked状態) |