RTAI入門(4)何が出来るか?その4
この記事からの続きです。
RTAIで何が出来るか?の「IPC」編その2です。
- メールボックス
についてまとめます。
なお、RTAI入門(2)のタスクのリアルタイム化は、全ての基礎となっています。ですから、ここだけはご一読をお勧めします。
メールボックス
概要
RTAIには、リアルタイムに動作する「タスク」というものがあります。これは要するにスレッドがリアルタイム化したようなものです。
この「タスク」間でデータをやりとりするための機構の1つに「メールボックス」というものがあります。
図1 メールボックスに対して、データを入れたり、データを取り出したりできる
メールボックスには次のような特徴があります
- メールボックスはFIFOのようなもの。何バイトのバッファがあるかは、メールボックス作成時に決定できる。
- メールボックスは、複数スレッド間、および複数プロセス間で、共有できる
- タスクは、メールボックスに対してデータを送信できる
(送ったデータを、だれがどう取り出すかについては、送信タスクは関与しない) - タスクは、メールボックスからデータを取り出す事ができる
(どこの誰が送ってきたタスクなのか?については、受信タスクは関与しない)
要するに、RTAIが用意してくれたFIFOです。複数プロセス間でも共有できるので、複数のアプリを協調動作させる際にも有効です。
データのやりとり
メールボックスは、そこに何バイト入っているか?だけが重要です。それが何回にわけて送られたものなのか?は認識しません。
図2 最初に1バイト。次に2バイトを、メールボックスに送信した
たとえば、からっぽのメールボックスに対して、まず1バイト送信したとしましょう。次に2バイト送信しました。
さて問題です。メールボックスには何バイト入っているでしょう?答えは簡単、3バイトです。
こんどはメールボックスからデータを取り出すとします。このとき、メールボックスにある3バイトが、1回で一気に送られたものなのか、2回に分けて送られたものなのか、それとも3回なのか、それは受け取り側は認識しません。
ですから、このメールボックスから3バイト欲しい!とリクエストすると、ごそっと一気に3バイト受け取れます。
あるいは、このメールボックスから1バイト欲しい!とリクエストすると、1バイト受け取れます。それを3回繰り返して計3バイト取得する事も可能です。
このように送信の「区切り」のようなものは見えなくなります。ですから、そういった区切りはアプリケーション側で何とかする必要があります。
メッセージのように区切りを意識しつつ、メールボックスのように複数データをわーっと扱えるような機構があると便利なのですが・・・残念ながらRTAIには用意されていません。
メールボックスとタスク挙動
メッセージの場合、
- メッセージが送信できるまでブロックする
- メッセージが受信できるまでブロックする
という風に振る舞います。(メッセージの振る舞いについては、こちらを参照してください)
メールボックスも同様で、基本的には
- メールボックスに、全データを送信できるまでブロックする
- メールボックスから、全データを取り出せるまでブロックする
という仕組みになっています。
しかし、これだけではありません。メッセージと同様、
- 送信(受信)できなければ、すぐに諦める
- 送信(受信)できなければ、一定時間だけブロックして、それでもダメなら諦める
というようなAPIも用意されています。更に、
- 送れる分だけ送って(受け取れる分だけ受信して)、それ以上は諦める
というモードもあります。
メッセージとメールボックスの違いを整理
メッセージとメールボックスの違いを整理すると、次のようになります。
実体
- メッセージは、あるタスクから別のタスクへと、直接データを渡します。
- メールボックスは、タスクとは完全に独立した存在です。そのため、まず始めにメールボックスを作成する必要があります
データ形式
- メッセージは、たとえば60バイト送信したら、受け手も60バイト受信します
- メールボックスは、たとえば60バイト書いたとして、受け手が何バイト受信するかは分かりません。受け手が読みたいバイト数だけ読みに行きます
データ受け渡し方式
- メッセージを送信しようとすると、受け手が読んでくれるまで先に進めません
- メールボックスに書き込んだらすぐに先に進めます。メールボックスから誰がいつ読みだすかは、書き手は関与しません
次回
次回はIPC編その3として、共有メモリ、FIFO、セマフォについて書きます