20 #if defined(__ZEPHYR__)
21 #include <zephyr/kernel.h>
32 template<std::
size_t Capacity>
35 static constexpr std::size_t capacity = Capacity;
37 template<
typename Event>
40 static_assert(Capacity > 0,
41 "tsm: zephyr_msgq requires non-zero capacity");
44 using value_type =
Event;
49 &queue_, buffer_,
sizeof(Event),
static_cast<uint32_t
>(Capacity));
52 queue(queue
const&) =
delete;
53 queue& operator=(queue
const&) =
delete;
55 [[nodiscard]]
bool try_push(Event
const& event)
57 return k_msgq_put(&queue_, &event, K_NO_WAIT) == 0;
60 [[nodiscard]]
bool try_push(Event&& event)
62 return k_msgq_put(&queue_, &event, K_NO_WAIT) == 0;
65 [[nodiscard]]
bool try_pop(Event& event)
67 return k_msgq_get(&queue_, &event, K_NO_WAIT) == 0;
70 [[nodiscard]]
bool empty()
const
72 return k_msgq_num_used_get(
const_cast<k_msgq*
>(&queue_)) == 0U;
75 [[nodiscard]]
bool full()
const
77 return k_msgq_num_free_get(
const_cast<k_msgq*
>(&queue_)) == 0U;
80 [[nodiscard]] std::size_t size()
const
82 return k_msgq_num_used_get(
const_cast<k_msgq*
>(&queue_));
85 [[nodiscard]] k_msgq* native_handle()
89 [[nodiscard]] k_msgq
const* native_handle()
const
95 alignas(
Event)
char buffer_[Capacity *
sizeof(Event)]{};
101 template<std::
size_t Capacity>
104 using type = zephyr_msgq<Capacity>;
111 struct zephyr_tick_source
123 template<
typename... Tasks>
124 class zephyr_task_executor
127 explicit zephyr_task_executor(Tasks&... tasks)
130 k_sem_init(&wake_sem_, 0, 1);
138 k_sem_give(&wake_sem_);
147 static_cast<void>(k_sem_take(&wake_sem_, K_MSEC(1)));
150 [[nodiscard]]
bool step()
152 return ready_.step();
155 std::size_t run_ready()
157 const auto ran = ready_.run_ready();
168 const auto resumed = ready_.tick(elapsed_ticks);
177 return tick(elapsed_ticks.
count());
185 template<auto Entry, std::
size_t Instance = 0U>
188 auto result = ready_.template start<Entry, Instance>();
195 template<
auto Entry,
typename... Args>
198 auto result = ready_.template spawn<Entry>(std::forward<Args>(args)...);
205 [[nodiscard]] runtime::task_spawner<zephyr_task_executor>
spawner()
207 return runtime::task_spawner<zephyr_task_executor>{ *
this };
210 template<auto Entry, std::
size_t Instance = 0U>
213 return ready_.template task_status<Entry, Instance>();
216 template<auto Entry, std::
size_t Instance = 0U>
219 return ready_.template task_failure_reason<Entry, Instance>();
222 template<auto Entry, std::
size_t Instance = 0U>
223 [[nodiscard]]
bool cancel() noexcept
225 const bool cancelled = ready_.template cancel<Entry, Instance>();
232 void cancel_all() noexcept
243 template<
typename... Tasks>
244 zephyr_task_executor(Tasks&...) -> zephyr_task_executor<Tasks...>;
246 template<
typename... Tasks>
Target-independent executors for tsm runtimes.
Definition: freertos.h:26
task_spawner< Executor > spawner
Definition: executor.h:150
cooperative_executor(Tasks &...) -> cooperative_executor< Tasks... >
Definition: bare_metal.h:20
task_failure_reason
Definition: coroutine.h:170
constexpr tick_count ticks(tick_rep value) noexcept
Definition: ticks.h:85
runtime::storage::target_queue< Capacity > target_storage
Definition: static_ring.h:179
task_status
Definition: coroutine.h:160
bare_metal_task_executor< Tasks... > task_executor
Definition: bare_metal.h:166
spawn_result
Definition: coroutine.h:181
TSM_TICK_REP tick_rep
Definition: ticks.h:35
Fixed-capacity ring queue storage for runtime events.
Strong value type for semantic scheduler ticks.
Definition: ticks.h:54
constexpr tick_rep count() const noexcept
Definition: ticks.h:73