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

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

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

  • Net_RPC
  • タスク、メールボックスの名前

についてまとめます。

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

また、NetRPCとはリアルタイムタスク、メッセージ、メールボックスなどをリモートに扱うための物です。そもそもこれらが何なのか?については、過去の記事をご覧ください。

リアルタイムタスクについての記事

メッセージについての記事

メールボックスについての記事

「タスク、メールボックスの名前」については、ローカル、リモート関係なく全てに通用する概念です。かなり細かい話になるため、これまで避けてきました。しかし、次回からは具体的なRTAI用コードに入ります。ですから、ここで説明しておきたいと思います。

Net_RPC

何が出来るか?

NetRPCとはリアルタイムタスク、メッセージ、メールボックスなどをリモートに扱うための物です。

ここで、リモートの話に行く前に、まずはローカルな話を整理しましょう。

howto_rtai_06_00図1 ローカルでのタスク、メールボックス操作

リアルタイムタスクに対しては、メッセージ送信を行う事が出来ます。また、タスクを一時停止したり実行再開したりする事も出来ます。

メールボックスに対しては、データの読み書きを行う事が出来ます。

これまでの記事でご紹介してきたのは、こういったタスクやメールボックスに対する操作でした。

さて、ここからがRTAIの特徴的な所です。実は、RTAIではタスクやメールボックスが同じマシンになくても操作可能です

howto_rtai_06_01図2 リモートでのタスク、メールボックス操作

このように、「PCその1」から、ネットワークでつながった「PCその2」の中に居るタスクやらメールボックスやらを制御する事が出来ます。

そうする事で、たとえばPCその2でリアルタイム測定したデータを、メールボックス経由でPCその1に吸い上げる、といった事が可能になります。

ただしローカルの場合と違い、やりとりできるデータ量には制限があります。たとえば、メッセージ送信の場合には1500バイトが上限となっています。

どういう風に実現するのか?

RTAIのマニュアルには、node, port, address などの言葉が出てきます。分かってしまえば簡単な仕組みですが、名前からはちょっと中身が想像しづらいと思います。

そこで、これらの概念的な所を整理しておきます。具体的なサンプルコードは、次回以降の記事にて1つ1つご説明します。

howto_rtai_06_02図3 node, port, address

さて、PCその1から、PCその2にあるタスクに、メッセージを送りたいとしましょう。

・node取得

まず、PCその2がどこにあるのか?が分からないといけません。そこで、node という値を使います。

unsigned long node = 0; // IPアドレス

このunsigned long型の変数には、IPアドレスを inet_aton でバイナリ変換した値を入れておきます。まぁ、要するにIPアドレスです。

・port取得

PCその2が特定できたところで、次はRTAIへのアクセスハンドルを取得します。

たとえば、C言語でもってファイルを開く時、ファイルハンドルを取得しますよね?

あれとおなじイメージです。nodeがファイル名だとしたら、portはファイルハンドルです。

この port は long 型の変数で、RTAIのAPIを使用して取得します。

・アドレス取得

PCその2へ接続するために、node, port を取得したとしましょう。いよいよ次は、タスクやメールボックスに接続します。タスク名、メールボックス名を指定してやる(※1)と、これらを制御するためのアドレスというものをくれます。これは、RT_TASK構造体や、MBX構造体など、RTAIでタスクやメールボックスを表すための構造体へのポインタになっています。

(※1)タスク名、メールボックス名については、今回の記事の「タスク、メールボックスの名前」を参照して下さい。

・メッセージ送信!

メッセージを送信するには、node, port, アドレス を指定します。

RT_send( node, port, アドレス, メッセージ内容 )

というRTAIのAPIを使用する事で、リモートに対してメッセージ送信が可能です。

このように、node, port, アドレス を1セットにして、リモートマシンにおけるタスクやメールボックスを指定します。

そうすることで、リモートマシンにおけるタスクやメールボックスを、あたかもローカルのものと同じように扱う事が出来ます。

タスク、メールボックスの名前

ID

これまで触れてきませんでしたが、実はタスク、メールボックスにはIDが付いています。

howto_rtai_06_03図4 タスク、メールボックスにはIDがついている

このIDは、unsigned long 型の整数です。もっと正確に言うと、32ビット符号なし整数です。

このIDは、タスクを生成したり、メールボックスを生成したりする際にユーザーが指定できます。

ファイルを作成する時にファイル名を指定できるように、タスクやメールボックスを作成する際にIDを指定するわけです。

そして、タスクやメールボックスをアクセスする際は、このIDをベースにします。具体的には、まずこのIDを元に、RT_TASK構造体やMBX構造体へのアドレスを取得します。

ここで、RT_TASK構造体はタスク、MBX構造体はメールボックスを表します。そしてこれらの構造体を元に、タスクへメッセージを送ったりメールボックスにデータを送ったりします。

名前

さて、タスクやメールボックスをIDで管理しているという事が分かりました。しかし、たんなる数値というのもは人間には分かりにくいものです。

そこでRTAIでは、便利なユーティリティ関数が用意されています。

nam2num関数:6文字のテキスト文字列 → unsigned long 型の値
num2nam関数:unsigned long型の値 → 6文字のテキスト文字列

これらの関数を使用することで、IDを分かりやすい形で利用できます。

たとえば、ID=1、と決める代わりに、ID=”MYTASK1″ と指定できます。この方が、分かりやすいですよね?

これらのユーティリティ関数は、本当にただ単純に文字列とunsigned long値とを変換するだけのものです。ですから、RTAI側から見れば全てIDで管理されている事に変わりはありません。

あくまで、人間に分かりやすいようにIDと6文字列との相互変換関数が用意されているよ、というだけの話です。

余談ですが、こういうユーティリティ関数を書きなさい、という入社試験なんかがあっても面白そうですね。単純な計算だけですから、トリックもなにも必要ありませんし。

注意:nam2num関数に7文字以上の文字列を渡した場合、7文字目以降は無視されます。

RTAIのメーリングリストを見ていると、たまーにウッカリさんが7文字以上の文字列を渡してトラブルになっています。たとえば、nam2num(“MAILBOX1”)とnam2num(“MAILBOX2”)を作ったのに、なんかうまくうごかない!といったようなトラブルです。これらは両方とも、最初の6文字である MAILBO までしか認識されません。そのため、両方とも同じIDに変換されてしまうのです。

nam2numに7文字以上渡してもRTAI側からエラーが発生したりしませんので、使う側で気を付けておく必要があります。

次回

次回は祝日ですから、RTAIを一旦はなれます。そして、ノウハウの蓄積について普段思っている事を書いてみます。