沼津高専 電子制御工学科
|
技術調査 報告
リアルタイム処理とRT-Linux
|
MIRS0104-TECH-0012
|
|
改訂記録 |
版数 |
作成日 |
作成者 |
承認 |
改訂内容 |
A01 |
2001.12.13 |
前原 |
森元 |
初版 |
調査報告:リアルタイム処理とRT-Linux
目次
- RTLinuxとは
- RTLinuxの処理の流れ
- 提供されるAPI関数
- 実行方法
1.RTLinuxとは
RTLinux(RealTimeLinux)は、Linuxが動作しているコンピュータにインストールすることで作成される、リアルタイム処理用のOSであり、Linuxの持つ各種のソフトウェアツールや開発環境、各種のアプリケーションソフトウェアをそのまま使用することができる。
しかし、RTLinuxは厳密な意味ではリアルタイムOSではなく、RTLinuxが提供するのはスケジューラとプロセス間通信のみである。RTLinuxは仮想マシンをLinuxに提供し、Linuxを優先順位の低い1つのリアルタイムプロセスとして実行することでリアルタイム処理と従来のLinuxの処理の共存を実現している。
リアルタイム処理
他のデバイスからの入力信号や、プログラムからの要求に対してほぼ同時とみなせる許容時間の範囲内で、コンピュータが何らかの処理を行う方式。
制御システム等では一定時間内に処理を確実に終了しなければならない場合があり、このようなリアルタイム性を保証し、許容される時間内に処理の完了を保証する。
リアルタイムOS
リアルタイムOSとは、リアルタイム処理を行うために使われるオペレーティングシステムであり、例えば割り込みイベントが発生してから1msec以内に必ず割り込み処理プログラムを起動したり、50msec以内に必ずタイマ割り込み処理プログラムを呼び出したり、ということが求められる。
もしこれが遅れてしまうと、データの取りこぼしやモータの停止が間に合わなかったりするなど、致命的な結果を招く可能性があるため、このようなリアルタイム処理を実現するために、ある一定時間以内のタスクの起動を保証するなどの機能を持っている。
2.RTLinuxの処理の流れ
3.提供されるAPI関数
POSIXスタイルインターフェイス関数
API関数 | 機能 |
Pthread_create | スレッドの生成 |
Pthread_exit | スレッドの終了 |
Pthread_kill | スレッドへのシグナル送信 |
Pthread_self | スレッドIDの取得 |
Pthread_attr_init | スレッドアトリビュートオブジェクトの初期化 |
Pthread_attr_getstacksize | スタックサイズ属性の取得 |
Pthread_attr_setstacksize | スタックサイズ属性の設定 |
Pthread_yield | スレッドのCPU明け渡し指示 |
Pthread_setschedparam | スケジューリング属性の変更 |
Pthread_attr_getschedparam | スケジューリングプライオリティ属性の取得 |
Pthread_getschedparam | スケジューリング属性の取得 |
Pthread_attr_setschedparam | スケジューリングプライオリティ属性の設定 |
clock_gettime | タイマー値の取得 |
clock_settime | タイマー値の設定 |
clock_getres | タイマー分解能の取得 |
sched_get_priority_max | スケジューリングポリシー毎のプライオリティの最大値の取得 |
sched_get_priority_min | スケジューリングポリシー毎のプライオリティの最小値の取得 |
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) | Mutexのアンロック |
*相互排除用のフラグをMutexという。
非POSIXスタイル関数
API関数 | 機能 |
pthread_attr_setcpu_np | CPU IDのスレッド属性オブジェクトの設定 |
pthread_attr_getcpu_np | CPU IDのスレッド属性オブジェクトの取得 |
pthread_wait_np | スレッドの周期実行の抑制(wait) |
pthread_delete_np | スレッドの削除 |
pthread_setfp_np | スレッドの浮動小数・演算の使用許可 |
pthread_make_periodic_np | スレッドのリアルタイム実行条件を指示 |
pthread_suspend_np | スレッドをサスペンド |
pthread_wakeup_np | サスペンド中のスレッドを再開 |
スレッド
スレッドとは、複数のCPUを持つコンピュータシステム上で共有メモリを使用して並列処理を行うOS機能である。スレッドプログラミングを行うことで、1つのプログラム(プロセス)の中で、複数のスレッドがアドレス空間を共有して、情報の交換を高速で効率的に行うことができる。RTLinux V2.xでは、スレッドの生成や終了、サスペンド、リアルタイム周期動作の設定を次のように行います。
- スレッドの生成
「pthread_create」をコールする。
- スレッドの終了
「pthread_exit」、「pthread_delete_np[非POSX API]」のコールで終了する。
- スレッドのサスペンド
「pthread_suspend_np」でサスペンドし、「pthread_wakeup_np」で再開する。
- スレッドの周期動作
「pthread_suspend_np」をコールする。周期動作の時間はナノ秒単位で指定する。
- スレッドのスケジューリングポリシー
スレッドはスケジューリングポリシーの示す値で、その動作時間、実行形態が決まる。スケジューリングポリシーには、
SCHED_FIFO
SCHED_RR
SCHED_OTHER
の3種類がある。スレッドが終了するか、ブロックするまでスレッドを実行する、SCHED_FIFOが多く使われる。
4.実行方法
ユーザプロセス、モジュールの作成
モジュールとは、Linuxカーネルに機能を追加するためのものである。RTLinuxではリアルタイム処理のプログラムはモジュールの形で作成する。
モジュールの簡単な構成を以下に示す。
- モジュールを組み込む時に呼び出される初期化処理(init_module)
- モジュールを外す際に呼び出される終了処理(cleanup_module)
- リアルタイムFIFOや割り込みの発生時のリアルタイムタスクの処理(my_handler)
- リアルタイム処理する内容(任意のコールバック関数)
ユーザプロセスとは、リアルタイム性がないLinux上で処理を行うものである。
- リアルタイムFIFOとの情報交換は通常のファイル操作とほぼ同様のやり方で行える
- その他特に変わった点は無い。
モジュールの操作
- モジュールの組み込み insmod
- モジュールの削除 rmmod
- 組み込み済みのモジュールの確認 lsmod
モジュールの組み込み、削除はスーパユーザのみ可能である。
ユーザプロセスの実行
通常のLinuxでの使用と変わらない。