lib/RTAItask.hh
00001 // RTAIタスク&実時間マルチスレッド生成・破棄クラス
00002 // 2011/02/14 Yuki YOKOKURA
00003 //
00004 // RTAIタスクと複数個の実時間スレッドを生成・破棄する
00005 //
00006 // Copyright (C) 2011 Yuki YOKOKURA
00007 // This program is free software;
00008 // you can redistribute it and/or modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 3 of the License, or any later version.
00010 // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
00011 // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00012 // See the GNU General Public License for more details <http://www.gnu.org/licenses/>.
00013 // Besides, you can negotiate about other options of licenses instead of GPL.
00014 // If you would like to get other licenses, please contact us<yuki@katsura.sd.keio.ac.jp>.
00015 
00016 #ifndef RTAITASK
00017 #define RTAITASK
00018 
00019 #include <rtai_lxrt.h>
00020 #include <string.h>
00021 #include "RTAIthread.hh"
00022 
00023 
00024 typedef void (**FuncPtrs)(void*);       // 関数ポインタ配列キャスト用
00025 
00026 namespace ARCS {        // ARCS名前空間
00027         // 動作状態の定義
00028         enum TaskState {
00029                 RTID_TASK_NORMAL,       // 正常
00030                 RTID_TASK_ERR,          // タスク内エラー検出
00031                 RTID_THRD_ERR           // スレッド内エラー検出
00032         };
00033         
00034         class RTAItask {
00035                 private:
00036                         RTAItask(const RTAItask&);                                      // コピーコンストラクタ使用禁止
00037                         const RTAItask& operator=(const RTAItask&);     // 代入演算子使用禁止
00038                         
00039                         static const unsigned int       MAX_THREAD                      = 128;  // スレッド最大数 (動的追従はあとで)
00040                         static const int                        STACK_SIZE                      = 4096; // RTAIスレッドスタックサイズ
00041                         static const unsigned long      THREAD_EXIT_WAIT        = 50000;// [us] スレッド終了処理待機時間
00042                         
00043                         const unsigned int NumOfThread;                 // 動作させるスレッドの数
00044                         const unsigned long MinPeriodicTime;    // [ns] 一番速いスレッドの制御周期
00045                         volatile int StateFlag;                                 // 動作状態フラグ
00046                         RT_TASK *RTtaskID;                                              // 実時間タスク識別子
00047                         RTAIthread* pRTthread[MAX_THREAD];              // 実時間スレッド 0 ~ MAX_THREAD へのポインタ
00048                         
00049                 public:
00050                         // コンストラクタ
00051                         RTAItask(
00052                                 const unsigned int ThreadNum,                   // 動作させるスレッドの数
00053                                 void (** const PeriodicFuncs)(void*),   // 制御用周期実行関数群への関数ポインタ
00054                                 void* const FuncArgs,                                   // 関数ポインタ引数
00055                                 const unsigned long *PeriodicTime               // 制御周期
00056                         );
00057                         ~RTAItask();                                    // デストラクタ
00058                         void Start(void);                               // 実時間スレッドを開始させる関数
00059                         void Stop(void);                                // 実時間スレッドを終了させる関数
00060                         void SendState(const int State);// 動作状態を書き込む State;所望の動作状態
00061                         int  ReadState(void);                   // 動作状態を読み出す 戻り値;現在の動作状態
00062                         // 開始からの経過時間と計算に要した消費時間を取得する関数
00063                         void GetTimeValue(volatile double *Time, volatile long *PeriodicTime, volatile long *ComputationTime);
00064         };
00065 }
00066 
00067 #endif
00068 
 All Classes Files