MIRS0201-TECH-0001_RT-Linux

RT-Rinux調査報告書
MIRS0201-TECH-0001

改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2002.12.16 笹原 今村 初版

## RT-RINUX調査報告

## １．はじめに

今年度開発されるMIRSには、ISAバス仕様のI/Oボードが搭載される。それに従いMIRSのOSには、RT－LINUXが使用される。そのため各センサおよびPWMをRT-タスクモジュールおよびデバイスドライバで制御する必要がある。またLCDが使用されるため、これを制御するデバイスドライバも必要となる。

## ２．RT－LINUX

### ２．１　リアルタイム処理とは

制御システムなどでは、一定時間内に処理を確実に終了しなければならない場合があるがこのような実時間性を保証し、許容される時間内に処理の完了を保証する処理方式がリアルタイム処理である。

### ２．１　RTLinuxの概要

標準Linuxの動作環境を図１に、RTLinuxの動作環境を図２にそれぞれ示す。Real-Time Linux は、Linux OS と共存可能な リアルタイムOSである。 しかし、厳密な意味ではリアルタイムOSではなく、 RTLinuxが提供するのは スケジューラとプロセス間通信のみである。 RTLinuxは、仮想マシンをLinuxに提供し、 Linuxを優先順位の低い１つのリアルタイムプロセスとして実行することで、リアルタイム処理と従来のLinux OSの処理の共存を実現している。よってRTLinuxはユーザーインタフェースに優れアプリケーションソフトの豊富な汎用的OSと、高速でミッションクリティカルな処理に最適なハードウエア・リアルタイム性能を持つリアルタイムOSの２つのOS機能を利用することができるデュアルカーネルシステムであるといえる。
RTLinux環境（図２）では、リアルタイムタスクはRTLinuxのRTスケジューラーによってコントロールされ、LinuxはRTLinux上のタスクとして動作する。

## 3．API関数

たいがいの OS カーネルは、無数の関数を集めたライブラリであるといえる。
OS カーネルに含まれている関数は、呼び出し方が少々特殊なので、区別のためシステムコール (system call) と呼ぶ。最近では、API (Application Programming Interface) とも呼ばれる。使用されるAPIを以下に示す。

POSIXスタイルインターフェース関数

機能 API関数
スレッドの生成 Pthread_create
スレッドの終了 Pthread_exit
スレッドへのシグナル送信 Pthread_kill
スレッドＩＤの取得 Pthread_self
スレッドアトリビュートオブジェクトの初期化 Pthread_attr_init
スタックサイズ属性の取得 Pthread_attr_getstacksize
スタックサイズ属性の設定 Pthread_attr_setstacksize
スレッドのＣＰＵ明け渡し指 Pthread_yield
スケジューリング属性の変更 Pthread_setschedparam
スケジューリングプライオリティ属性の取得 Pthread_attr_getschedparam
スケジューリング属性の取得 Pthread_getschedparam
スケジューリングプライオリティ属性の設定 Pthread_attr_setschedparam
タイマー値の取得 Clock_gettime
タイマー値の設定 clock_settime
タイマー分解能の取得 clock_getres
スケジューリングポリシー毎のプライオリティの最大値の取得 sched_get_priority_max
スケジューリングポリシー毎のプライオリティの最小値の取得 sched_get_priority_min
Mutex属性オブジェクトのプロセス間共有設定の取得 pthread_mutexattr_getpshared(3)
Mutex属性オブジェクトのプロセス間共有設定の設定 pthread_mutexattr_setpshared(3)
Mutex属性オブジェクトの生成、初期化 pthread_mutexattr_init(3)
Mutex属性オブジェクトの破棄 pthread_mutexattr_destroy(3)
Mutexタイプ属性の設定 pthread_mutexattr_settype(3)
Mutexタイプ属性の取得 pthread_mutexattr_gettype(3)
Mutexの初期化 pthread_mutex_init(3)
Mutex破棄 pthread_mutex_destroy(3)
Mutexのロック pthread_mutex_lock(3)
Mutexのロック pthread_mutex_trylock(3)
Mutexのアンロック pthread_mutex_unlock(3)

非POSIXスタイル関数

機能 API関数
ＣＰＵ ＩＤのスレッド属性オブジェクトの設定 pthread_attr_setcpu_np
ＣＰＵ ＩＤのスレッド属性オブジェクトの取得 pthread_attr_getcpu_np
スレッドの周期実行の抑制(wait) pthread_wait_np
スレッドの削除 pthread_delete_np
スレッドの浮動小数・演算の使用許可 pthread_setfp_np
スレッドのリアルタイム実行条件を指示 pthread_make_periodic_np
スレッドをサスペンド pthread_suspend_np
サスペンド中のスレッドを再開 pthread_wakeup_np

表中に出てくる用語の解説

スレッド

- 複数のCPUを持つコンピュータにおいて、共有メモリを使用して並列計算を行うＯＳ機能。これにより、１つのプログラム(プロセス)の中で、複数のスレッドがアドレス空間を共有して、情報の交換を高速かつ効率的に行える。
- Mutex変数
- 複数のスレッドの同期を管理する方法として用いる。
- POSIX (the Portable Operating System Interface for Computer Environment)
- POSIXは、IEEE1003.1標準によって規定されたUNIXシステムのインターフェースである。PT-Linux
V2.xでは、POSIXスタイルのAPIを利用することになる。RT-Linux
V2.xでは、すべての関数がPOSIXスタイルで構成されているのではなく、RT-Linux独自のAPI関数も用意されており､POSIX+非POSIXのスタイルでリアルタイムプログラミングを行うことになる。

## ４．ソフトウェア構成

ソフトウェアは下記のタスク・ドライバから構成される。

超音波センサ(RT-task1)
赤外線センサ(driver1)
タッチセンサ(driver2)
白線ンサ(driver3)
ロータリーエンコーダ･PWM(RT-task2)
LCD(driver4)

これらのタスク・ドライバと行動制御プログラムとのデータ、コマンドのやりとりはFIFOによって行われる。このFIFO一つに対し一つの役割を持たせ必要な数だけ用意する。FIFO とは、“先に入ったものを、先に取り出す”という意味。デバイスファイルであるのでカーネル空間とユーザ空間の間のデータ転送に使われる

## ５．実行方法

### ユーザプロセス、モジュールの作成

モジュールとは、Linuxカーネルに機能を追加するためのものである。RTLinuxではリアルタイム処理のプログラムはモジュールの形で作成する。
モジュールの簡単な構成を以下に示す。

モジュールを組み込む時に呼び出される初期化処理(init_module)
モジュールを外す際に呼び出される終了処理(cleanup_module)
リアルタイムFIFOや割り込みの発生時のリアルタイムタスクの処理(my_handler)
リアルタイム処理する内容(任意のコールバック関数)

ユーザプロセスとは、リアルタイム性がないLinux上で処理を行うものである。

リアルタイムFIFOとの情報交換は通常のファイル操作とほぼ同様のやり方で行える
その他特に変わった点は無い。

### モジュールの操作

モジュールの組み込み insmod
モジュールの削除 rmmod
組み込み済みのモジュールの確認 lsmod

モジュールの組み込み、削除はスーパユーザのみ可能である。

### ユーザプロセスの実行

通常のLinuxでの使用と変わらない。