Advanced Robot Control System  5.1-REV.51SF170515
SFthread.hh
[詳解]
1 // 実時間スレッド生成・破棄クラス(SCHED_FIFO版)
2 // 2016/08/19 Yuki YOKOKURA
3 //
4 // 実時間スレッドを生成・破棄する
5 // 実際に計測された制御周期や計算消費時間も提供する
6 //
7 // Copyright (C) 2011-2016 Yuki YOKOKURA
8 // This program is free software;
9 // you can redistribute it and/or modify it under the terms of the GNU General Public License
10 // as published by the Free Software Foundation; either version 3 of the License, or any later version.
11 // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12 // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 // See the GNU General Public License for more details <http://www.gnu.org/licenses/>.
14 // In addition, you can negotiate about other options of licenses instead of GPL.
15 // If you would like to get other licenses, please contact us <yokokura(a)vos.nagaokaut.ac.jp>.
16 
17 #ifndef SFTHREADING
18 #define SFTHREADING
19 
20 #include <pthread.h>
21 #include <sys/time.h>
22 
23 typedef void (*SFfuncPtr)(void*); // 関数ポインタ定義
24 
25 namespace ARCS { // ARCS名前空間
26  class SFthread {
27  // 実時間スレッド生成・破棄クラス
28  public:
29  // 動作状態の定義
30  enum ThreadState {
31  SFID_ERROR, // エラー検出
32  SFID_START, // 開始
33  SFID_RUN, // 動作中
34  SFID_STOP, // 停止
35  SFID_EXCMPL // 終了動作完了
36  };
37  // コンストラクタ Time:制御周期,RTfunc:制御用実行関数,Arg:制御用実行関数の引数,CPUno:使用するCPUコアの番号
38  SFthread(const unsigned long Time, void (* const RTfunc)(void*), void* const Arg, int CPUno);
39  ~SFthread(); // デストラクタ
40  void Start(void); // スレッド実行を開始する関数
41  void Stop(void); // スレッド実行を停止する関数
42  void WaitStop(void) const; // スレッド実行が停止されるまで待機する関数
43  void SendState(const enum ThreadState State); // 動作状態を書き込む State;所望の動作状態
44  enum ThreadState ReadState(void) const; // 動作状態を読み出す 戻り値;現在の動作状態
45  double GetTime(void) const; // [s] 時刻を取得する関数
46  double GetSmplTime(void); // [s] 計測された実際のサンプリング時間を取得する関数
47  double GetCompTime(void); // [s] 計測された消費時間を取得する関数
48  double GetMaxTime(void); // [s] 計測された実際のサンプリング時間の最大値を取得する関数
49  double GetMinTime(void); // [s] 計測された実際のサンプリング時間の最小値を取得する関数
50 
51  private:
52  static const unsigned int WAIT_TIME = 1000; // [μs] スレッド開始&終了待機ループのポーリング周期
53  static const long ONE_SEC_IN_NANO = 1000000000; // [ns] 1秒をナノ秒で表すと
54 
55  SFthread(const SFthread&); // コピーコンストラクタ使用禁止
56  const SFthread& operator=(const SFthread&); // 代入演算子使用禁止
57  volatile enum ThreadState StateFlag; // 動作状態フラグ
58  const unsigned long Ts; // 制御周期
59  void (* const pRTfunc)(void*); // 制御用実行関数へのポインタ
60  void* const pRTarg; // 関数ポインタの引数
61  unsigned long LoopCount; // 制御ループカウンタ ( 稼働できる時間 = Ts*2^(sizeof(unsigned long)*8) = 100e-6*2^32 = 約119時間(例) ) 稼働時間を伸ばしたければ「unsigned long long」にする
62  timespec ActPeriodicTime; // 計測された実際の周期時間
63  timespec ComputationTime; // 計算によって消費された時間 (つまり ComputationTime < ActPeriodicTime でなければならない)
64  static void RealTimeThread(SFthread *p); // 実時間スレッド
65  pthread_t ThreadID; // スレッド識別子
66  struct sched_param ThreadParam; // スレッドパラメータ
67 
68  static timespec timespec_add(timespec a, timespec b); // timespec構造体用の時刻を加算する関数 a + b
69  static timespec timespec_sub(timespec a, timespec b); // timespec構造体用の時刻を減算する関数 a - b
70  static bool timespec_lessthaneq(timespec a, timespec b);// timespec構造体用の時刻を比較する関数 a <= b
71  static timespec nsec_to_timespec(unsigned long time); // ナノ秒からtimespec構造体へ変換する関数
72  static double timespec_to_sec(timespec time); // timespec構造体から秒へ変換する関数
73  };
74 }
75 
76 #endif
77 
void WaitStop(void) const
Definition: SFthread.cc:125
double GetMaxTime(void)
Definition: SFthread.cc:160
void(* SFfuncPtr)(void *)
Definition: SFthread.hh:23
pthread_t ThreadID
Definition: SFthread.hh:65
Definition: SFthread.hh:26
~SFthread()
Definition: SFthread.cc:52
void SendState(const enum ThreadState State)
Definition: SFthread.cc:133
Definition: SFthread.hh:31
double GetTime(void) const
Definition: SFthread.cc:145
Definition: SFthread.hh:35
Definition: SFthread.hh:33
timespec ActPeriodicTime
Definition: SFthread.hh:62
static void RealTimeThread(SFthread *p)
Definition: SFthread.cc:59
double GetCompTime(void)
Definition: SFthread.cc:155
const SFthread & operator=(const SFthread &)
void *const pRTarg
Definition: SFthread.hh:60
static const unsigned int WAIT_TIME
Definition: SFthread.hh:52
double GetMinTime(void)
Definition: SFthread.cc:170
const unsigned long Ts
Definition: SFthread.hh:58
enum ThreadState ReadState(void) const
Definition: SFthread.cc:139
static timespec nsec_to_timespec(unsigned long time)
Definition: SFthread.cc:223
Definition: ControlFunctions.hh:17
static timespec timespec_sub(timespec a, timespec b)
Definition: SFthread.cc:193
void Stop(void)
Definition: SFthread.cc:120
unsigned long LoopCount
Definition: SFthread.hh:61
Definition: SFthread.hh:34
static double timespec_to_sec(timespec time)
Definition: SFthread.cc:231
SFthread(const unsigned long Time, void(*const RTfunc)(void *), void *const Arg, int CPUno)
Definition: SFthread.cc:25
ThreadState
Definition: SFthread.hh:30
Definition: SFthread.hh:32
enum ThreadState StateFlag
Definition: SFthread.hh:57
double GetSmplTime(void)
Definition: SFthread.cc:150
void(*const pRTfunc)(void *)
Definition: SFthread.hh:59
static bool timespec_lessthaneq(timespec a, timespec b)
Definition: SFthread.cc:206
timespec ComputationTime
Definition: SFthread.hh:63
static const long ONE_SEC_IN_NANO
Definition: SFthread.hh:53
void Start(void)
Definition: SFthread.cc:115
struct sched_param ThreadParam
Definition: SFthread.hh:66
static timespec timespec_add(timespec a, timespec b)
Definition: SFthread.cc:180