Next: 7 ヒューマノイドのプログラミング
Up: 6 ART-Linuxのインストールとプログラミング
Previous: 6.1 ART-Linuxのインストール
RT-Linuxでは実時間タスクがカーネルモジュールとして実現されていたが,
ART-LinuxはRT-Linuxと異なりユーザ空間で実現する.
そのための新しいシステムコールが追加されている.
- int art_enter(art_prio_t prio, art_flags_t flags
- , int usec)非実時間プロセスがart_enterシステムコールを呼び出すと, 実時間タスクに
変換される.引数は,実時間タスクの優先度,実時間タスクの実行を制御す
るフラグ,周期実行の周期をとなる.
- int art_wait(void)
- 周期的実時間タスクがart_waitシステムコー
ルを呼び出すと,次の周期実行開始時刻まで待機する.
- int art_exit(void)
- 実時間タスクがart_exitシステムコールを呼び出すと, 非実時間プロセス
に変換される.
ART-Linuxによるメロディプログラムの例を以下に示す.
art_enter()で周期タスクを宣言し,for(;;)文の中で art_wait()を利用して
周期実行を実現している.
#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>
#include <linux/art_task.h>
#define TRUE 1
#define KBD_PORT 0x61
#define SPK_BIT 0x02
int main(int argc, char *argv[])
{
int temp, hz, i;
if (argc != 2 || (hz = atoi(argv[1])) == 0) {
fprintf(stderr, "usage: %s hz\n", argv[0]);
exit(1);
}
if (ioperm(KBD_PORT, 1, TRUE) == -1) {
perror("ioperm");
exit(1);
}
if (art_enter(ART_PRIO_MAX, ART_TASK_PERIODIC,
500000 / hz) == -1) {
perror("art_enter");
exit(1);
}
for (i = 0; i < hz * 5; ++i) {
if (art_wait() == -1) {
perror("art_wait");
exit(1);
}
temp = inb(KBD_PORT);
temp = (i & 1) ? temp | SPK_BIT : temp & ~SPK_BIT;
outb(temp, KBD_PORT);
}
if (art_exit() == -1) {
perror("art_exit");
exit(1);
}
return 0;
}
詳細は以下のURLを参照.
http://www.movingeye.co.jp/~you1/art-linux/rlc
200101/text.html
generated through LaTeX2HTML. M.Inaba 平成18年5月6日