Motorcortex Core  version: 2.7.6
ct_task_deadline.h
1 /*
2  * Developer : Alexey Zakharov (alexey.zakharov@vectioneer.com)
3  * All rights reserved. Copyright (c) 2015 VECTIONEER.
4  */
5 
6 #ifndef CT_TASK_DEADLINE_H
7 #define CT_TASK_DEADLINE_H
8 
9 #include "ps_parameter.h"
10 #include "utl_sched.h"
11 
12 #include <stdint.h>
13 #include <pthread.h>
14 #include <vector>
15 #include <atomic>
16 #include <initializer_list>
17 
18 #define TASK_NAME_LENGTH 64
19 
20 namespace container {
21 
22 class Module;
23 
24 class TaskDeadline {
25 public:
26 
27  enum Command {
28  AUTOSTART = 0,
29  NO_AUTOSTART = 1
30  };
31 
32  TaskDeadline(void) = delete;
33  TaskDeadline(const char* name, parameter_server::Parameter* parent);
34  TaskDeadline(const TaskDeadline& orig);
35  virtual ~TaskDeadline(void);
36 
37  void setName(const char* name);
38  const char* getName(void) const;
39 
40  void add(Module* module, Command cmd = AUTOSTART);
41  void remove(Module* module);
42 
43  void configure(void);
44  void start(unsigned long cycle_time_micro_s, utils::SchedType = utils::SchedType::OTHER, std::initializer_list<int> cpu_affinity_list = {-1}, int priority = 0);
45  void stop(void);
46 
47  void setCycleTimeMicroS(unsigned long micro_s);
48  unsigned long getCycleMicroS(void);
49  double getCycleTimeS(void);
50 
51  //bool setSchedPolicy(int policy, int priority);
52  //int getSchedPolicy(void);
53 
54  //bool setSchedPriority(int priority);
55  //bool getSchedPriority(void);
56 
57  //int getCPUAffinity(void);
58 
59 private:
60 
61  bool setCpuAffinity(std::initializer_list<int> cpu_affinity_list);
62 
63  struct time_statistics_t {
64  long actual;
65  long max;
66  };
67 
68  struct module_info {
69  Module* module;
70  Command user_command_;
71  };
72 
73  struct sched_data {
74  long desired_cycle_time_micro_s;
75  utils::SchedType sched_type;
76  int sched_prio;
77  //int cpu_affinity_;
78  pthread_t thread_id;
79  };
80 
81  enum State {
82  OFF = 0,
83  READY = 1,
84  ON = 2,
85  };
86 
87  void* run(void);
88  static void* runHelper(void *context);
89 
90  inline void correctNSec(struct timespec &time_nsec);
91  inline void fillCycleTime(time_statistics_t& cycleTime, unsigned long time, unsigned long cycle);
92 
93  std::atomic<State> state_;
94  char task_name_[TASK_NAME_LENGTH + 1];
95  std::vector<module_info> modules_;
96 
97  //time_statistics_t task_load_;
98  struct timespec desired_cycle_time_;
99  time_statistics_t actual_load_time_;
100  time_statistics_t actual_cycle_time_;
101 
102  int reset_absolute_max_time_micro_s_;
103  long absolute_max_time_micro_s_;
104 
105  sched_data sched_data_;
106 // long desired_cycle_time_micro_s_;
107 // sched_param sched_priority_;
108 // pthread_t task_thread_id_;
109 // int sched_policy_;
110 // int cpu_affinity_;
111 
112  //page_fault_t last_page_fault_;
113  //page_fault_t page_fault_;
114 
115  parameter_server::Parameter local_branch_;
116 
117 };
118 
119 }; // namespace container
120 
121 #endif /* CT_TASK_DEADLINE_H */
122 
container::TaskDeadline
Definition: ct_task_deadline.h:24