next up previous
Next: 7 ヒューマノイドのプログラミング Up: 6 ART-Linuxのインストールとプログラミング Previous: 6.1 ART-Linuxのインストール

6.2 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日