14 #include <type_traits>
33 template<std::
size_t Capacity>
36 static constexpr std::size_t
capacity = Capacity;
38 template<
typename Event>
41 static_assert(Capacity > 0,
42 "tsm: freertos_queue requires non-zero capacity");
48 : handle_(xQueueCreate(Capacity, sizeof(Event)))
50 configASSERT(handle_ !=
nullptr);
58 if (handle_ !=
nullptr) {
59 vQueueDelete(handle_);
63 [[nodiscard]]
bool try_push(Event
const& event)
65 return xQueueSendToBack(handle_, &event, 0) == pdTRUE;
70 return xQueueSendToBack(handle_, &event, 0) == pdTRUE;
75 return xQueueReceive(handle_, &event, 0) == pdTRUE;
78 [[nodiscard]]
bool empty()
const
80 return uxQueueMessagesWaiting(handle_) == 0;
83 [[nodiscard]]
bool full()
const
85 return uxQueueSpacesAvailable(handle_) == 0;
88 [[nodiscard]] std::size_t
size()
const
90 return uxQueueMessagesWaiting(handle_);
99 QueueHandle_t handle_{};
107 template<std::
size_t Capacity>
125 using rep = duration::rep;
132 TickType_t
ticks = xTaskGetTickCount();
134 std::chrono::milliseconds(
ticks * (1000 / configTICK_RATE_HZ));
152 template<
typename... Tasks>
169 void start(
char const* name =
"tsm_exec",
170 uint16_t stack_depth = configMINIMAL_STACK_SIZE,
171 UBaseType_t priority = tskIDLE_PRIORITY + 1U)
203 BaseType_t higher_priority_task_woken = pdFALSE;
204 vTaskNotifyGiveFromISR(
task_handle_, &higher_priority_task_woken);
205 portYIELD_FROM_ISR(higher_priority_task_woken);
211 static_cast<void>(ulTaskNotifyTake(pdTRUE, 1));
226 const auto resumed =
ready_.
tick(elapsed_ticks);
243 template<auto Entry, std::
size_t Instance = 0U>
246 auto result =
ready_.template start<Entry, Instance>();
253 template<
auto Entry,
typename... Args>
256 auto result =
ready_.template spawn<Entry>(std::forward<Args>(args)...);
268 template<auto Entry, std::
size_t Instance = 0U>
274 template<auto Entry, std::
size_t Instance = 0U>
280 template<auto Entry, std::
size_t Instance = 0U>
319 template<
typename... Tasks>
322 template<
typename... Tasks>
Definition: freertos.h:154
void start_all()
Definition: freertos.h:238
void wake_from_isr()
Definition: freertos.h:200
freertos_task_executor(Tasks &... tasks)
Definition: freertos.h:156
freertos_task_executor(freertos_task_executor const &)=delete
spawn_result spawn(Args &&... args)
Definition: freertos.h:254
bool step()
Definition: freertos.h:214
task_failure_reason task_failure_reason() const
Definition: freertos.h:275
~freertos_task_executor()
Definition: freertos.h:164
runtime::task_spawner< freertos_task_executor > spawner()
Definition: freertos.h:263
std::size_t tick(tsm::tick_rep elapsed_ticks=1U)
Definition: freertos.h:224
void start(char const *name="tsm_exec", uint16_t stack_depth=configMINIMAL_STACK_SIZE, UBaseType_t priority=tskIDLE_PRIORITY+1U)
Definition: freertos.h:169
static void task_entry(void *pv_parameters)
Definition: freertos.h:301
bool cancel() noexcept
Definition: freertos.h:281
void wait_for_work()
Definition: freertos.h:209
tsm::runtime::cooperative_executor< Tasks... > ready_
Definition: freertos.h:297
std::size_t tick(tsm::tick_count elapsed_ticks)
Definition: freertos.h:233
void wake()
Definition: freertos.h:191
void cancel_all() noexcept
Definition: freertos.h:290
spawn_result start()
Definition: freertos.h:244
TaskHandle_t task_handle_
Definition: freertos.h:298
task_status task_status() const
Definition: freertos.h:269
void stop()
Definition: freertos.h:181
void run_task()
Definition: freertos.h:307
freertos_task_executor & operator=(freertos_task_executor const &)=delete
std::size_t run_ready()
Definition: freertos.h:219
BaseType_t stop_requested_
Definition: freertos.h:299
void start_all()
Definition: executor.h:197
bool step()
Definition: executor.h:161
std::size_t tick(tsm::tick_rep elapsed_ticks=1U)
Definition: executor.h:181
void cancel_all() noexcept
Definition: executor.h:276
std::size_t run_ready()
Definition: executor.h:172
Definition: executor.h:294
Definition: freertos.h:40
Event value_type
Definition: freertos.h:45
queue & operator=(queue const &)=delete
~queue()
Definition: freertos.h:56
bool try_pop(Event &event)
Definition: freertos.h:73
queue(queue const &)=delete
bool empty() const
Definition: freertos.h:78
bool try_push(Event &&event)
Definition: freertos.h:68
bool full() const
Definition: freertos.h:83
QueueHandle_t native_handle() const
Definition: freertos.h:93
std::size_t size() const
Definition: freertos.h:88
queue()
Definition: freertos.h:47
bool try_push(Event const &event)
Definition: freertos.h:63
Definition: executor.h:132
Target-independent executors for tsm runtimes.
constexpr int MaxEvents
Definition: freertos.h:24
Definition: freertos.h:26
Definition: bare_metal.h:20
task_failure_reason
Definition: coroutine.h:170
constexpr tick_count ticks(tick_rep value) noexcept
Definition: ticks.h:85
task_status
Definition: coroutine.h:160
freertos_task_executor(Tasks &...) -> freertos_task_executor< Tasks... >
spawn_result
Definition: coroutine.h:181
TSM_TICK_REP tick_rep
Definition: ticks.h:35
Fixed-capacity ring queue storage for runtime events.
Definition: freertos.h:122
std::chrono::time_point< FreeRTOSClock > time_point
Definition: freertos.h:126
static constexpr bool is_steady
Definition: freertos.h:128
std::chrono::milliseconds duration
Definition: freertos.h:123
duration::rep rep
Definition: freertos.h:125
static time_point now() noexcept
Definition: freertos.h:130
duration::period period
Definition: freertos.h:124
Definition: freertos.h:140
tsm::tick_rep ticks() const noexcept
Definition: freertos.h:141
Definition: freertos.h:35
static constexpr std::size_t capacity
Definition: freertos.h:36
Definition: static_ring.h:141
Definition: static_ring.h:154
Definition: coroutine.h:1162
Strong value type for semantic scheduler ticks.
Definition: ticks.h:54
constexpr tick_rep count() const noexcept
Definition: ticks.h:73