沼津高専 電子制御工学科
MIRS0203技術調査
ソフトウェア
MIRS0203-TECH-0012
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2002.12.12 片桐 小山 初版

目次

  1. ソフトウェアの動作環境
  2. RT-Linuxとは
  3. RT-Linuxの処理の流れ
  4. RT-Linuxの構造
  5. ソフトウェア構成例  
  6. MIRSでのRT-Linuxの使用理由

  1. ソフトウェアの動作環境

    ハードウェア

    CPU ボード i486 133MHz, Memory 16MB, SVGA chip, 10M Ethernet, ISA bus
    記憶装置 Flush memory 64MB (IDE ディスク互換)
    FPGA ボード 標準ゲート数 10,000, RAMビット数:6,144, ユーザI/O数:134, ISA bus

    オペレーティングシステム

    RT-Linux Ver 2.3 (Linux kernel 2.2.14)

    ここでは、オペレーティングシステムのRT-Linuxについての調査を報告する。
    ソフトウェアは当然ハードウェアの制限に準じたものを作る。

  2. RT-Linuxとは

     RT-Linuxは、Linuxの機能にリアルタイム処理をする機能を付け加えたものである。

    2.1 リアルタイム処理

     実時間処理。他のデバイスからの入力信号や、プログラムからの要求に対して、即座に(リアルタイムに)これを処理する方式。制御システムなどでは、一定時間内に処理を確実に終了しなければならない場合があるがこのような実時間性を保証し、許容される時間内に処理の完了を保証する処理方式がリアルタイム処理である。

    2.2 RT-LINUXのスケジューリング

     リアルタイムカーネルは、リアルタイムプロセスとLinuxカーネルを対象にしたスケジューリングを行う。このときリアルタイムプロセス(タスク)の優先度のほうがLinuxカーネルよりも高く、リアルタイムプロセスの優先度は任意に決めることができる。 Linuxでは、スケジューリング間隔が10ms程度であるが、PC/AT機の内蔵タイマICにより1μs程度の間隔になっている。このためLinuxでは、ハードウェア割り込みを受け付けてISR(インタラプトサービスルーチン)を呼び出すまでに600μsまたは20msぐらいかかるが、RT-Linuxではこれを15μs程度の短縮している。 つまり、リアルタイムカーネルがCPU割り込み制御の主導権を握り、スケジューラも兼ねることによって、時間要素をLinuxカーネルに依存しないで、自身で制御できるようにしている。


    図1 全体の構成図例
    2.3 リアルタイムタスクのプログラミング
    • RT-Linuxのリアルタイムタスクにおける動作の基本は、IRQ0のタイマー割込を用いた周期的起動である。起動の開始時刻と周期は任意に指定できる。タスクからはシステムコールは使用できないが、I/Oポートへの入出力を行うことはできるので、一定時間ごとにI/Oをポーリングして必要な処理を行うと行ったタイプの処理が、最も基本的なものとなる。
    • リアルタイムタスクは、Linuxプロセスとの間でFIFO(First-In, First-Outスタック。リングバッファとも呼ばれる)を用いてデータをやりとりすることができる。FIFOはLinux側ではデバイスドライバとしてあらかじめ登録され、プロセス内ではファイルとしてopen/closeし、read/writeにより入出力を行う。またプロセスではselectにより状態遷移を待つことによりプロセスとの同期を取ることができる。FIFOにはリアルタイムカーネルで動作するハンドラーをアタッチすることもできる。ハンドラーはread/writeが完了した時点でコールされるので、これもプロセスとタスクの同期に使用することができる。プロセスからwriteされるFIFOにハンドラーをアタッチすることにより、プロセスからタスクに容易にコマンドを送って処理させることができる。
    • リアルタイムタスクはモジュールとして実現され、insmodコマンドにより登録、rmmodコマンドにより削除される。登録後タスクにに割周期等を指定して実際に起動するためには、Linuxプロセスから指令を送らねばならない。このためには、上記のようにプロセスからFIFOにコマンドデータを出力し、それにアタッチされたハンドラーで起動処理を行えばよい。
    • FIFOはリアルタイムタスクとLinuxプロセスとの間のデータ転送のみに使用でき、タスクどうしでは使用できない。割込関係が単純な場合にはユーザーの責任で使用することはできるが、危険である。Cの外部変数を通じてタスク間でデータのやりとりをすることも、割込関係が単純であれば可能であるが、一般的には危険である。タスク間データ転送にセマフォと呼ばれるメカニズムがサーバパーティによって開発されているようであるが、現在は未調査である。
    • タイマー以外のハードウェア割込も利用できるが、リアルタイムカーネル内部では、システムコールが使えないので、既存のデバイスドライバは使えない。このためバスボードなどに関わる割込処理プログラムはリアルタイムカーネル専用として新たに作成しなければならない。
    • コンソールやディスクの入出力などLinuxカーネルで使用する割込は、リアルタイムカーネルが要求する割込の処理が割込許可をした時点か処理が終了した時点で、Linuxカーネルに渡される。このため通常のように使用することができるが、いったんRT-Linux用に書き換えねばならないので、バイナリコードのみで供給されているデバイスドライバは使用できなくなる。


  3. RT-Linuxの処理の流れ


    RT-Linuxの処理は以下のような流れに基づいて行われる。
    赤で囲まれた部分がRTLinuxによって拡張される部分
    緑で囲まれた部分がユーザーが作成する(提供される)部分



    図2 処理の流れ

  4. RT-Linuxの構造

    1. RT-Linux基本用語

      1. POSIX…UNIXシステムのインターフェース。RT-Linux v2.3では全てのAPI関数がPOSIXスタイルで 構成されているのではなく、POSIX+非POSIX(RT-Linux独自)のスタイルでプログラミングを行う。
      2. API関数…RT-Linuxで用意されている関数
      3. API…Applocation Programing Interfaceの略。OSとOS上で稼働するインターフェイス規定
      4. スレッド…複数のCPUを持つコンピュータシステム上で、共有メモリを使用して 並列計算を行うOS機能。スレッドプログラミングを行うことで、1つのプログラム(プロセス) の中で、複数のスレッドがアドレス空間を共有して、情報の交換を高速で効率的に行うことができる。
      5. FIFO…リアルタイムタスクとLinuxプロセス間の情報交換機能。(First In First Out)

    2. リアルタイムカーネルモジュール

      Linuxでリアルタイム処理を実現するために、RT-Linux V2.3では、次のカーネルモジュールが供給されている。
      カーネルモジュール
      カーネル内容
      rtl_schedPOSIXインターフェースとRT-Linux V1.xで供給されている APIの双方をサポートする優先順位スケジューラ。
      rtl_timeプロセッサのクロックを制御し、ハンドラのクロックに接続するインターフェースを 提供する。
      rtl_posixioデバイスドライバに対して、POSIXスタイルのopen/read/writeインターフェースを サポートする。
      rtl_fifoリアルタイムタスクとLinuxプロセス間の、データのread/writeインターフェースを提供する。

       RT-Linux V2.x用に開発されたリアルタイムプログラムを実行するためには、あらかじめこれらのカーネルモジュールをカーネルに組み込んでおく必要がある。
       カーネルモジュールの組み込み方法は、シェルスクリプトを使う。(ひとつひとつ組み込むこともできる)

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

      • メモリに関して
        モジュールはカーネル空間で動作する。 カーネル空間でもポインタを用いてvmallocやkmallocという関数により、 メモリを確保することが可能である。しかし、callocのように中身を初期化してくれるわけではないので、 プログラマ自身の手で確実に初期化を行うこと。
        また、外部変数はstaticと宣言しておかないと、 メモリを待避させたり戻したりしているうちに、 変数の中身が書き変わってしまう危険性がある。 外部変数を使わないに越したことはないが、使う場合はstaticを使用すること。
      • FIFOに関して
        FIFOは構造体を渡すことができるが、ポインタを渡すことができない。 したがって、配列は構造体のメンバになることができない。 配列は、原理的にはポインタと同じだからである。 こういうときは多少冗長でも、配列の数だけメンバ変数を用意することになる。
        また、送るデータが少ないときは、DATA_FIFOのバッファを少なくする必要がある。 バッファが大きくあいていると、 スレッドから送られてくるデータに一定の遅れが出てしまうからである。
      • その他
        一般に、割り込み処理やカーネル空間では浮動小数点演算は使用しないことになっている。 これは浮動小数点演算コプロセッサ(FPU)のレジスタが明示的に指定してやらない限り待避されないからである。
        RT-moduleプログラムを書くときは、 関数pthread_setfp_npを用いて明示的に浮動小数点演算を使用すること宣言しなければならない。


  5. ソフトウェア構成例

       全体の構成図例は図1の通り。
       ソフトウェアは下記のタスク・ドライバから構成される。  
      • 超音波センサ(RT-task1)
      • 赤外線センサ(driver1)
      • タッチセンサ(driver2)
      • 白線ンサ(driver3)
      • ロータリーエンコーダ・PWM(RT-task2)
      • LCD(driver4)

       これらのタスク・ドライバと行動制御プログラムとのデータ、コマンドのやりとりはFIFOによって行われる。このFIFO一つに対し一つの役割を持たせ必要な数だけ用意する。具体的に下記の表に示す。

      FIFOの役割

      FIFO番号
      役割
      FIFO1
      超音波センサ番号選択用
      FIFO2
      超音波による測定距離データ、エラー値格納用
      FIFO3
      ロータリーエンコーダのカウント値書込用
      FIFO4
      PWMへの速度データの受取用
      FIFO5
      RE,PWMへのSTART、STOP等の各種指令やタスクの優先度、実行周期の受取用

      各タスク・ドライバの機能

      • 超音波センサ(RT-task1)
           行動制御プログラムからコマンド(センサ選択番号)がFIFO1に書き込まれてから超音波が送信される。
           超音波センサを選択した時の時刻と、割込みがはいった時の時刻のデータから距離に換算し、FIFO2に書き込む。
           ただし、一秒たっても割り込みが入らない場合はタスク1(タイムアウトタスク)が起動し、エラー値をFIFO2に書き込んでタイムアウトとする。

      • 赤外線センサ(driver1)
           赤外線センサタスクの機能は、割り込みが発生したとき、他の割り込みをマスクし、データの保存を行いその割り込み信号をリセットした後、通常動作に戻ることである。

      • タッチセンサ(driver2)
           タッチセンサタスクの機能は、タッチセンサが反応する度にこのタスクが起動し、タッチセンサの状態を保存することである。

      • 白線センサ(driver3)
           白線センサタスクの機能は、割り込みが発生したとき、他の割り込みをマスクし、データの保存を行いその割り込み信号をリセットした後、通常動作に戻ることである。

      • ロータリーエンコーダ・PWM(RT-task2)
           ロータリーエンコーダタスクの機能は、一定時間ごとにロータリーエンコーダの値を読み込んで、そこからx,y座標と姿勢角θを計算しCPUにデータを送ることである。
           PWMタスクの機能は、CPUから受け取ったduty比のデータをPWM信号に変換してモーターへ送ることである。

      • LCD(driver3)
           LCDドライバは、各センサ・ロータリーエンコーダ・PWMの情報やシステムの状態を表示することを目的とする。


  6. MIRSでRT-Linuxの使用理由

     MIRSでは超音波センサ、PWM、ロータリーエンコーダを制御するためにRTタスクモジュールを使っている。これらの制御は、必ず何秒ごとに計測をするという、リアルタイム性が求められている。(カウンタ制御など)  だからCPUのスケジュールがいつ回ってくるかわからないLinux上ではなく、リアルタイムに割り込みが可能なRT-Linuxが必要である。

[用語解説補足]プロセス、スレッド、タスク、ジョブについて


関連文書
RT-Linux.org Home Page
http://www.rtlinux.org
BROKEN's Advanced Vehicle Laboratory
http://homepage1.nifty.com/BROKEN/index.htm