ここでは、単発的のパラメータ変更より複雑な、パソコンと連続的にデータを送受信して動くリアルタイムシステムのサンプルを取り上げると共に、これまで取り上げてこなかったキューとCASTメッセージのHIPCの機能について簡単な紹介を行います。
このサンプルでは、マイコンはパソコンから送られてきたパターンに基づいてLEDを光らせます。そして、実際にどのようにLEDを光らせたのかのログをパソコンへ送ります。ログはマイコンの内部時計時刻とその時刻のLED出力値を含むため、後から途切れなくパターンを再生できたか、どのくらいの精度で再生出来たかを確認できます。
LEDの制御周期の初期値は、目視で動作を確認できるように1秒と長くなっています。一度に送るデータ数などを調整して、安定した再生を維持しつつどこまで制御周期を短く出来るかに挑戦しても良いかも知れません。
サンプルはexamples/rtcomplexにあります。 以下のように、cd
でこのディレクトリに移動し、make
でビルド、make run
で実行します。 (ソースコードの参照だけならこちらからも可能です。)
cd ../rtcomplex/
make
make run
コンフィギュレーションファイル(hipccfg/CFGrt.yml)では、構造体型を2つ定義しています。
STRUprm
は、LEDの点灯パターンを配列として持っています。配列長よりも短いパターンを表せるように、パターン長を示す整数値もあります。STRUlog
は、マイコンからパソコンにCASTメッセージで送られるログです。tick
は内部時計時刻、output
はその時刻のLED出力値です。クライアント(client/client_rt.c)は、長さの異なるパターンを3回サーバーに送っています。 最大長のパターンを続けて、最後に端数のパターンを送る形になっていないのは、サンプルとしていくつめのパターンが送られているか、分かりやすくするためです。 最後に長さ0のパターンを送っているのは、パターン再生の終了を待つためです。
CASTメッセージを受信するために、hipcSetHandler()
で、構造体型STRUlog
に対するハンドラーとしてhandler_log()
を登録しています。handler_log()
はlog.txtにログを記録します。
リアルタイムタスクでは、変数cnt
が残りのパターン数に対応しています。 cnt
が0の時は、hipcPbankSwitchAccept()
を呼びます。次のパターンが届いていると1が返されるので、cnt
にパターン数を代入します。続く処理では、cnt
が1以上だと、LED出力値を一つ取り出して、実際にLEDに反映させると共に(pthreadの疑似タスクではfprintf()
を呼んでいます。)、出力値と内部時計時刻をキューにプッシュしています。
キューにプッシュされた値は、メインタスクがポップして、CASTメッセージに乗せてクライアントへ送ります。この処理をするのがsend_cast()
でこの関数は2カ所から呼ばれています。1つは、PUTの処理途中で、リアルタイムタスクが前のパターンを処理して新しいパターンを受け入れるのをメインタスクが待っているところです。もう1つは、クライアントからのメッセージを待っているときで、hipcUsocReadReady()
を呼んで、メッセージが来ていないことがわかると、send_cast()
が呼ばれます。 hipcUsocReadReady()
は、main_posix.cとrtcomplex.inoでそれぞれの環境に合わせて定義されています。
PUTメッセージの処理は、大筋は前のサンプルrtsimpleと同様ですが、リアルタイムタスクが新しいパターンを受け入れるのを待っている間に別の処理(send_cast()
)をするために、前のサンプルとは異なるpbankの関数を利用しています。 PUTメッセージで送られてきたデータは、リアルタイムタスクに渡される前にメインタスクでチェックされます。前のサンプルとはデータの中身が変わったので、チェックするコードも変更されています。
ちなみに、このサンプルではキューにプッシュされたデータはCASTメッセージでクライアントへ送信されていますが、CASTメッセージではなくGETメッセージを使うことも出来ます。例えば、GETメッセージを受け取ったときにキューをポップして、返答メッセージにデータを乗せるような実装が可能です。
Arduino Unoボードを用意して下さい。
Arduinoのスケッチをビルドするためにrtcomplexという名前のフォルダを作ります。 先ほどパソコンのPOSIX環境でリアルタイムサンプルをmake
したディレクトリからファイルをコピーします。 examples/rtcomplexのhipccfgディレクトリとserverディレクトリから以下のファイルを新しく作ったrtcomplexフォルダにコピーして下さい。
Arduino IDEを立ち上げて、rtcomplex.inoを開きます。 スケッチをArduino Unoへ書き込んで下さい。
先ほどパソコンのPOSIX環境でリアルタイムサンプルをmake run
したディレクトリに移動して、以下のコマンドを実行します。(ttyS2
は適切なデバイス名に変更して下さい。)
ruby ../../utilities/hipcdump 'socat /dev/ttyS2,raw,b9600,echo=0 STDIO' 'sleep 3; client/client'
クライアントプログラムが終了したらCtrl+Cで終了します。
通信がうまく行かない場合は、こちらを参考に、まずはシリアルモニタやsocatから通信できることを確認して下さい。
Last modified: 2015/07/27 08:00:59 +09:00