PosixRealTimeExecutionContextの利用方法
2009/12/08 初版　清水正晴＠fuRo

・はじめに
PosixRealTimeExecutionContextに含まれているソースコードの一部は、
産業総合研究所が開発しているOpenRTM-aistのオフィシャルページ
http://www.is.aist.go.jp/rt/OpenRTM-aist/html/TIPS2FARTLinuxE794A8E5AE9FE8A18CE382B3E383B3E38386E382ADE382B9E38388.html
に公開されているソースコードを参考に作成されました。
ソースコードを公開していただいている産業技術総合研究所、及び開発者の方々に感謝いたします。

PosixRealTimeExecutionContextは、Posixライブラリと標準Linuxリアルタイム機能を利用した
リアルタイム対応実行コンテキストです。
rtc.confのexec_cxt.periodic.rate:で指定した周期で精度よいRTCの周期実行が可能になります。

・前提条件
標準LinuxにLinuxメインラインで開発が進められているCONFIG_PREEMPT_RT patchを適用したLinuxカーネルが
必要です。
詳細については、
http://rt.wiki.kernel.org/index.php/Main_Page
をご覧ください。

Ubuntuを利用しているのであれば
README-RealTimeKernel.txt
をご覧ください。

動作確認は、
OpenRTM-aist 0.4.2
Ubuntu 7.10, 8.04
で行っております。

・利用方法

PosixRealTimeExectionContextを利用するには2通りあります

１）プログラム中にハードコーディングして、RTC*Compを実行する方法
と
２）rtcdを用いて動的にロードする方法
です

１）プログラム中にハードコーディングして、RTC*Compを実行する方法

 *Comp.cpp の先頭部分で

 int main (int argc, char** argv)
 {
   RTC::Manager* manager;

   manager->init(argc, argv);

   // これを追加
   manager->load("./PosixRealTimeExecutionContext.so", "PosixRealTimeExecutionContextInit");
   // Set module initialization proceduer
   // This procedure will be invoked in activateManager() function.
   manager->setModuleInitProc(MyModuleInit);

上記変更を加えてコンパイルし実行ファイルRTC*Compを作成

rtc.confに下記の行を追加

exec_cxt.periodic.type: PosixRealTimeExecutionContext
exec_cxt.periodic.rate: 200
manager.modules.load_path: ./
manager.modules.abs_path_allowed: yes


./RTC*Comp -f rtc.conf
-f rtc.confは読み込む設定ファイルがrtc.confの場合は省略できますが
それ以外のファイル名の場合は-f rtc.conf.rtのように指定してやる必要があります

実行コンテキストハードコーディングした実行ファイル*Compはリアルタイム処理をするようにコンパイルしているため
ソースを変更しない限りリアルタイム処理を止めることができません。
これをコンパイルなしにリアルタイム処理の有効化・無効化を選択できる方法が
２）のrtcdを利用する方法です

２）rtcdを用いて動的にロードする方法
rtcdというマネージャのみ実行するデーモンがあります

これはrtc.confに記述する

manager.modules.abs_path_allowed: yes
manager.modules.load_path: ./ 
manager.modules.preload: RTC*.so, PosixRealTimeExecutionContext.so
manager.components.precreate: RTC*

の設定から
manager.modules.preload:
で設定したモジュールをロードして
manager.components.precreate:
で設定したコンポーネントを生成してくれます

さらに
manager.modules.preload: RTC*.so, PosixRealTimeExecutionContext.so
のようにPosixRealTimeExecutionContext.soを追加し
exec_cxt.periodic.type: PosixRealTimeExecutionContext
を指定するとリアルタイム処理を有効化してくれます
逆にコメントアウトするとリアルタイム処理を無効化ができます

上記のようにリアルタイム処理を行うモジュールも選択的にロードできます
manager.modules.preload: RTC*.so, PosixRealTimeExecutionContext.so
とか
manager.modules.preload: RTC_OmniWheel.so, PosixRealTimeExecutionContext.so.Nomlock
ですね

PosixRealTimeExecutionContext.so.Nomlock
は、mlockall関数を省略したバージョンでこちらを選択するとルートになって実行する
必要がなくなります（sudoの必要なし）

rtc.confのサンプルを
１）rtc.conf.sample.comp
２）rtc.conf.sample.rtcd
として示します。


