[openrtm-users 01141] RT-Preempt kernel 用 EC

Ando Noriaki n-ando @ aist.go.jp
2010年 2月 23日 (火) 18:51:12 JST


OpenRTM MLの皆さま

産総研 安藤です

通常のLinux kernelでリアルタイム実行を実現するためのパッチ (RT-Preempt patch)
を利用した実行コンテキストを作成してみましたので公開します。
すでに、fuRoの清水さんや、静岡大の清水さんなども作成されているものと
ほぼ同じものだと思います。問題がなさそうであれば本体に取り込みます。

Ubuntuではすでにパッチの当たったkernelもパッケージとして
用意されているようですので、簡単に導入できて便利ですね。
こちらでは、Ubuntu8.04 に以下のカーネルを入れてテストしてみました。

$ dpkg -l | grep rt |grep kernel
ii  linux-image-2.6.24-27-rt                   2.6.24-27.65
                                   Linux kernel image for version
2.6.24 on Ing

1 ms周期のループの1000回の計測結果は以下のような感じです。
(PCはPenM 2.0GHz + 2GB memoryのキューブタイプのPC)

max:    1.036 [ms]
min:    0.998 [ms]
mean:   1.00021 [ms]
stddev: 0.00380806 [ms]


必要に応じて rtc.conf で幾つかオプションを指定することができます。
・優先度 (1-99)
・スケジューリングポリシ (rr or fifo)
・ウエイト時間の調整 ([ns])

添付のソースには、時間計測用のサンプルコンポーネントも同梱されています。
OpenRTM-aistがインストールされた環境で

$ tar xvzf RTPreemptEC.tgz_
$ cd RTPreemptEC
$ make
$ cd RTSample
$ make
$ su
# ./RTSampleComp -f rtc.conf1

のように、コンパイルしてからrootになって実行してください。
RTSEでActivateすると、1000回ごとの計測結果を表示します。

以下、注意事項です。
・rootでしか実行できません
・logger.log_level は DEBUG以下にしてください
・logger.enable: NO でも logger.log_level: PARANOID だと
 デッドラインが守れなくなることがあります。

実装上の問題点や、バグ等ありましたらお知らせください。




以下、ソースのdoxygenドキュメントのコピーです。

   * @class RTPreemptEC
   * @brief RTPreemptEC クラス
   *
   * RT-Preempt kernel を利用した、リアルタイム実行コンテキストクラス。
   * この実行コンテキストは、RT-Preempt Patch を適用した Linux kernel、
   * 又は、これが組み込まれた Linux kernel によるリアルタイムスケジュー
   * リング機能を利用した実行コンテキストである。
   *
   * この実行コンテキストを利用するには、rtc.conf に下記のように記述する。
   *
   * <pre>
   * exec_cxt.periodic.type: RTPreemptEC
   * exec_cxt.periodic.rate: 1000
   * exec_cxt.priority: 50
   * manager.modules.load_path: <RTPreemptRC.so がある場所へのパス>
   * manager.modules.preload: RTPreemptEC.so
   * </pre>
   *
   * さらに、実行時には root 権限が必要となるので、root としてコンポー
   * ネントを実行する必要がある。
   *
   * このECに特有なオプションは以下のとおりである。
   *
   * - exec_cxt.periodic.priority: (default: 49) <br>
   * - exec_cxt.periodic.rtpreempt.priority: (default: 49)<br>
   *      スレッドの実行優先度 1 (最低) から 99 (最高)<br>
   *      Linux sched_setscheduler(2) を参照のこと。<br>
   *
   * - exec_cxt.periodic.rtpreempt.sched_policy:  (default: fifo)<br>
   *      スケジューリングのポリシ。<br>
   *      rr: ラウンドロビン, fifo: FIFO 型 (default: fifo)<br>
   *      Linux sched_setscheduler(2) を参照のこと。<br>
   *
   * - exec_cxt.periodic.rtpreempt.wait_offset: (default: -10000)<br>
   *      ウェイト時間のオフセット。[ns] 単位で指定する。 <br>
   *      1周期あたり数十 us 程度の定常的な遅れが発生する場合があるので、
   *      この値を調整することで、より正確な周期で実行させることができる。
   *
   * 注意事項: このECを比較的速い周期 (数十ms以上) で実行させる場合は、
   * ログレベルを DEBUG よりも下 (logger.log_level: NORMAL 等) に設定し
   * て実行する必要がある。また、logger.enable: NO に設定されていても、
   * logger.log_level: PARANOID に設定されている場合には、onExecute()
   * の実行に時間がかかり、デッドラインを守れなくなる可能性があるので注
   * 意が必要である。

-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒305-8568 つくば市梅園1-1-1 中央第2
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: RTPreemptEC.tgz_
型:         application/octet-stream
サイズ:     156618 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20100223/c583f060/attachment-0001.obj>


openrtm-users メーリングリストの案内