Previous: 4.1.3. キューからの取得 |
Up: 4. キュー |
Next: 4.3. キューへの追加(前への追加) |
サンプルプログラム |
freertos_queue_to_back_blocked |
前項のサンプルではキューの状態をポーリングしてキューにデータが入っているかどうかを常時チェックしていました。xQueueReceive関数で待ち時間を指定すると、割込みを使用したかのようにして、キューにデータが入り次第タスクを起動するという処理をすることができます。
このサンプルでは、キューからのデータ受信用のタスクの優先度を高くしています。
xTaskCreate(prvTask_USARTRX_Queue_Send,??? (signed portCHAR *)"Sender",?? 200, NULL, 1, NULL); xTaskCreate(prvTask_USARTTX_Queue_Receive, (signed portCHAR *)"Receiver", 200, NULL, 2, NULL); |
そして受信用のタスクのxQueueReceive関数では待ち時間を指定して実行しています。portMAX_DELAYを指定したので、待ち時間は無期限です。つまりこのwhileループでは、キューにデータが入ってくるまでは、xQueueReceive関数のところで停止する(Blocked状態になる)ということになります。優先度2のこのタスクがBlocked状態になるので、優先度1のキューへの送信用の関数がRunning状態となって実行されます。送信用関数がキューにデータを送信した瞬間に、Blocked状態になっていた受信用タスクはRunning状態に復帰します。その後受信用タスクはキューから取得したデータをターミナルに送信し、1秒間待ちます。
結果このサンプルでは、ターミナルで入力した文字が1文字ずつ、1秒毎にエコーバックされるという処理になります。
while(1) ? { ??? //Receive data from queue ??? xStatus = xQueueReceive( xQueue, &Acquired_Data, portMAX_DELAY); ??? //Send data through COM port ??? cputchar(Acquired_Data);
??? vTaskDelayUntil(&xLastWakeTime, 1000 / portTICK_RATE_MS ); ? } |
Previous: 4.1.3. キューからの取得 |
Up: 4. キュー |
Next: 4.3. キューへの追加(前への追加) |