Previous: 3.12. タスクのモニタ |
Up: マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法 |
Next: 4.1. キューへの追加(後ろへの追加・待ち時間なし) |
キューは先入れ先出し式のデータ構造のことです。キューにデータを保管すると、データ構造の先頭から後方に向かって順番にデータを格納していきます。キューからデータを取り出すときも、先頭から後方に向かって順番にデータを取り出します。以下のように、データの格納と取り出しがどのような順番で行われたとしても、データは、キューに入れたときと同じ順番で取り出されます。
①初期状態
|
|
キュー |
|
|
|
|
空 |
|
|
②データ:7を入れる
|
|
キュー |
|
|
7 |
→ |
7 |
|
|
③データ:3を入れる
|
|
キュー |
|
|
3 |
→ |
3 |
|
|
|
|
7 |
|
|
④データ:4を入れる
|
|
キュー |
|
|
4 |
→ |
4 |
|
|
|
|
3 |
|
|
|
|
7 |
|
|
⑤データ取りだし:7が取り出される
|
|
キュー |
|
|
|
|
4 |
|
|
|
|
3 |
|
|
|
|
7 |
→ |
7 |
⑥データ:8を入れる
|
|
キュー |
|
|
8 |
→ |
8 |
|
|
|
|
4 |
|
|
|
|
3 |
|
|
⑦データ取りだし:3が取り出される
|
|
キュー |
|
|
|
|
8 |
|
|
|
|
4 |
|
|
|
|
3 |
→ |
3 |
RTOSでは、タスク間の通信のためにキューがよく利用されます。
例えば、先述のマウスロボットで、シリアル通信、距離センサ、操作ボタンの状態に応じてモータを制御したいとします。シリアル通信、距離センサ、操作ボタンのそれぞれのデータ・状態の取得は、それぞれ別の操作用タスクに行わせます。シリアル通信はデータが送信されてきたとき、距離センサは距離が一定数値以下になったとき、操作ボタンはボタンが押されたときに、イベントが発生したと見なして、それぞれモータに対して制御を行わせます。そのため、それぞれの操作用タスクからどのようなタイミング、どのような順番、どのようなデータが送られてくるかはわかりません。もっともモータ制御用のタスクには、各操作用タスクでイベントが発生した順番に処理させたいとします。このようなときに、各操作用タスクからの指令を、一つのキューにデータとして格納し、モータ制御用タスクにはこのキューからデータを取り出させるようにします。
7 |
シリアル |
前進 |
モータ制御用タスクは受け取った順(1から7にむけて)処理する |
6 |
ボタン |
後進 |
|
5 |
ボタン |
前進 |
|
4 |
距離センサ |
左回転 |
|
3 |
シリアル |
前進 |
|
2 |
シリアル |
右回転 |
|
1 |
ボタン |
停止 |
このようにキューを利用すれば、複数のタスクからあるタスクに対してメッセージを送ることができることになります。送信されたメッセージは送信の順に処理されることが保証されます。
グローバル変数を利用してタスク間でデータを受け渡しすることはできますが、複数のデータを送信できるようにする、データが送られてきたことを検知する、データが送られてきた順番に処理できるようにしようと思うと結構大変で、結局自分で「キュー」と同じ仕組みを組み上げることになります。
FreeRTOSには最初からキューが機能として備わっており、関数を経由して利用することができます。以下、利用方法を見てみましょう。
Previous: 3.12. タスクのモニタ |
Up: マイコン徹底入門:RTOS編:フリーのリアルタイムOS活用法 |
Next: 4.1. キューへの追加(後ろへの追加・待ち時間なし) |