RTAI入門(4)何が出来るか?その4

この記事からの続きです。

RTAIで何が出来るか?の「IPC」編その2です。

  • メールボックス

についてまとめます。

なお、RTAI入門(2)のタスクのリアルタイム化は、全ての基礎となっています。ですから、ここだけはご一読をお勧めします。

メールボックス

概要

RTAIには、リアルタイムに動作する「タスク」というものがあります。これは要するにスレッドがリアルタイム化したようなものです。

この「タスク」間でデータをやりとりするための機構の1つに「メールボックス」というものがあります。

howto_rtai_04_00図1 メールボックスに対して、データを入れたり、データを取り出したりできる

メールボックスには次のような特徴があります

  • メールボックスはFIFOのようなもの。何バイトのバッファがあるかは、メールボックス作成時に決定できる。
  • メールボックスは、複数スレッド間、および複数プロセス間で、共有できる
  • タスクは、メールボックスに対してデータを送信できる
    (送ったデータを、だれがどう取り出すかについては、送信タスクは関与しない)
  • タスクは、メールボックスからデータを取り出す事ができる
    (どこの誰が送ってきたタスクなのか?については、受信タスクは関与しない)

要するに、RTAIが用意してくれたFIFOです。複数プロセス間でも共有できるので、複数のアプリを協調動作させる際にも有効です。

データのやりとり

メールボックスは、そこに何バイト入っているか?だけが重要です。それが何回にわけて送られたものなのか?は認識しません。

howto_rtai_04_01図2 最初に1バイト。次に2バイトを、メールボックスに送信した

たとえば、からっぽのメールボックスに対して、まず1バイト送信したとしましょう。次に2バイト送信しました。

さて問題です。メールボックスには何バイト入っているでしょう?答えは簡単、3バイトです。

こんどはメールボックスからデータを取り出すとします。このとき、メールボックスにある3バイトが、1回で一気に送られたものなのか、2回に分けて送られたものなのか、それとも3回なのか、それは受け取り側は認識しません。

ですから、このメールボックスから3バイト欲しい!とリクエストすると、ごそっと一気に3バイト受け取れます。

あるいは、このメールボックスから1バイト欲しい!とリクエストすると、1バイト受け取れます。それを3回繰り返して計3バイト取得する事も可能です。

このように送信の「区切り」のようなものは見えなくなります。ですから、そういった区切りはアプリケーション側で何とかする必要があります。

メッセージのように区切りを意識しつつ、メールボックスのように複数データをわーっと扱えるような機構があると便利なのですが・・・残念ながらRTAIには用意されていません。

メールボックスとタスク挙動

メッセージの場合、

  • メッセージが送信できるまでブロックする
  • メッセージが受信できるまでブロックする

という風に振る舞います。(メッセージの振る舞いについては、こちらを参照してください)

メールボックスも同様で、基本的には

  • メールボックスに、全データを送信できるまでブロックする
  • メールボックスから、全データを取り出せるまでブロックする

という仕組みになっています。

しかし、これだけではありません。メッセージと同様、

  • 送信(受信)できなければ、すぐに諦める
  • 送信(受信)できなければ、一定時間だけブロックして、それでもダメなら諦める

というようなAPIも用意されています。更に、

  • 送れる分だけ送って(受け取れる分だけ受信して)、それ以上は諦める

というモードもあります。

メッセージとメールボックスの違いを整理

メッセージとメールボックスの違いを整理すると、次のようになります。

実体

  • メッセージは、あるタスクから別のタスクへと、直接データを渡します。
  • メールボックスは、タスクとは完全に独立した存在です。そのため、まず始めにメールボックスを作成する必要があります

データ形式

  • メッセージは、たとえば60バイト送信したら、受け手も60バイト受信します
  • メールボックスは、たとえば60バイト書いたとして、受け手が何バイト受信するかは分かりません。受け手が読みたいバイト数だけ読みに行きます

データ受け渡し方式

  • メッセージを送信しようとすると、受け手が読んでくれるまで先に進めません
  • メールボックスに書き込んだらすぐに先に進めます。メールボックスから誰がいつ読みだすかは、書き手は関与しません

次回

次回はIPC編その3として、共有メモリ、FIFO、セマフォについて書きます