マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 4.1.3. キューからの取得

Up: 4. キュー

Next: 4.3. キューへの追加(前への追加)


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 4. キュー:

4.2. キューへの追加(後ろへの追加・Blocked状態)

サンプルプログラム

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. キューへの追加(前への追加)


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。