典型的なリアルタイムシステムの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