典型的なリアルタイムシステムの1つとして、1msといった周期で計測や制御を行うというものがあります。 この周期の正確性を保つことが汎用OSでは難しいため、このような用途には一般にマイコンのタイマ割り込みやリアルタイムOSが利用されます。
ここでは、HIPCのリアルタイムシステムへの応用例として、マイコン上の周期タスクのパラメータをパソコンから変更するサンプルを紹介します。このサンプルではリアルタイム環境としてArduino Uno上でDuinOSを利用しますが、まずはパソコンで擬似的に実行してみましょう。
サンプルはexamples/rtsimpleにあります。 以下のように、cdでこのディレクトリに移動し、makeでビルド、make runで実行します。 (ソースコードの参照だけならこちらからも可能です。)
cd ../rtsimple/
make
make run
コンフィギュレーションファイル(hipccfg/CFGrt.yml)では、 unsigned char型でledという名前のメンバーを持つ構造体STRUprmを定義しています。
クライアント(client/client_rt.c)は、ledを1にしたあと0にしているだけです。 1にしたあとsleep()等を挟まずすぐに0にする指示を出していますが、 サーバーは1回の制御周期(1秒)では1度までしかパラメータを変更しない実装になっているため、 LEDは1周期、つまり1秒間点灯します。 このことは、hipcdumpの出力から"L led:"の行のタイムスタンプと値(0か1か)を見ることでも確認できます。
前のLEDのサンプルと異なり、サーバーにはリアルタイムタスクとパラメータバンク(pbank)が登場しています。
POSIX環境ではserver/main_posix.cで、pthreadとusleepを使って、1秒周期のリアルタイムタスクを模擬しています。パソコンから新しいパラメータが来ているときにhipcPbankSwitchAccept()を呼ぶと、pbank内でページが交換されます。そして、新しいパラメータを含むページをhipcPbankGetReadOnlyPage()で得ています。
server/hipcsvs_rt.cは、前のLEDのサンプルと比較すると、構造体変数を直接操作していたのが、pbankへの操作へと変わっていますが、大まかな処理の流れはそのままで変わっていません。
まだHIPCのサンプルをArduinoの実機で実行する環境を整えていなければ、こちらを参考にしてarduino-1.0.5と必要ならドライバをインストールし、さらにarduino-1.0.5へHIPCライブラリをインストールして下さい。
DuinOSはarduino-1.6.4では動作しませんので、ここではarduino-1.0.5を利用します。
これら2つのZIPファイルを適当な場所に解凍します。
基本的には https://github.com/DuinOS/DuinOS のReadme.txtに従いますが、 うまく行かなかったところを一部変更して日本語訳したものを以下に示します。
arduino.DuinOSフォルダを、arduino-1.0.5-r2の\hardware\arduino\coresフォルダにコピーする。\hardware\arduino\boards.txtの名前を適当に変更する。hardwareフォルダの中のboards.txtを\hardware\arduinoフォルダにコピーする。\lib\keywords.txtの名前を適当に変更する。libフォルダの中のkeywords.txtを\libフォルダにコピーする。MoreComplexBlinkingフォルダを\examplesフォルダにコピーする。Arduino Unoボードを用意して下さい。
Arduinoのスケッチをビルドするためにrtsimpleという名前のフォルダを作ります。 先ほどパソコンのPOSIX環境でリアルタイムサンプルをmakeしたディレクトリからファイルをコピーします。 examples/rtsimpleのhipccfgディレクトリとserverディレクトリから以下のファイルを新しく作ったrtsimpleフォルダにコピーして下さい。
Arduino IDEを立ち上げて、rtsimple.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