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


Previous: 4.1.2. キューへの送信

Up: 4.1. キューへの追加(後ろへの追加・待ち時間なし)

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


マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法: 4. キュー: 4.1. キューへの追加(後ろへの追加・待ち時間なし):

4.1.3. キューからの取得

 キューからのデータの受信用・ターミナルへのデータの送信用のタスク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

データの取得元となるキューが空である場合の最大待ち時間を指定します。

戻り値

取得結果

pdPASS

取得成功

errQUEUE_EMPTY

キューが空であり、最大待ち時間を経過してもキューからデータを取得できなかった

 キューからデータを取得しようとしたが取得元のキューが空であった場合に、直ちにエラーを返すのではなく、キューに空きができるまで待ちます。そのときの最大待ち時間をxTicksToWaitで指定します。指定はTick単位です。FreeRTOSConfig.hINCLUDE_vTaskSuspend1と定義している場合には、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状態)


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