割り込み処理内でのキュー制御用API関数の使い方


割り込み処理ルーチン内からキューバッファを使う場合には、専用の
API関数が用意されていますので、これを使ってキューバッファを使います。

【キューバッファの使用例】

割り込み処理ルーチン内からキューバッファを使う例題を試してみます。
まず、キューバッファを2種類用意します。
lcdQueueは液晶表示用のメッセージを格納するバッファで、タスク2が
このバッファからメッセージを取り出して表示します。
numQueueは、数値を格納するキューバッファで、タスク1で1秒ごとに
まとめて5個のCount1のインクリメントした数値を格納します。
また続けてタスク1ではCount1の現在値のメッセージをlcdQueueに送信
します。このときのCount1は5ずつカウントアップすることになります。

タイマ2の0.2秒間隔の割り込み処理ルーチン内で、numQueueから5個
の数値をまとめて取り出し、文字に変換してからlcdQueueバッファに格納
します。

タスク2では、タスク1からのメッセージは1行目に表示し、割り込み処理からの
メッセージは2行目に表示するようにします。
したがって、このプログラムの実行結果では、液晶表示器に下図のように表示
されます。
1行目の数値は5ずつカウントアップし、2行目は0から7までの数値が5個ずつ
連続した数値としてサイクリックに繰り返し表示されます。



下記リストがこの例題のmain関数部です。
宣言部で2つのキューのハンドルを定義しておき、main関数の中で
2つのキューの生成をしています。



割り込み処理とタスク関数部が下記リストになります。
割り込み処理ルーチン内では、xQueueReceiveFromISRでキューから取り出し
xQueueSendToBackFromISRでキューに送信しています。
タスク1では5個の数値をnumQueueに5回送信し、最後のCount1値をlcdQueue
に送信しています。
タスク2では単純にlcdQueueからメッセージを取り出し、タスク1からか
割り込みからかを区別してから液晶表示器に表示しています。



この例題では、1秒間隔でタスク1を動作させるため、vTaskDelayUntil()関数を
使っていますので、コンフィギュレーションのFreeRTOSConfig.hファイルの中で
下記のように設定変更する必要があります。

#define INCLUDE_vTaskDelayUntil   1
#define INCLUDE_vTaskDelay     0



★★★ この例題のプロジェクトのダウンロード(sample5)





目次に戻る