FC2ブログ

爪車

ART-Linuxでリアルタイム処理プログラミング

ART-Linuxを利用する環境か整ったので、リアルタイム処理プログラムの作成と実行です。

プログラムの作成と実行は

http://www.dh.aist.go.jp/jp/research/humanoid/ART-Linux/

ロボコンマガジン49号、HRP-2m Chorometで動かすロボットプログラミング 第1回 ARTLinuxを用いた実時間処理プログラミング

ロボコンマガジン53号、HRP-2m Chorometで動かすロボットプログラミング 第5回 実践! ART Linux


を参考にしています。

1.リアルタイム処理プログラムの作成
テストプログラムの作成です。テストプログラムはロボコンマガジン53号、第5回 実践! ART Linuxのサンプルプログラム(リスト1)を参考にしたものです。
このプログラムはリアルタイム処理として1秒ごとにビープ音を鳴らすプログラムです。
Ctrl+Cを押すか、ビープ音を10回鳴らしたら終了します。
実時間処理部分で時間のかかる処理をするなど、リアルタイム処理プログラムとしてはあまり適切ではないのですが、ART-Linuxの動作の確認ができると思います。

"art_test.c"

#include <stdio.h>
#include <signal.h>
#include "linux/art_task.h" // ART-Linuxのシステムコールが定義されてるヘッダ

#define PERIODIC_TIME 1000000 // 実行周期 μs

int exit_loop = 0;

// シグナル処理関数の定義
void sig_handler(int sig)
{
exit_loop = 1;
}

int main(void)
{
int i = 0;

if (art_enter(ART_PRIO_MAX, ART_TASK_PERIODIC, PERIODIC_TIME) != 0) {
perror("art_enter");
return -1;
}

// Ctrl+Cが押されたときに生成されるシグナルを補足する関数のセットアップ
(void) signal(SIGINT, sig_handler);

while (!exit_loop) {
art_wait();

puts("\a"); // ビープ音を鳴らす

i++;
if (i == 10) exit_loop = 1;
}

art_exit();

return 0;

}

リアルタイム処理プログラムに必要なことは
ART-Linuxのシステムコールが定義されてるヘッダのインクルード
#include "linux/art_task.h"
とART-Linuxのシステムコールの使用です。システムコールの詳細については、http://www.dh.aist.go.jp/jp/research/humanoid/ART-Linux/system_call.php、ロボコンマガジン49号、第1回 ARTLinuxを用いた実時間処理プログラミングを確認してください。
テストプログラムではart_enter,art_wait,art_exitの三つのシステムコールを使用しています。少なくともこの三つを使用すればリアルタイム処理が実現できます。
art_enterは非実時間プロセスを実時間タスクに変換します。
art_waitは周期的実時間タスクで呼び出されると、次の周期実行開始時刻まで実行を停止します。
art_exitは実時間タスクを非実時間プロセスに変換します。
プログラム中の
#define PERIODIC_TIME 1000000 // 実行周期 μs
で処理周期を定めています。単位はマイクロ秒です。一応1000の倍数で指定してください。
リアルタイム処理を終了する際は必ずart_exitを実行してください。また、周期的処理をするため、whileでループしていますが、無限ループには注意してください。

2.プログラムのコンパイル
Linuxでのプログラミングについては、書籍「ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道」がわかりやすいので、そちらを参考にしてください。
コンパイラはGCCを使います。プログラムのコンパイル時にart_syscalls.oをスタティックリンクします。
$gcc -Wall -o art_test art_test.c /usr/lib/art_syscalls.o
上記はUbuntu8.04の例です。環境によっては異なるかもしれません。

3.プログラムの実行
うまくコンパイルできたらプログラムを実行します。
$./art_test
プログラムが暴走して強制終了の可能性もありますので、他のファイルは保存しておいたほうがいいです。
うまくいけば1秒ごとにビープ音が鳴ります。Ctrl+Cを押すか、10回ビープ音を鳴らすと終了します。
もしかしたら1秒ごとにビープ音が鳴らず、タイミングがずれるかもしれませんが、たぶんputs("\a")の処理の問題だと思います。
プログラム中の#define PERIODIC_TIME 1000000の値をいろいろ変えてみてください。

以上でART-Linuxの簡単な動作確認は終わりです。ロボコンマガジン49,53の記事ではマルチスレッド処理にも触れられているので、是非そちらも参照してください。

余談ですが、Interface2009年10月号にUbuntu Linuxのリアルタイム拡張であるRealTime/Ubuntuについての記事がありました。いつかそちらのほうも試してみたいです。

« 二輪倒立振子ロボット 6 角度センサ|Top|ART-Linuxのインストール »

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://tsumeguruma.blog46.fc2.com/tb.php/61-0c3f67b5

Top

HOME

tsumehashi

Author:tsumehashi
FC2ブログへようこそ!

09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -