沼津高専 電子制御工学科
RT-Linuxおよびsoftware調査報告書
MIRS0103-TECH-0007
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2001.12.13 山本・中村 鈴木 初版

目次

  1. 目的
  2. RT-Linuxについて
  3. 提供されるAPI関数
  4. ソフトウェア構成
  5. プログラム解説

1,目的

MIRSにて使用されるRT-Linuxについて調査し,レビューの際に使用する資料とする。

2,RT-Linuxについて

  1. RT-Linuxとは
    厳格な時間管理下で処理を行う、ハードウェアリアルタイムOSである。 また、Linuxを1つのタスクとし、これを最低限の優先度で処理する。
  2. 全体の構成図

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のアンロック

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

4,ソフトウェア構成

ソフトウェアは下記のタスク・ドライバから構成される。 これらのタスク・ドライバと行動制御プログラムとのデータのやり取りにはFIFOが使われる。

5,プログラム解説

RT-Linuxでは、リアルタイム処理を行うプログラムをモジュールと呼ぶ。 モジュールはカーネルの機能を拡張する部品であり、 必ずinit_moduleとcleanup_moduleという関数を持っている。

例として、Hello Worldと表示するだけのモジュールのソースを示す。
/*  何もしない module の作成    hello_module.c  */
#define MODULE
#include 

int  init_module(void)    {  printk("Hello world !\n");  return 0; }
void cleanup_module(void) {  printk("Goodbye world \n"); }
モジュールを使用するのに必要なコマンドを以下に示す。
insmodモジュールを組みこむ
lsmod実行中のモジュールの表示
rmmod実行中のモジュールの削除
※ただし、これらのコマンドはスーパーユーザでしか実行できない。

insmodにより、モジュール内の関数、init_moduleが実行される。 デバイスドライバの場合には、ここでデバイスの登録や I/Oポートの設定、メモリの確保などを行う。 init_moduleは、普通は戻値として 0 を返し、 モジュールの初期化処理に失敗した場合は 負の値を返すことになっている。 逆に、rmmodによりモジュールがカーネルから削除されると、関数cleanup_moduleが呼び出される。

モジュール作成上の注意点


関連文書
BROKEN's Advanced Vehicle Laboratory
http://homepage1.nifty.com/BROKEN/index.htm