複雑なリアルタイムシステムの例

ここでは、単発的のパラメータ変更より複雑な、パソコンと連続的にデータを送受信して動くリアルタイムシステムのサンプルを取り上げると共に、これまで取り上げてこなかったキューとCASTメッセージのHIPCの機能について簡単な紹介を行います。

このサンプルでは、マイコンはパソコンから送られてきたパターンに基づいてLEDを光らせます。そして、実際にどのようにLEDを光らせたのかのログをパソコンへ送ります。ログはマイコンの内部時計時刻とその時刻のLED出力値を含むため、後から途切れなくパターンを再生できたか、どのくらいの精度で再生出来たかを確認できます。

LEDの制御周期の初期値は、目視で動作を確認できるように1秒と長くなっています。一度に送るデータ数などを調整して、安定した再生を維持しつつどこまで制御周期を短く出来るかに挑戦しても良いかも知れません。

パソコン上での実行

サンプルはexamples/rtcomplexにあります。 以下のように、cdでこのディレクトリに移動し、makeでビルド、make runで実行します。 (ソースコードの参照だけならこちらからも可能です。)

cd ../rtcomplex/
make
make run

サンプルの簡単な説明

コンフィギュレーション

コンフィギュレーションファイル(hipccfg/CFGrt.yml)では、構造体型を2つ定義しています。

クライアント

クライアント(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へ書き込んで下さい。

Arduinoとパソコン上のクライアントとの通信

先ほどパソコンのPOSIX環境でリアルタイムサンプルをmake runしたディレクトリに移動して、以下のコマンドを実行します。(ttyS2は適切なデバイス名に変更して下さい。)

ruby ../../utilities/hipcdump 'socat /dev/ttyS2,raw,b9600,echo=0 STDIO' 'sleep 3; client/client'

クライアントプログラムが終了したらCtrl+Cで終了します。

通信がうまく行かない場合は、こちらを参考に、まずはシリアルモニタやsocatから通信できることを確認して下さい。

前のページ


TOPページ

Last modified: 2015/07/27 08:00:59 +09:00