scheduler.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_NODE_SCHEDULER_HPP_INCLUDED
6 #define UAVCAN_NODE_SCHEDULER_HPP_INCLUDED
7 
8 #include <uavcan/error.hpp>
11 
12 namespace uavcan
13 {
14 
16 
17 class UAVCAN_EXPORT DeadlineHandler : public LinkedListNode<DeadlineHandler>
18 {
20 
21 protected:
23 
24  explicit DeadlineHandler(Scheduler& scheduler)
25  : scheduler_(scheduler)
26  { }
27 
28  virtual ~DeadlineHandler() { stop(); }
29 
30 public:
31  virtual void handleDeadline(MonotonicTime current) = 0;
32 
33  void startWithDeadline(MonotonicTime deadline);
34  void startWithDelay(MonotonicDuration delay);
35  void generateDeadlineImmediately() { startWithDeadline(MonotonicTime::fromUSec(1)); }
36 
37  void stop();
38 
39  bool isRunning() const;
40 
41  MonotonicTime getDeadline() const { return deadline_; }
42  Scheduler& getScheduler() const { return scheduler_; }
43 };
44 
45 
47 {
48  LinkedListRoot<DeadlineHandler> handlers_; // Ordered by deadline, lowest first
49 
50 public:
51  void add(DeadlineHandler* mdh);
52  void remove(DeadlineHandler* mdh);
53  bool doesExist(const DeadlineHandler* mdh) const;
54  unsigned getNumHandlers() const { return handlers_.getLength(); }
55 
56  MonotonicTime pollAndGetMonotonicTime(ISystemClock& sysclock);
57  MonotonicTime getEarliestDeadline() const;
58 };
59 
64 {
65  enum { DefaultDeadlineResolutionMs = 5 };
66  enum { MinDeadlineResolutionMs = 1 };
67  enum { MaxDeadlineResolutionMs = 100 };
68 
69  enum { DefaultCleanupPeriodMs = 1000 };
70  enum { MinCleanupPeriodMs = 10 };
71  enum { MaxCleanupPeriodMs = 10000 };
72 
79 
81  {
84  : owner(o)
85  {
86  owner.inside_spin_ = true;
87  }
88  ~InsideSpinSetter() { owner.inside_spin_ = false; }
89  };
90 
91  MonotonicTime computeDispatcherSpinDeadline(MonotonicTime spin_deadline) const;
92  void pollCleanup(MonotonicTime mono_ts, uint32_t num_frames_processed_with_last_spin);
93 
94 public:
95  Scheduler(ICanDriver& can_driver, IPoolAllocator& allocator, ISystemClock& sysclock)
96  : dispatcher_(can_driver, allocator, sysclock)
97  , prev_cleanup_ts_(sysclock.getMonotonic())
98  , deadline_resolution_(MonotonicDuration::fromMSec(DefaultDeadlineResolutionMs))
99  , cleanup_period_(MonotonicDuration::fromMSec(DefaultCleanupPeriodMs))
100  , inside_spin_(false)
101  { }
102 
108  int spin(MonotonicTime deadline);
109 
115  int spinOnce();
116 
117  DeadlineScheduler& getDeadlineScheduler() { return deadline_scheduler_; }
118 
119  Dispatcher& getDispatcher() { return dispatcher_; }
120  const Dispatcher& getDispatcher() const { return dispatcher_; }
121 
122  ISystemClock& getSystemClock() { return dispatcher_.getSystemClock(); }
123  MonotonicTime getMonotonicTime() const { return dispatcher_.getSystemClock().getMonotonic(); }
124  UtcTime getUtcTime() const { return dispatcher_.getSystemClock().getUtc(); }
125 
130  MonotonicDuration getDeadlineResolution() const { return deadline_resolution_; }
132  {
133  res = min(res, MonotonicDuration::fromMSec(MaxDeadlineResolutionMs));
134  res = max(res, MonotonicDuration::fromMSec(MinDeadlineResolutionMs));
135  deadline_resolution_ = res;
136  }
137 
144  MonotonicDuration getCleanupPeriod() const { return cleanup_period_; }
146  {
147  period = min(period, MonotonicDuration::fromMSec(MaxCleanupPeriodMs));
148  period = max(period, MonotonicDuration::fromMSec(MinCleanupPeriodMs));
149  cleanup_period_ = period;
150  }
151 };
152 
153 }
154 
155 #endif // UAVCAN_NODE_SCHEDULER_HPP_INCLUDED
uavcan::DeadlineHandler::scheduler_
Scheduler & scheduler_
Definition: scheduler.hpp:22
uavcan::Scheduler::inside_spin_
bool inside_spin_
Definition: scheduler.hpp:78
uavcan::DeadlineHandler::getDeadline
MonotonicTime getDeadline() const
Definition: scheduler.hpp:41
uavcan::Noncopyable
Definition: templates.hpp:46
uavcan::DeadlineScheduler::getNumHandlers
unsigned getNumHandlers() const
Definition: scheduler.hpp:54
uavcan::Scheduler::getCleanupPeriod
MonotonicDuration getCleanupPeriod() const
Definition: scheduler.hpp:144
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::UtcTime
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
uavcan::Scheduler::getDeadlineResolution
MonotonicDuration getDeadlineResolution() const
Definition: scheduler.hpp:130
uavcan::LinkedListRoot::getLength
unsigned getLength() const
Definition: linked_list.hpp:89
uavcan::DeadlineScheduler::handlers_
LinkedListRoot< DeadlineHandler > handlers_
Definition: scheduler.hpp:48
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
uavcan::DeadlineScheduler
Definition: scheduler.hpp:46
spinOnce
ROSCPP_DECL void spinOnce()
uavcan::ICanDriver
Definition: libuavcan/libuavcan/include/uavcan/driver/can.hpp:207
uavcan::DeadlineHandler::deadline_
MonotonicTime deadline_
Definition: scheduler.hpp:19
uavcan::Scheduler::InsideSpinSetter::owner
Scheduler & owner
Definition: scheduler.hpp:82
uavcan::MonotonicDuration
Definition: time.hpp:182
uavcan::DeadlineHandler::generateDeadlineImmediately
void generateDeadlineImmediately()
Definition: scheduler.hpp:35
uavcan::DeadlineHandler
Definition: scheduler.hpp:17
uavcan::TimeBase< MonotonicTime, MonotonicDuration >::fromUSec
static MonotonicTime fromUSec(uint64_t us)
Definition: time.hpp:112
dispatcher.hpp
uavcan::Dispatcher
Definition: dispatcher.hpp:80
uavcan::Scheduler::InsideSpinSetter
Definition: scheduler.hpp:80
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
uavcan::Scheduler::getDispatcher
const Dispatcher & getDispatcher() const
Definition: scheduler.hpp:120
uavcan::Scheduler::getUtcTime
UtcTime getUtcTime() const
Definition: scheduler.hpp:124
uavcan::DeadlineHandler::DeadlineHandler
DeadlineHandler(Scheduler &scheduler)
Definition: scheduler.hpp:24
uavcan::IPoolAllocator
Definition: dynamic_memory.hpp:21
uavcan::Scheduler::cleanup_period_
MonotonicDuration cleanup_period_
Definition: scheduler.hpp:77
uavcan::Scheduler
Definition: scheduler.hpp:63
UAVCAN_EXPORT
#define UAVCAN_EXPORT
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:108
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan::Scheduler::deadline_scheduler_
DeadlineScheduler deadline_scheduler_
Definition: scheduler.hpp:73
uavcan::Scheduler::getMonotonicTime
MonotonicTime getMonotonicTime() const
Definition: scheduler.hpp:123
uavcan_kinetis::clock::getMonotonic
uavcan::MonotonicTime getMonotonic()
Definition: clock.cpp:83
uavcan::Scheduler::Scheduler
Scheduler(ICanDriver &can_driver, IPoolAllocator &allocator, ISystemClock &sysclock)
Definition: scheduler.hpp:95
uavcan::Scheduler::getDispatcher
Dispatcher & getDispatcher()
Definition: scheduler.hpp:119
uavcan::ISystemClock::getUtc
virtual UtcTime getUtc() const =0
uavcan::Scheduler::getSystemClock
ISystemClock & getSystemClock()
Definition: scheduler.hpp:122
linked_list.hpp
uavcan::Scheduler::InsideSpinSetter::InsideSpinSetter
InsideSpinSetter(Scheduler &o)
Definition: scheduler.hpp:83
uavcan::Scheduler::deadline_resolution_
MonotonicDuration deadline_resolution_
Definition: scheduler.hpp:76
uavcan::Scheduler::setDeadlineResolution
void setDeadlineResolution(MonotonicDuration res)
Definition: scheduler.hpp:131
uavcan::LinkedListRoot
Definition: linked_list.hpp:44
uavcan::DeadlineHandler::~DeadlineHandler
virtual ~DeadlineHandler()
Definition: scheduler.hpp:28
uavcan::Scheduler::dispatcher_
Dispatcher dispatcher_
Definition: scheduler.hpp:74
uavcan::Scheduler::InsideSpinSetter::~InsideSpinSetter
~InsideSpinSetter()
Definition: scheduler.hpp:88
spin
ROSCPP_DECL void spin()
uavcan::Dispatcher::getSystemClock
const ISystemClock & getSystemClock() const
Definition: dispatcher.hpp:230
uavcan::Scheduler::getDeadlineScheduler
DeadlineScheduler & getDeadlineScheduler()
Definition: scheduler.hpp:117
uavcan::MonotonicTime
Definition: time.hpp:184
uavcan::LinkedListNode
Definition: linked_list.hpp:20
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::ISystemClock
Definition: system_clock.hpp:19
uavcan::Scheduler::setCleanupPeriod
void setCleanupPeriod(MonotonicDuration period)
Definition: scheduler.hpp:145
uavcan::DeadlineHandler::getScheduler
Scheduler & getScheduler() const
Definition: scheduler.hpp:42
uavcan::Scheduler::prev_cleanup_ts_
MonotonicTime prev_cleanup_ts_
Definition: scheduler.hpp:75
uavcan::ISystemClock::getMonotonic
virtual MonotonicTime getMonotonic() const =0
error.hpp


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03