RTAI入門(6)何が出来るか?その6
この記事からの続きです。
RTAIで何が出来るか?の「IPC」編その4です。
- Net_RPC
- タスク、メールボックスの名前
についてまとめます。
なお、RTAI入門(2)のタスクのリアルタイム化は、全ての基礎となっています。ですから、ここだけはご一読をお勧めします。
また、NetRPCとはリアルタイムタスク、メッセージ、メールボックスなどをリモートに扱うための物です。そもそもこれらが何なのか?については、過去の記事をご覧ください。
「タスク、メールボックスの名前」については、ローカル、リモート関係なく全てに通用する概念です。かなり細かい話になるため、これまで避けてきました。しかし、次回からは具体的なRTAI用コードに入ります。ですから、ここで説明しておきたいと思います。
Net_RPC
何が出来るか?
NetRPCとはリアルタイムタスク、メッセージ、メールボックスなどをリモートに扱うための物です。
ここで、リモートの話に行く前に、まずはローカルな話を整理しましょう。
図1 ローカルでのタスク、メールボックス操作
リアルタイムタスクに対しては、メッセージ送信を行う事が出来ます。また、タスクを一時停止したり実行再開したりする事も出来ます。
メールボックスに対しては、データの読み書きを行う事が出来ます。
これまでの記事でご紹介してきたのは、こういったタスクやメールボックスに対する操作でした。
さて、ここからがRTAIの特徴的な所です。実は、RTAIではタスクやメールボックスが同じマシンになくても操作可能です。
図2 リモートでのタスク、メールボックス操作
このように、「PCその1」から、ネットワークでつながった「PCその2」の中に居るタスクやらメールボックスやらを制御する事が出来ます。
そうする事で、たとえばPCその2でリアルタイム測定したデータを、メールボックス経由でPCその1に吸い上げる、といった事が可能になります。
ただしローカルの場合と違い、やりとりできるデータ量には制限があります。たとえば、メッセージ送信の場合には1500バイトが上限となっています。
どういう風に実現するのか?
RTAIのマニュアルには、node, port, address などの言葉が出てきます。分かってしまえば簡単な仕組みですが、名前からはちょっと中身が想像しづらいと思います。
そこで、これらの概念的な所を整理しておきます。具体的なサンプルコードは、次回以降の記事にて1つ1つご説明します。
図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が付いています。
図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を一旦はなれます。そして、ノウハウの蓄積について普段思っている事を書いてみます。