Motorcortex Core  version: 2.7.6
ct_task.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2015 VECTIONEER.
4  */
5 
6 #ifndef CONTAINER_CT_TASK_H
7 #define CONTAINER_CT_TASK_H
8 
9 #include "cmdline_task.h"
10 #include "ct_tasksched.h"
11 #include "ct_time.h"
12 #include "ps_parameter.h"
13 #include "utl_realtime.h"
14 #include <atomic>
15 #include <cstdint>
16 #include <pthread.h>
17 #include <string>
18 #include <vector>
19 
20 namespace mcx::container {
21 
22 class Module;
23 
29 
31 class Task {
32 public:
37  Task(const char* name, parameter_server::Parameter* parent);
38 
40  virtual ~Task();
41 
43  Task() = delete;
44 
46  Task(Task& orig) = delete;
47 
49  Task& operator=(Task& orig) = delete;
50 
55  void setName(const char* name);
56 
61  const char* getName() const;
62 
65  bool running() const;
66 
71  void setStackSize(uint64_t size_bytes);
72 
77  uint64_t getStackSize() const;
78 
83  void add(Module* module);
84 
89  void add(const std::vector<Module*>& modules);
90 
94  void configure();
95 
120  void start(uint64_t cycle_time_micro_s, TaskSched task_sched, const std::vector<uint32_t>& cpu_affinity_list = {},
121  uint32_t priority = 0);
122 
123  void start(cmd_line::Task);
124 
128  void stop();
129 
134  void setCycleTimeMicroS(uint64_t cycle_time_micro_s);
135 
140  uint64_t getCycleMicroS() const;
141 
146  double getCycleTimeS() const;
147 
152  uint64_t getNrOfCycles() const;
153 
161  bool setSchedPolicy(uint32_t policy);
162 
167  uint32_t getSchedPolicy() const;
168 
176  bool setSchedPriority(int priority);
177 
182  int getSchedPriority() const;
183 
189  bool setCpuAffinity(const std::vector<uint32_t>& cpu_affinity_list);
190 
195  const std::vector<uint32_t>& getCpuAffinity() const;
196 
197 private:
198  struct ModuleInfo {
199  Module* module;
200  };
201 
202  struct TimeStatistics {
203  uint64_t actual;
204  uint64_t max;
205  };
206 
207  enum class State {
208  OFF = 0,
209  READY = 1,
210  ON = 2,
211  };
212 
213  timespec prepare(pthread_attr_t& gattr);
214 
215  void* run();
216 
217  static void* runHelper(void* context);
218 
219  struct timespec syncToIdealTime(struct timespec t_ideal);
220 
221  static inline void fillCycleTime(TimeStatistics* cycle_time, uint64_t time, uint64_t cycle);
222 
223  const char* policyToStr(uint32_t policy) const;
224 
225  std::atomic<State> state_{State::OFF};
226  std::atomic<bool> is_running_{false};
227  std::string task_name_{"Undefined"};
228 
229  struct timespec desired_cycle_time_ {};
230  TimeStatistics actual_cycle_time_{};
231 
232  int32_t reset_absolute_max_time_micro_s_{};
233  uint64_t absolute_max_time_micro_s_{};
234  uint64_t desired_cycle_time_micro_s_{1000};
235  std::atomic<uint64_t> nr_of_cycles_{};
236  TimeStatistics utilization_percent_{};
237 
238  double secaligned_{0.1};
239  int32_t startop_[2]{};
240 
241  std::vector<uint32_t> cpu_affinity_list_{};
242  sched_param sched_priority_{};
243  pthread_t task_thread_id_{};
244  uint32_t sched_policy_{};
245 
246  uint64_t stack_size_{};
247 
248 #ifdef __clang__
249 #pragma clang diagnostic push
250 #pragma clang diagnostic ignored "-Wunused-private-field"
251 #endif
252  utils::PageFaults page_faults_{};
253 #ifdef __clang__
254 #pragma clang diagnostic pop
255 #endif
256 
257  std::vector<ModuleInfo> modules_;
258  parameter_server::Parameter local_branch_;
259 };
260 
263 inline void Task::fillCycleTime(TimeStatistics* cycle_time, uint64_t time, uint64_t cycle) {
264  cycle_time->actual = time;
265  if (cycle == 0) {
266  cycle_time->max = cycle_time->actual;
267  } else {
268  cycle_time->max = cycle_time->actual > cycle_time->max ? cycle_time->actual : cycle_time->max;
269  }
270 }
271 
272 } // namespace mcx::container
273 
274 #endif // CONTAINER_CT_TASK_H
mcx::container::Task::getCpuAffinity
const std::vector< uint32_t > & getCpuAffinity() const
Gets list of CPUs to which task is bound.
Definition: ct_task.cpp:489
mcx::container::Task::setStackSize
void setStackSize(uint64_t size_bytes)
Sets stack size of the task bytes.
Definition: ct_task.cpp:74
mcx::container::Task::getSchedPolicy
uint32_t getSchedPolicy() const
Gets task scheduler policy.
Definition: ct_task.cpp:448
mcx::container::Task::stop
void stop()
Stops Operation Phase of the task.
Definition: ct_task.cpp:121
mcx::parameter_server::Parameter
Definition: ps_parameter.h:45
mcx::container::Task::add
void add(Module *module)
Adds module to the task.
Definition: ct_task.cpp:78
mcx::container::Task::operator=
Task & operator=(Task &orig)=delete
Copy constructors are deleted.
mcx::container::Task::setName
void setName(const char *name)
Sets the name of the task.
Definition: ct_task.cpp:65
mcx::container::Task
Event loop and concurrency primitive for Motorcortex modules.
Definition: ct_task.h:31
mcx::container::Task::getNrOfCycles
uint64_t getNrOfCycles() const
Gets number of execution cycles.
Definition: ct_task.cpp:421
mcx::cmd_line::Task
Definition: cmdline_task.h:16
mcx::container::Task::getSchedPriority
int getSchedPriority() const
Gets task scheduler priority.
Definition: ct_task.cpp:470
mcx::container::Task::Task
Task()=delete
Default constructor is deleted.
mcx::container::Task::getCycleTimeS
double getCycleTimeS() const
Gets cycle time of the event-loop of the task in seconds.
Definition: ct_task.cpp:425
mcx::container::Task::setSchedPriority
bool setSchedPriority(int priority)
Sets task scheduler priority.
Definition: ct_task.cpp:450
mcx::container::Task::getStackSize
uint64_t getStackSize() const
Returns stack size of the task im bytes.
Definition: ct_task.cpp:76
mcx::container::Task::start
void start(uint64_t cycle_time_micro_s, TaskSched task_sched, const std::vector< uint32_t > &cpu_affinity_list={}, uint32_t priority=0)
Starts Operation Phase of the task.
Definition: ct_task.cpp:101
mcx::container::Task::setCpuAffinity
bool setCpuAffinity(const std::vector< uint32_t > &cpu_affinity_list)
Binds task to the list of CPUs.
Definition: ct_task.cpp:472
mcx::container::Task::configure
void configure()
Starts Configuration Phase of the task.
Definition: ct_task.cpp:89
mcx::container::Task::getName
const char * getName() const
Returns the name of the task.
Definition: ct_task.cpp:70
mcx::container::Task::Task
Task(Task &orig)=delete
Copy constructors are deleted.
mcx::container::Task::setSchedPolicy
bool setSchedPolicy(uint32_t policy)
Sets task scheduler policy.
Definition: ct_task.cpp:427
mcx::container::Module
A building block of the Motorcortex components.
Definition: ct_module.h:64
mcx::container::Task::getCycleMicroS
uint64_t getCycleMicroS() const
Gets cycle time of the event-loop of the task in microseconds.
Definition: ct_task.cpp:423
mcx::container::Task::setCycleTimeMicroS
void setCycleTimeMicroS(uint64_t cycle_time_micro_s)
Sets a cycle time of the event-loop of the task.
Definition: ct_task.cpp:413
mcx::container::Task::running
bool running() const
Returns true if task is running.
Definition: ct_task.cpp:72
mcx::container::Task::~Task
virtual ~Task()
Destructor brings all the task modules to a destroy phase.
Definition: ct_task.cpp:57