[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 メーリングリストの案内