リアルタイムインタープリタの処理速度(リアルタイム制御能力)

Portwell社シングルボードコンピュータ(SBC)ROBO-8777VG2Aのリアルタイム制御処理能力を評価してみる。

Core 2 Duo 1.8GHz

2GBメモリ

プライムモーション社のWindowsリアルタイムIO制御環境「MOS Bench(モスベンチ)」を使用する。

MOS Benchをインストールして、MOS言語で以下のプログラムを書く。

処理時間を評価するために、一定処理ごとに、リアルタイムタイマーを読む。タイマーを読むプログラムの中心は、以下の部分。

a=0;
StartTimer(1);
while( a<1001) {
val[a] =  GetTimerValue(1) * 10000000; // 100ns単位
a = a+1;
}

変数aを初期化、タイマー1スタート、その後、タイマー1をリードして、10,000,000倍して、配列val[a]に代入する。これを1001回繰り返す。

タイマーを読んでから、次のタイマーを読むまで

・タイマーを読む

・その値を10,000,000倍する

・その値を配列に代入する

・変数をインクリメントする(+1する)

・変数aが1001未満か判断する

5個の処理がある。この処理にかかる時間が計測できる。

命令としては

・配列val[a]代入文

・変数a代入文

・whlie文

の3つである。

このままでは、配列val[a]の中の値がわからない。その値を読み取るために、次のプログラムを追加する。

a=0;
Printf2( ” %ld  %ld\n”, a , val[a]);
while( a<1000) {
a = a+1;
Printf2( ” %ld  %ld\n”, a , val[a]-val[a-1]);
Sleep(10);
}

最初のPrintf2文で、最初のタイマー値val[0]を標準出力に出力する。

次のPrintf2文で、タイマー値の差分値を1000回、標準出力に出力する。

プライムモーション社のWindowsリアルタイムIO制御環境「MOS Bench(モスベンチ)」では、標準出力は、環境の中の画面に出力される。それとともに、#StdOutLog.txtというファイルにも出力される。

実際の出力ファイルは「stdoutlog.txt」をダウンロード

これをエクセルで開いて、グラフにすると、

Photo

が得られる。平均値は3.2usである。3命令の処理時間が3.2usなので、Core 2 Duo 1.8GHzのリアルタイムインタープリタの

処理速度は、1命令を1usで実行

していることがわかる。

途中で3回ある120usは、「MOS Bench(モスベンチ)」のシステムが1ms割り込み処理を行い、プライムモーション社のモーションカード、CONTEC社のDINカード、DOUTカード、ADカード、DAカード、COMカードのFIFOバッファのサンプリングを行っている処理が計測時間に加わっているので、長くなっている。

上記の平均値3.2usは、3回の120usも含んでいる。

エクセルのファイルは「081213.xls」をダウンロード

プライムモーション社のWindowsリアルタイムIO制御環境「MOS Bench(モスベンチ)」を使うと、

見た目、使い勝手、はWindowsのそのまま環境で、

1usに1命令実行可能な

リアルタイムIO制御コントローラ

が知らないうちに同時に裏側で動いているという状態になる。

しかも、IO制御プログラマーは、リアルタイムIOコントローラ動作中に実行プログラムを途中で止めたり、再開したり、おもてのWindowsアプリケーションから制御できる。ブレークポイント、変数モニタ機能、も当然付いている。加えて、IO制御している軸、IO、AD、DAの動作波形観測用リアルタイムサンプリングオシロ機能もついている。

本記事の処理時間測定のプログラムは、こちら

「time_10000.mos.c」をダウンロード

このプログラムの中に、

SetAutomaticSleep(10000);

という命令が入っている。これは、10,000行の間、Windowsの処理が入らないようにして、リアルタイム制御性を高めている。命令実行速度を評価したいために、わざわざ入れている。

MOS Bench(モスベンチ)のシステムのデフォルトは、10行ごと、Windowsの処理を許可するように

SetAutomaticSleep(10);

となっている。通常は、SetAutomaticSleep();命令を実行する必要がない。

なお、リアルタイム拡張ソフトウェアRTXの設定は、片方のCPUコアをRTXが占有する状態にしている。

Multi_processor