ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
SFthread.hh
[詳解]
1
8//
9// Copyright (C) 2011-2024 Yokokura, Yuki
10// MIT License. For details, see the LICENSE file.
11
12#ifndef SFTHREADING
13#define SFTHREADING
14
15#include <sys/mman.h>
16#include <sys/time.h>
17#include <time.h>
18#include <unistd.h>
19#include <pthread.h>
20#include <functional>
21#include <cfenv>
22#include <cstdint>
23#include <cmath>
24#include <string>
25#include <fstream>
26#include <iostream>
27#include "CPUSettings.hh"
28#include "LinuxCommander.hh"
29
30// ARCS組込み用マクロ
31#ifdef ARCS_IN
32 // ARCSに組み込まれる場合
33 #include "ARCSassert.hh"
34 #include "ARCSeventlog.hh"
35#else
36 // ARCSに組み込まれない場合
37 #define arcs_assert(a) (assert(a))
38 #define PassedLog()
39 #define EventLog(a)
40 #define EventLogVar(a)
41#endif
42
43namespace ARCS { // ARCS名前空間
53
55enum class SFkernelparam : uint8_t {
56 NO_SETTINGS = 0b00000000,
57 CFS_DISABLED = 0b00000001,
58 PREEMPT_DYNFULL = 0b00000010
59};
60// ↑を併用する場合は、
61// static_cast<SFkernelparam>( static_cast<uint8_t>(SFkernelparam::CFS_DISABLED) | static_cast<uint8_t>(SFkernelparam::PREEMPT_DYNFULL) )
62// のようにキャストを駆使して論理和を取ること。
63
66template <SFalgorithm SFA = SFalgorithm::INSERT_ZEROSLEEP, SFkernelparam SFK = SFkernelparam::CFS_DISABLED>
67class SFthread {
68 public:
78
83 SFthread(const unsigned long PeriodTime, const std::function<bool(double,double,double)>& FuncObject, const int CPUno)
84 : SyncMutex(PTHREAD_MUTEX_INITIALIZER), // 同期用Mutex
85 SyncCond(PTHREAD_COND_INITIALIZER), // 同期用条件
86 StateFlag(SFID_STOP), // 動作状態フラグを「停止状態」に設定
87 Ts(PeriodTime), // [ns] 制御周期の格納
88 FuncObj(FuncObject), // 制御用実行関数への関数オブジェクトを格納
89 Time(), // 時刻の初期化
90 ActPeriodicTime(), // 周期時間の初期化
91 ComputationTime(), // 消費時間の初期化
92 ThreadID(0), // スレッド識別子の初期化
93 ThreadParam(), // スレッドパラメータ
94 MaxMemo(0), // サンプリング時間最大値計算用
95 MinMemo(PeriodTime*1e-9) // サンプリング時間最小値計算用
96 {
97 // 実時間スレッドの生成と優先度の設定
98 PassedLog();
99 if constexpr(SFA == SFalgorithm::INSERT_ZEROSLEEP){
100 EventLog("INSERT_ZEROSLEEP MODE.");
101 }else{
102 EventLog("WITHOUT_ZEROSLEEP MODE.");
103 }
104 SetKernelParameters(); // カーネルパラメータをリアルタイム用に設定
105 pthread_mutex_init(&SyncMutex, nullptr); // 同期用Mutexの初期化
106 pthread_cond_init(&SyncCond, nullptr); // 同期用条件の初期化
107 pthread_create(&ThreadID, NULL, (void*(*)(void*))RealTimeThread, this); // スレッド生成
108 CPUSettings::SetCPUandPolicy(ThreadID, CPUno, SCHED_FIFO); // CPUコアの割り当てとスケジューリングポリシーの設定
109 PassedLog();
110 }
111
115 SFthread(const unsigned long PeriodTime, const int CPUno)
116 : SyncMutex(PTHREAD_MUTEX_INITIALIZER), // 同期用Mutex
117 SyncCond(PTHREAD_COND_INITIALIZER), // 同期用条件
118 StateFlag(SFID_STOP), // 動作状態フラグを「停止状態」に設定
119 Ts(PeriodTime), // [ns] 制御周期の格納
120 FuncObj(), // 制御用実行関数への関数オブジェクトを格納
121 Time(), // 時刻の初期化
122 ActPeriodicTime(), // 周期時間の初期化
123 ComputationTime(), // 消費時間の初期化
124 ThreadID(0), // スレッド識別子の初期化
125 ThreadParam(), // スレッドパラメータ
126 MaxMemo(0), // サンプリング時間最大値計算用
127 MinMemo(PeriodTime*1e-9) // サンプリング時間最小値計算用
128 {
129 // 実時間スレッドの生成と優先度の設定
130 PassedLog();
131 if constexpr(SFA == SFalgorithm::INSERT_ZEROSLEEP){
132 EventLog("INSERT_ZEROSLEEP MODE.");
133 }else{
134 EventLog("WITHOUT_ZEROSLEEP MODE.");
135 }
136 SetKernelParameters(); // カーネルパラメータをリアルタイム用に設定
137 pthread_mutex_init(&SyncMutex, nullptr); // 同期用Mutexの初期化
138 pthread_cond_init(&SyncCond, nullptr); // 同期用条件の初期化
139 pthread_create(&ThreadID, NULL, (void*(*)(void*))RealTimeThread, this); // スレッド生成
140 CPUSettings::SetCPUandPolicy(ThreadID, CPUno, SCHED_FIFO); // CPUコアの割り当てとスケジューリングポリシーの設定
141 PassedLog();
142 }
143
147 : SyncMutex(r.SyncMutex), // 同期用Mutex
148 SyncCond(r.SyncCond), // 同期用条件
149 StateFlag(r.StateFlag), // 動作状態フラグ
150 Ts(r.Ts), // [ns] 制御周期
151 FuncObj(r.FuncObj), // 制御用実行関数への関数オブジェクト
152 Time(r.Time), // 時刻
153 ActPeriodicTime(r.ActPeriodicTime), // 周期時間
154 ComputationTime(r.ComputationTime), // 消費時間
155 ThreadID(r.ThreadID), // スレッド識別子
156 ThreadParam(r.ThreadParam), // スレッドパラメータ
157 MaxMemo(r.MaxMemo), // サンプリング時間最大値計算用
158 MinMemo(r.MinMemo) // サンプリング時間最小値計算用
159 {
160
161 }
162
165 PassedLog();
166 pthread_mutex_lock(&SyncMutex); // Mutexロック
167 StateFlag = SFID_DSTRCT; // スレッド破棄が指令されたことを知らせる
168 pthread_cond_broadcast(&SyncCond); // 実際の状態が更新されたことをリアルタイムスレッドに知らせる
169 pthread_mutex_unlock(&SyncMutex); // Mutexアンロック
170 pthread_join(ThreadID, nullptr); // 実時間スレッド終了待機
171 ResetKernelParameters(); // カーネルパラメータを元に戻す
172 PassedLog();
173 }
174
177 void SetRealtimeFunction(std::function<bool(double,double,double)> FuncObject){
178 FuncObj = FuncObject; // 関数オブジェクトをセット
179 }
180
182 void Start(void){
183 pthread_mutex_lock(&SyncMutex); // Mutexロック
184 StateFlag = SFID_START; // 開始が指令されたことを知らせる
185 pthread_cond_broadcast(&SyncCond); // 実際の状態が更新されたことをリアルタイムスレッドに知らせる
186 pthread_mutex_unlock(&SyncMutex); // Mutexアンロック
187 }
188
190 void WaitStart(void){
191 // 状態が「動作中」に設定されるまで待機
192 EventLog("Waiting for SFID_RUN...");
193 pthread_mutex_lock(&SyncMutex); // Mutexロック
194 while(StateFlag != SFID_RUN){
195 pthread_cond_wait(&SyncCond, &SyncMutex); // 状態が更新されるまで待機
196 }
197 pthread_mutex_unlock(&SyncMutex); // Mutexアンロック
198 EventLog("Waiting for SFID_RUN...Done");
199 }
200
202 void Stop(void){
203 pthread_mutex_lock(&SyncMutex); // Mutexロック
204 StateFlag = SFID_STOP; // 停止が指令されたことを知らせる
205 pthread_cond_broadcast(&SyncCond); // 実際の状態が更新されたことをリアルタイムスレッドに知らせる
206 pthread_mutex_unlock(&SyncMutex); // Mutexアンロック
207 }
208
210 void WaitStop(void){
211 // 状態が「終了動作完了」に設定されるまで待機
212 EventLog("Waiting for SFID_EXCMPL...");
213 pthread_mutex_lock(&SyncMutex); // Mutexロック
214 while(StateFlag != SFID_EXCMPL){
215 pthread_cond_wait(&SyncCond, &SyncMutex); // 状態が更新されるまで待機
216 }
217 pthread_mutex_unlock(&SyncMutex); // Mutexアンロック
218 EventLog("Waiting for SFID_EXCMPL...Done");
219 }
220
222 void Reset(void){
223 timespec_clear(Time); // 時刻をクリア
224 timespec_clear(ActPeriodicTime);// 実際の周期時間をクリア
225 timespec_clear(ComputationTime);// 消費時間をクリア
226 MaxMemo = 0; // 計測周期最大値をクリア
227 MinMemo = Ts*1e-9; // 計測周期最小値をクリア
228 }
229
231 void ForceDestruct(void){
232 pthread_cancel(ThreadID); // スレッド破棄
233 pthread_join(ThreadID, nullptr);// 実時間スレッド終了待機
234 }
235
238 double GetTime(void) const {
239 return timespec_to_sec(Time); // [s] 時刻に変換して返す
240 }
241
244 double GetSmplTime(void) const {
245 return timespec_to_sec(ActPeriodicTime);// [s] 時刻に変換して返す
246 }
247
250 double GetCompTime(void) const {
251 return timespec_to_sec(ComputationTime);// [s] 時刻に変換して返す
252 }
253
256 double GetMaxTime(void){
257 double TsZ0 = GetSmplTime(); // [s] 今のサンプリング時間を取得
258 if(MaxMemo < TsZ0){
259 MaxMemo = TsZ0;
260 }
261 return MaxMemo;
262 }
263
266 double GetMinTime(void){
267 double TsZ0 = GetSmplTime(); // [s] 今のサンプリング時間を取得
268 if(TsZ0 < MinMemo && 1e-6 < TsZ0){
269 MinMemo = TsZ0;
270 }
271 return MinMemo;
272 }
273
274 private:
275 SFthread(const SFthread&) = delete;
276 const SFthread& operator=(const SFthread&) = delete;
277
278 static const long ONE_SEC_IN_NANO = 1000000000;
279 static const long SKEW_IN_NANO = 40;
280 pthread_mutex_t SyncMutex;
281 pthread_cond_t SyncCond;
282 enum ThreadState StateFlag;
283 const unsigned long Ts;
284 std::function<bool(double,double,double)> FuncObj;
285 timespec Time;
286 timespec ActPeriodicTime;
287 timespec ComputationTime;
288 pthread_t ThreadID;
289 struct sched_param ThreadParam;
290 double MaxMemo;
291 double MinMemo;
292
295 void RealTimeLoop(void){
296 timespec InitTime = {0}; // ループに入る初期時刻
297 timespec NextTime = {0}; // 次のループ開始時刻
298 timespec TimeInWait = {0}; // 待機ループ内で取得する現在時刻
299 timespec PeriodTime = nsec_to_timespec(Ts - SKEW_IN_NANO); // 所望の制御周期(時刻ズレ調整済み)
300 timespec StartTime = {0}; // 開始時刻格納用
301 timespec StartTimePrev = {0}; // 前回の開始時間格納用
302 timespec EndTime = {0}; // 終了時刻格納用
303 timespec PreventStuck = {0}; // 「BUG: soft lockup - CPU#0 Stuck for 67s!」を回避するためのスリープ用
304 bool ClockOverride = false; // 時刻待機のクロックオーバーライドフラグ
305
306 EventLog("Starting Realtime Loop.");
307
308 clock_gettime(CLOCK_MONOTONIC, &InitTime); // 初期開始時刻の取得
309 StartTimePrev = timespec_sub(InitTime, PeriodTime); // 実際の制御周期計算用の初期値設定
310
311 // 実時間ループ
312 while(StateFlag != SFID_STOP){ // 動作状態フラグが「停止」に設定されるまでループ
313 // ここからリアルタイム空間
314 clock_gettime(CLOCK_MONOTONIC, &StartTime); // 開始時刻の取得
315 Time = timespec_sub(StartTime, InitTime); // 実際の時刻を計算
316 ActPeriodicTime = timespec_sub(StartTime, StartTimePrev); // 実際の周期時間を計算(timespec構造体は単純に減算できないことに注意)
317
318 std::feclearexcept(FE_ALL_EXCEPT); // 浮動小数点例外フラグをクリア
319 ClockOverride = !FuncObj(GetTime(), GetSmplTime(), GetCompTime()); // 制御用関数の実行(関数オブジェクトにより、ここで実際の制御関数が呼ばれる)
320 arcs_assert(std::fetestexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW) == false); // 浮動小数点例外チェック(ゼロ割、NaN、桁溢れ検出)
321 StartTimePrev = StartTime; // 次回用に今回の開始時刻を格納
322 NextTime = timespec_add(StartTime, PeriodTime); // 開始時刻に制御周期を加算して次の時刻を計算
323
324 if constexpr(SFA == SFalgorithm::INSERT_ZEROSLEEP){
325 clock_nanosleep(CLOCK_MONOTONIC, 0, &PreventStuck, nullptr); // 「BUG: soft lockup - CPU#0 Stuck for 67s!」を回避するためのスリープ
326 }
327 clock_gettime(CLOCK_MONOTONIC, &EndTime); // 終了時刻の取得
328 ComputationTime = timespec_sub(EndTime, StartTime); // 消費時間を計算(timespec構造体は単純に減算できないことに注意)
329
330 // 次の時刻になるまで待機
331 while(StateFlag != SFID_STOP){
332 clock_gettime(CLOCK_MONOTONIC, &TimeInWait); // 現在時刻の取得
333 if(timespec_lessthaneq(NextTime, TimeInWait) == true || ClockOverride == true){
334 // 現在時刻と予め計算した次の時刻とを比較して,超えたら待機終了
335 // もしくは,クロックオーバーライドフラグが立っていたら待機終了
336 break;
337 }
338 }
339 // リアルタイム空間ここまで
340 }
341
342 EventLog("Ending Realtime Loop.");
343 }
344
347 static void RealTimeThread(SFthread *p){
348 // デストラクタが呼ばれるまで繰り返し続ける
349 while(1){
350 // 動作状態が「開始」か「破棄」に設定されるまで待機
351 EventLog("Waiting for SFID_START,SFID_DSTRCT...");
352 pthread_mutex_lock(&(p->SyncMutex)); // Mutexロック
353 while(p->StateFlag != SFID_START && p->StateFlag != SFID_DSTRCT){
354 pthread_cond_wait(&(p->SyncCond), &(p->SyncMutex)); // 状態が更新されるまで待機
355 }
356 pthread_mutex_unlock(&(p->SyncMutex)); // Mutexアンロック
357 EventLog("Waiting for SFID_START,SFID_DSTRCT...Done");
358
359 if(p->StateFlag == SFID_DSTRCT) break; // 破棄指令ならスレッド終了
360
361 pthread_mutex_lock(&(p->SyncMutex)); // Mutexロック
362 p->StateFlag = SFID_RUN; // 動作状態フラグを「動作中」に設定
363 pthread_cond_broadcast(&(p->SyncCond)); // 実際の状態が更新されたことを上位系に知らせる
364 pthread_mutex_unlock(&(p->SyncMutex)); // Mutexアンロック
365
366 mlockall(MCL_CURRENT); // メモリロック
367 p->RealTimeLoop(); // 実時間ループの実行
368 munlockall(); // メモリロック解除
369
370 pthread_mutex_lock(&(p->SyncMutex)); // Mutexロック
371 p->StateFlag = SFID_EXCMPL; // 動作状態フラグを「終了動作完了」に設定
372 pthread_cond_broadcast(&(p->SyncCond)); // 実際の状態が更新されたことを上位系に知らせる
373 pthread_mutex_unlock(&(p->SyncMutex)); // Mutexアンロック
374 }
375 EventLog("RealTimeThread Destructed.");
376 }
377
382 static timespec timespec_add(const timespec& a, const timespec& b){
383 timespec ret;
384 ret.tv_sec = a.tv_sec + b.tv_sec; // aとbの秒カウンタを加算
385 ret.tv_nsec = a.tv_nsec + b.tv_nsec; // aとbのナノ秒カウンタを加算
386 if(ONE_SEC_IN_NANO <= ret.tv_nsec){
387 // ナノ秒カウンタが正方向に溢れる場合
388 ret.tv_nsec -= ONE_SEC_IN_NANO; // ナノ秒カウンタから1秒分引いて,
389 ret.tv_sec++; // 代わりに秒カウンタを加算
390 }
391 return ret;
392 }
393
398 static timespec timespec_sub(const timespec& a, const timespec& b){
399 timespec ret;
400 ret.tv_sec = a.tv_sec - b.tv_sec; // aとbの秒カウンタを減算
401 ret.tv_nsec = a.tv_nsec - b.tv_nsec; // aとbのナノ秒カウンタを減算
402 if(ret.tv_nsec < 0){
403 // ナノ秒カウンタが負方向に溢れる場合
404 ret.tv_nsec += ONE_SEC_IN_NANO; // ナノ秒カウンタに1秒分加えて,
405 ret.tv_sec--; // 代わりに秒カウンタを減算
406 }
407 return ret;
408 }
409
414 static bool timespec_lessthaneq(const timespec& a, const timespec& b){
415 if(a.tv_sec != b.tv_sec){
416 if(a.tv_sec < b.tv_sec){
417 return true;
418 }else{
419 return false;
420 }
421 }else{
422 if(a.tv_nsec <= b.tv_nsec){
423 return true;
424 }else{
425 return false;
426 }
427 }
428 }
429
432 static void timespec_clear(timespec& a){
433 a.tv_sec = 0; // 秒カウンタをクリア
434 a.tv_nsec = 0; // ナノ秒カウンタをクリア
435 }
436
440 static timespec nsec_to_timespec(const unsigned long time){
441 timespec ret;
442 ret.tv_sec = time/ONE_SEC_IN_NANO;
443 ret.tv_nsec = time - ret.tv_sec*ONE_SEC_IN_NANO;
444 return ret;
445 }
446
450 static double timespec_to_sec(const timespec& time){
451 return (double)time.tv_sec + (double)time.tv_nsec*1e-9; // [s] 時刻に変換して返す
452 }
453
455 void SetKernelParameters(void){
456 // WSLの場合
457 if(IsInWSL() == true){
458 EventLog("Setting kernel parameters for WSL");
459 return; // WSLのときは何もせずに終了
460 }
461
462 // x86_64系の場合
463 #ifdef __x86_64__
464 EventLog("Setting kernel parameters for x86_64");
465 LinuxCommander::Execute("/bin/dmesg -n 1"); // カーネルメッセージの表示を抑制
466
467 // カーネルパラメータの設定(CFSを無効にする場合)
468 if constexpr( static_cast<uint8_t>(SFK) & static_cast<uint8_t>(SFkernelparam::CFS_DISABLED) ){
469 // 下記が無いと1秒毎にスパイク状の遅延が生じる
470 LinuxCommander::Execute("/bin/echo -1 > /proc/sys/kernel/sched_rt_runtime_us"); // CFSを無効
471 LinuxCommander::Execute("/bin/echo 2147483647 > /proc/sys/kernel/sched_rt_period_us"); // リアルタイムタスク割り当て時間を最大化
472 EventLog("Kernel param: CFS Disabled");
473 }
474
475 // カーネルパラメータの設定(PREEMPT_DYNAMICの場合にFULLモードに設定する場合)
476 if constexpr( static_cast<uint8_t>(SFK) & static_cast<uint8_t>(SFkernelparam::PREEMPT_DYNFULL) ){
477 LinuxCommander::Execute("/bin/echo \"full\" > /sys/kernel/debug/sched/preempt");
478 EventLog("Kernel param: Set to \"full\" mode on PREEMPT_DYNAMIC");
479 }
480
481 // リアルタイムアルゴリズムのタイプによる設定
482 if constexpr(SFA == SFalgorithm::WITHOUT_ZEROSLEEP){
483 LinuxCommander::Execute("/bin/echo 0 > /proc/sys/kernel/watchdog"); // 「BUG: soft lockup」警告防止
484 EventLog("Kernel param: Watchdog Disabled");
485 }
486 #endif
487
488 // ARM系の場合
489 #ifdef __arm__
490 EventLog("Setting kernel parameters for ARM");
491 // パラメータなし
492 #endif
493
494 // 下記は実験的なカーネルパラメータ(様子見中)
495 //LinuxCommander::Execute("/bin/echo 0 > /proc/sys/kernel/timer_migration"); // タイマの移行を無効
496 //LinuxCommander::Execute("/bin/echo 0 > /proc/sys/kernel/sched_nr_migrate"); // プロセッサ間を移動できるタスク数をゼロにする
497 }
498
500 void ResetKernelParameters(void){
501 // WSLの場合
502 if(IsInWSL() == true){
503 return; // WSLのときは何もせずに終了
504 }
505
506 // x86_64系の場合
507 #ifdef __x86_64__
508 // カーネルパラメータをデフォルト値に戻す(CFSを無効にした場合)
509 if constexpr( static_cast<uint8_t>(SFK) & static_cast<uint8_t>(SFkernelparam::CFS_DISABLED) ){
510 // 下記のように戻しておいた方が安定性の観点から無難
511 LinuxCommander::Execute("/bin/echo 950000 > /proc/sys/kernel/sched_rt_runtime_us"); // CFSを有効,もとに戻す
512 LinuxCommander::Execute("/bin/echo 1000000 > /proc/sys/kernel/sched_rt_period_us"); // リアルタイムタスク割り当て時間を元に戻す
513 EventLog("Kernel param: CFS Enabled");
514 }
515
516 // カーネルパラメータをデフォルト値に戻す(PREEMPT_DYNAMICの場合にFULLモードに設定した場合)
517 if constexpr( static_cast<uint8_t>(SFK) & static_cast<uint8_t>(SFkernelparam::PREEMPT_DYNFULL) ){
518 LinuxCommander::Execute("/bin/echo \"voluntary\" > /sys/kernel/debug/sched/preempt");
519 EventLog("Kernel param: Set to \"voluntary\" mode on PREEMPT_DYNAMIC");
520 }
521
522 LinuxCommander::Execute("/bin/dmesg -n 7"); // カーネルメッセージの表示をデフォルト値に戻す
523 EventLog("Kernel param: Returned to default settings.");
524 #endif
525
526 // ARM系の場合
527 #ifdef __arm__
528 // パラメータなし
529 #endif
530
531 // 下記は実験的なカーネルパラメータ(様子見中)
532 //LinuxCommander::Execute("/bin/echo 1 > /proc/sys/kernel/watchdog"); // 「BUG: soft lockup」警告防止の解除(ウオッチドックは有効に戻せないらしい)
533 //LinuxCommander::Execute("/bin/echo 1 > /proc/sys/kernel/timer_migration"); // タイマの移行を有効
534 //LinuxCommander::Execute("/bin/echo 32 > /proc/sys/kernel/sched_nr_migrate"); // プロセッサ間を移動できるタスク数を既定値に戻す
535 }
536
539 static bool IsInWSL(void){
540 const std::string WSLpath = "/proc/sys/fs/binfmt_misc/WSLInterop"; // WSL内に存在するあるファイル
541 std::ifstream ifs(WSLpath);
542 return ifs.is_open();
543 }
544};
545}
546
547#endif
548
ARCS イベントログクラス
#define EventLog(a)
イベントログ用マクロ (任意メッセージ記録版)
Definition ARCSeventlog.hh:27
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
Linuxコマンダー
SFalgorithm
リアルタイムアルゴリズムのタイプの定義 解説: 時間ゼロのスリープを入れるとLinuxが安定動作できるが,リアルタイム性は犠牲になる。 古い低速の処理系では INSERT_ZEROSLEEP を推奨する...
Definition SFthread.hh:49
@ INSERT_ZEROSLEEP
リアルタイムループに時間ゼロのスリープを入れる
@ WITHOUT_ZEROSLEEP
スリープは一切入れない
SFkernelparam
カーネルパラメータのタイプの定義
Definition SFthread.hh:55
@ CFS_DISABLED
CFS(Completely Fair Scheduler)を無効にする
@ NO_SETTINGS
何も設定しない場合
@ PREEMPT_DYNFULL
PREEMPT_DYNAMICの場合にFULLモードにする
CPU設定クラス
static void SetCPUandPolicy(const pthread_t FuncName, const unsigned int CPUnum, const int Policy)
スレッドを動作させるCPUコアとポリシーを設定する関数
Definition CPUSettings.cc:36
static void Execute(std::string CommandLine)
Linuxコマンドを実行する関数
Definition LinuxCommander.cc:35
実時間スレッド生成・破棄クラス
Definition SFthread.hh:67
SFthread(const unsigned long PeriodTime, const int CPUno)
コンストラクタ(制御用実行関数の関数オブジェクトを後で設定する場合)
Definition SFthread.hh:115
double GetTime(void) const
時刻を取得する関数
Definition SFthread.hh:238
void ForceDestruct(void)
スレッドを強制破壊する関数
Definition SFthread.hh:231
double GetMinTime(void)
計測された実際のサンプリング時間の最小値を取得する関数
Definition SFthread.hh:266
SFthread(const unsigned long PeriodTime, const std::function< bool(double, double, double)> &FuncObject, const int CPUno)
コンストラクタ
Definition SFthread.hh:83
void Stop(void)
スレッド実行を停止する関数
Definition SFthread.hh:202
~SFthread()
デストラクタ
Definition SFthread.hh:164
void Reset(void)
スレッドをリセットする関数
Definition SFthread.hh:222
ThreadState
動作状態の定義
Definition SFthread.hh:70
@ SFID_RUN
動作中
Definition SFthread.hh:73
@ SFID_EXCMPL
終了動作完了
Definition SFthread.hh:75
@ SFID_ERROR
エラー検出
Definition SFthread.hh:71
@ SFID_START
開始
Definition SFthread.hh:72
@ SFID_DSTRCT
スレッド破棄
Definition SFthread.hh:76
@ SFID_STOP
停止
Definition SFthread.hh:74
void WaitStart(void)
スレッド実行が開始されるまで待機する関数
Definition SFthread.hh:190
double GetCompTime(void) const
計測された消費時間を取得する関数
Definition SFthread.hh:250
SFthread(SFthread &&r)
ムーブコンストラクタ
Definition SFthread.hh:146
double GetMaxTime(void)
計測された実際のサンプリング時間の最大値を取得する関数
Definition SFthread.hh:256
void WaitStop(void)
スレッド実行が停止されるまで待機する関数
Definition SFthread.hh:210
void Start(void)
スレッド実行を開始する関数
Definition SFthread.hh:182
double GetSmplTime(void) const
計測された実際のサンプリング時間を取得する関数
Definition SFthread.hh:244
void SetRealtimeFunction(std::function< bool(double, double, double)> FuncObject)
実時間スレッドから呼び出す関数を設定する関数
Definition SFthread.hh:177