lib/RTAIthread.hh
00001 // RTAI実時間スレッド生成・破棄クラス
00002 // 2011/02/14 Yuki YOKOKURA
00003 //
00004 // RTAI実時間スレッドを生成・破棄する
00005 // 実際に計測された制御周期や計算消費時間も提供する
00006 //
00007 // Copyright (C) 2011 Yuki YOKOKURA
00008 // This program is free software;
00009 // you can redistribute it and/or modify it under the terms of the GNU General Public License
00010 // as published by the Free Software Foundation; either version 3 of the License, or any later version.
00011 // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
00012 // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00013 // See the GNU General Public License for more details <http://www.gnu.org/licenses/>.
00014 // Besides, you can negotiate about other options of licenses instead of GPL.
00015 // If you would like to get other licenses, please contact us<yuki@katsura.sd.keio.ac.jp>.
00016 
00017 #ifndef RTAITHREADING
00018 #define RTAITHREADING
00019 
00020 #include <stdio.h>
00021 #include <rtai_lxrt.h>
00022 #include <sys/io.h>
00023 
00024 
00025 namespace ARCS {        // ARCS名前空間
00026         // 動作状態の定義
00027         enum ThreadState {
00028                 RTID_ERROR,     // エラー検出
00029                 RTID_STOP,      // 停止状態
00030                 RTID_RUN,       // 動作中
00031                 RTID_EXCMPL     // 終了動作完了
00032         };
00033         
00034         class RTAIthread {
00035                 // RTAI実時間スレッド生成クラス
00036                 private:
00037                         RTAIthread(const RTAIthread&);                                  // コピーコンストラクタ使用禁止
00038                         const RTAIthread& operator=(const RTAIthread&); // 代入演算子使用禁止
00039                         static const int STACK_SIZE = 4096;     // スレッドスタックサイズ
00040                         volatile int StateFlag;         // 動作状態フラグ
00041                         const char *TaskName;           // 実時間スレッド名(6文字まで)
00042                         const unsigned long Ts;         // 制御周期
00043                         const int Priority;                     // 実時間スレッド優先順位
00044                         void (* const pRTfunc)(void*);  // 制御用実行関数へのポインタ
00045                         void* const pArg;                       // 関数ポインタの引数
00046                         long RealTimeThread_ID;         // 実時間スレッド識別子
00047                         unsigned long NowTime;          // 時刻 ( 稼働できる時間 = Ts*2^(sizeof(unsigned long)*8) = 100e-6*2^32 = 約119時間(例) ) 稼働時間を伸ばしたければ「unsigned long long」にする
00048                         long PeriodicTime;                      // 計測された実際の周期時間
00049                         long ComputationTime;           // 計算によって消費された時間 (つまり ComputationTime < PeriodicTime でなければならない)
00050                         static void RealTimeThread(RTAIthread *pParam); // 実時間スレッド
00051                         
00052                 public:
00053                         // コンストラクタ Name;スレッド名,Time;制御周期,Prio;優先順位,RTfunc;制御用実行関数(関数ポインタ)
00054                         RTAIthread(const char *Name, const unsigned long Time, const int Prio, void (* const RTfunc)(void*), void* const Arg);
00055                         ~RTAIthread();                          // デストラクタ
00056                         void SendState(const int State);        // 動作状態を書き込む State;所望の動作状態
00057                         int  ReadState(void);           // 動作状態を読み出す 戻り値;現在の動作状態
00058                         unsigned long GetTime(void);// 時刻を取得する関数
00059                         long GetSmplTime(void);         // 計測された実際のサンプリング時間を取得する関数
00060                         long GetCompTime(void);         // 計測された消費時間を取得する関数
00061         };
00062 }
00063 
00064 #endif
00065 
 All Classes Files