SuperTinyKernel™ RTOS 1.06.x
Lightweight, high-performance, deterministic, bare-metal C++ RTOS for resource-constrained embedded systems. MIT Open Source License.
Loading...
Searching...
No Matches
stk_c.cpp
Go to the documentation of this file.
1/*
2 * SuperTinyKernel(TM) RTOS: Lightweight High-Performance Deterministic C++ RTOS for Embedded Systems.
3 *
4 * Source: https://github.com/SuperTinyKernel-RTOS
5 *
6 * Copyright (c) 2022-2026 Neutron Code Limited <stk@neutroncode.com>. All Rights Reserved.
7 * License: MIT License, see LICENSE for a full text.
8 */
9
10#include <cstddef> // for std::size_t
11
12#include "stk.h"
13#include "sync/stk_sync.h"
14#include "memory/stk_memory.h"
15
16#include "stk_c.h"
17#include "stk_c_time.h"
18
19// Override STK_TIMER_COUNT_MAX with STK_C_TIMER_MAX.
20#undef STK_TIMER_COUNT_MAX
21#define STK_TIMER_COUNT_MAX (STK_C_TIMER_MAX)
22#include "time/stk_time.h"
23
24// Check correctness of stk_config.h
25#ifndef STK_C_KERNEL_TYPE_CPU_0
26#error "Missing STK_C_KERNEL_TYPE_CPU_0: Kernel type for CPU0 must be defined via stk_config.h or compiler flags."
27#endif
28#ifndef STK_C_CPU_COUNT
29#error "Missing STK_C_CPU_COUNT: CPU count must be defined via stk_config.h or compiler flags."
30#endif
31#ifndef STK_C_KERNEL_MAX_TASKS
32#error "Missing STK_C_KERNEL_MAX_TASKS: max task count must be defined via stk_config.h or compiler flags."
33#endif
34
35using namespace stk;
36
37#define STK_C_TASKS_MAX (STK_C_KERNEL_MAX_TASKS)
38
39// Forward decl.
40struct stk_task_t;
41
42// Cast from stk_kernel_t to IKernel without a warning.
44{
45 return reinterpret_cast<IKernel *>(reinterpret_cast<void *>(k));
46}
47
48// Cast from const stk_kernel_t to const IKernel without a warning.
50{
51 return reinterpret_cast<const IKernel *>(reinterpret_cast<const void *>(k));
52}
53
54// Cast from IKernel to stk_kernel_t without a warning.
56{
57 return reinterpret_cast<stk_kernel_t *>(reinterpret_cast<void *>(k));
58}
59
60// Interop-private helpers
61namespace stk {
63
65{
66 th->Initialize(CastCToKernelInterface(kernel), amode);
67}
68
69} // interop_c_helper
70} // stk
71
72static void FreeTask(const stk_task_t *tsk);
73
74class TaskWrapper final : public ITask
75{
76public:
77 explicit TaskWrapper() : m_func(nullptr), m_user_data(nullptr), m_stack(nullptr),
79 {}
80
85
86 // ITask
87 EAccessMode GetAccessMode() const override { return m_mode; }
88 void OnDeadlineMissed(uint32_t duration) override { (void)duration; }
89 int32_t GetWeight() const override { return m_weight; }
90 const char *GetTraceName() const override { return m_tname; }
91
92 // IStackMemory
93 const Word *GetStack() const override { return m_stack; }
94 size_t GetStackSize() const override { return m_stack_size; }
95 size_t GetStackSizeBytes() const override { return m_stack_size * sizeof(stk_word_t); }
96
97 void Initialize(stk_task_entry_t const func, void *user_data, stk_word_t *stack,
98 size_t stack_size, EAccessMode mode)
99 {
100 m_func = func;
101 m_user_data = user_data;
102 m_stack = stack;
103 m_stack_size = stack_size;
104 m_mode = mode;
106 }
107
108 void SetWeight(Weight weight) { m_weight = weight; }
109 void SetName(const char *tname) { m_tname = tname; }
110
111private:
113
114 void Run() override { m_func(m_user_data); }
115 void OnExit() override;
116
123 const char *m_tname;
124};
125
130
131static struct TaskSlot
132{
133 TaskSlot() : busy(false), task()
134 {}
135
136 bool busy;
138}
140
141// Cast from stk_task_t to TaskWrapper without a warning.
143{
144 return reinterpret_cast<stk_task_t *>(reinterpret_cast<void *>(t));
145}
146
151
152// -----------------------------------------------------------------------------
153// EventOverriderWrapper - bridges stk_event_overrider_t callbacks into the
154// C++ IPlatform::IEventOverrider interface.
155//
156// One instance is embedded per kernel slot (indexed by core_nr). The wrapper
157// is stateless when m_c == nullptr, which makes it safe to construct at file
158// scope. SetC(nullptr) is equivalent to removing the overrider.
159// -----------------------------------------------------------------------------
160
162{
163public:
164 EventOverrider() : m_cb(nullptr)
165 {}
166
171
177
180 bool IsActive() const { return (m_cb != nullptr); }
181
182 // IPlatform::IEventOverrider
183 bool OnSleep(Timeout sleep_ticks) override
184 {
185 bool is_handled = false;
186
187 if ((m_cb != nullptr) && (m_cb->on_sleep != nullptr))
188 {
189 is_handled = m_cb->on_sleep(static_cast<stk_timeout_t>(sleep_ticks), m_cb->user_data);
190 }
191
192 return is_handled;
193 }
194 bool OnHardFault() override
195 {
196 bool is_handled = false;
197
198 if ((m_cb != nullptr) && (m_cb->on_hard_fault != nullptr))
199 {
200 is_handled = m_cb->on_hard_fault(m_cb->user_data);
201 }
202
203 return is_handled;
204 }
205
206private:
208};
209
219
220static void RegisterKernel(IKernel *k, uint8_t core_nr)
221{
222 STK_ASSERT(s_KernelMap[core_nr].kernel == nullptr);
223
224 s_KernelMap[core_nr].kernel = k;
225}
226
227static void UnregisterKernel(const IKernel *k)
228{
229 for (uint32_t i = 0U; i < STK_C_CPU_COUNT; ++i)
230 {
231 if (s_KernelMap[i].kernel == k)
232 {
233 s_KernelMap[i].event_cb.SetCallback(nullptr);
234 s_KernelMap[i].kernel = nullptr;
235 break;
236 }
237 }
238}
239
241{
242 bool found = false;
243
244 for (uint32_t i = 0U; (i < STK_C_CPU_COUNT) && (!found); ++i)
245 {
246 if (s_KernelMap[i].kernel == k)
247 {
248 s_KernelMap[i].event_cb.SetCallback(overrider);
250 (overrider != nullptr) ? &s_KernelMap[i].event_cb : nullptr);
251 found = true;
252 }
253 }
254
255 // Kernel not found: stk_kernel_set_event_overrider() called before
256 // stk_kernel_create() or after stk_kernel_destroy().
257 STK_ASSERT(found);
258}
259
260// -----------------------------------------------------------------------------
261// Helpers
262// -----------------------------------------------------------------------------
263
265 void *arg,
266 stk_word_t *stack,
267 uint32_t stack_size,
268 EAccessMode amode)
269{
270 stk_task_t *tsk = nullptr;
271
273
274 for (uint32_t i = 0U; i < STK_C_TASKS_MAX; ++i)
275 {
276 if (!s_Tasks[i].busy)
277 {
278 s_Tasks[i].busy = true;
279
280 tsk = &s_Tasks[i].task;
281 tsk->handle.Initialize(entry, arg, stack, stack_size, amode);
282 break;
283 }
284 }
285
286 STK_ASSERT(tsk != nullptr);
287 return tsk;
288}
289
290void FreeTask(const stk_task_t *tsk)
291{
292 bool found = false;
293
295
296 for (uint32_t i = 0U; ((i < STK_C_TASKS_MAX) && !found); ++i)
297 {
298 if (s_Tasks[i].busy && (tsk == &s_Tasks[i].task))
299 {
300 s_Tasks[i].busy = false;
301 found = true;
302 }
303 }
304
305 STK_ASSERT(found);
306}
307
308// =============================================================================
309// C-interface
310// =============================================================================
311extern "C" {
312
313// -----------------------------------------------------------------------------
314// Kernel create/destroy wrappers
315// -----------------------------------------------------------------------------
316#define STK_PP_CAT(A, B) A##B
317#define STK_PP_CAT_EXPAND(A, B) STK_PP_CAT(A, B)
318#define STK_KERNEL_TYPE(X) STK_PP_CAT(STK_C_KERNEL_TYPE_CPU_, X)
319#define STK_KERNEL_MEM(X) STK_PP_CAT_EXPAND(kernel_, STK_PP_CAT_EXPAND(X, _mem))
320#define STK_KERNEL_CASE(X) \
321 case X: \
322 { \
323 using KernelType_ = STK_KERNEL_TYPE(X); \
324 STK_STATIC_ASSERT_N(((sizeof(KernelType_) % sizeof(Word)) == 0U), \
325 "Kernel memory size must be multiple of Word"); \
326 alignas(alignof(KernelType_)) \
327 static Word STK_KERNEL_MEM(X)[sizeof(KernelType_) / sizeof(Word)]; \
328 k = new (STK_KERNEL_MEM(X)) KernelType_(); \
329 RegisterKernel(k, static_cast<uint8_t>(X)); \
330 break; \
331 }
332
334{
335 STK_STATIC_ASSERT((STK_C_CPU_COUNT <= 8U)); // switch (core_nr) below handles cases 0..7; STK_C_KERNEL_TYPE_CPU_N is only defined up to N=7
336 STK_ASSERT(core_nr < STK_C_CPU_COUNT);
337
338 IKernel *k;
339
340 switch (core_nr)
341 {
342#ifdef STK_C_KERNEL_TYPE_CPU_0
344#endif
345#ifdef STK_C_KERNEL_TYPE_CPU_1
347#endif
348#ifdef STK_C_KERNEL_TYPE_CPU_2
350#endif
351#ifdef STK_C_KERNEL_TYPE_CPU_3
353#endif
354#ifdef STK_C_KERNEL_TYPE_CPU_4
356#endif
357#ifdef STK_C_KERNEL_TYPE_CPU_5
359#endif
360#ifdef STK_C_KERNEL_TYPE_CPU_6
362#endif
363#ifdef STK_C_KERNEL_TYPE_CPU_7
365#endif
366 default: {
367 k = nullptr;
368 break; }
369 }
370
372}
373
375{
376 STK_ASSERT(k != nullptr);
377
378 // Detach the event overrider and clear the registry entry BEFORE calling
379 // the destructor: the platform teardown inside ~IKernel() may still invoke
380 // GetPlatform() paths, and we must not leave a dangling overrider pointer
381 // registered at that point.
383}
384
385// -----------------------------------------------------------------------------
386// Kernel control wrappers
387// -----------------------------------------------------------------------------
388void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
389{
390 STK_ASSERT(k != nullptr);
391
392 CastCToKernelInterface(k)->Initialize(tick_period_us);
393}
394
396{
397 STK_ASSERT(k != nullptr);
398
400}
401
403{
404 STK_ASSERT(k != nullptr);
405
407}
408
410{
411 STK_ASSERT(k != nullptr);
412
414 const_cast<IKernel *>(CastCToKernelInterfaceConst(k))->GetSwitchStrategy());
415}
416
418{
419 STK_ASSERT(k != nullptr);
420 STK_ASSERT(tsk != nullptr);
421
423}
424
426{
427 STK_ASSERT(k != nullptr);
428 STK_ASSERT(tsk != nullptr);
429
431}
432
434{
435 STK_ASSERT(k != nullptr);
436
439}
440
442{
443 STK_ASSERT(k != nullptr);
444 STK_ASSERT(tsk != nullptr);
445
447}
448
449void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *tsk, bool *suspended)
450{
451 STK_ASSERT(k != nullptr);
452 STK_ASSERT(tsk != nullptr);
453 STK_ASSERT(suspended != nullptr);
454
455 CastCToKernelInterface(k)->SuspendTask(&tsk->handle, *suspended);
456}
457
459{
460 STK_ASSERT(k != nullptr);
461 STK_ASSERT(tsk != nullptr);
462
464}
465
466size_t stk_kernel_enumerate_tasks(stk_kernel_t *k, stk_task_t **tasks, size_t max_count)
467{
468 STK_ASSERT(k != nullptr);
469 STK_ASSERT(tasks != nullptr);
470
471 stk::ITask *itasks[STK_C_TASKS_MAX] = {};
472
473 // Determine the safe upper bound for the temporary buffer
474 const size_t requested_size = (max_count < static_cast<size_t>(STK_C_TASKS_MAX)) ? max_count :
475 static_cast<size_t>(STK_C_TASKS_MAX);
476
477 // Pass via ArrayView temporary object
478 const size_t ret_count = CastCToKernelInterface(k)->EnumerateTasks(
479 ArrayView<stk::ITask *>(itasks, requested_size));
480
481 ArrayView<stk_task_t *> output_view(tasks, max_count);
482 for (size_t i = 0U; i < ret_count; ++i)
483 {
484 output_view[i] = CastCppTaskInterfaceToC(itasks[i]);
485 }
486
487 return ret_count;
488}
489
491{
492 STK_ASSERT(k != nullptr);
493
494 return static_cast<stk_timeout_t>(CastCToKernelInterface(k)->GetPlatform()->Suspend());
495}
496
498{
499 STK_ASSERT(k != nullptr);
500
501 CastCToKernelInterface(k)->GetPlatform()->Resume(static_cast<stk::Timeout>(elapsed_ticks));
502}
503
505{
506 STK_ASSERT(k != nullptr);
507
509}
510
517
519{
520 STK_ASSERT(k != nullptr);
521
523}
524
526 stk_task_t *tsk,
527 int32_t periodicity_ticks,
528 int32_t deadline_ticks,
529 int32_t start_delay_ticks)
530{
531 STK_ASSERT(k != nullptr);
532 STK_ASSERT(tsk != nullptr);
533
535 &tsk->handle,
536 periodicity_ticks,
537 deadline_ticks,
538 start_delay_ticks);
539}
540
541// -----------------------------------------------------------------------------
542// Task creation
543// -----------------------------------------------------------------------------
545 void *arg,
546 stk_word_t *stack,
547 uint32_t stack_size)
548{
549 STK_ASSERT(entry != nullptr);
550 STK_ASSERT(stack != nullptr);
551 STK_ASSERT(stack_size != 0);
552
553 return AllocateTask(entry, arg, stack, stack_size, ACCESS_PRIVILEGED);
554}
555
557 void *arg,
558 stk_word_t *stack,
559 uint32_t stack_size)
560{
561 STK_ASSERT(entry != nullptr);
562 STK_ASSERT(stack != nullptr);
563 STK_ASSERT(stack_size != 0);
564
565 return AllocateTask(entry, arg, stack, stack_size, ACCESS_USER);
566}
567
569{
570 STK_ASSERT(tsk != nullptr);
571
572 tsk->handle.SetWeight(weight);
573}
574
575void stk_task_set_priority(stk_task_t *tsk, uint8_t priority)
576{
577 STK_ASSERT(priority <= 31U);
578
579 const stk_weight_t weight = static_cast<stk_weight_t>(priority);
580
581 stk_task_set_weight(tsk, weight);
582}
583
584void stk_task_set_name(stk_task_t *tsk, const char *tname)
585{
586 STK_ASSERT(tsk != nullptr);
587
588 tsk->handle.SetName(tname);
589}
590
591const char *stk_task_get_name(const stk_task_t *tsk)
592{
593 STK_ASSERT(tsk != nullptr);
594
595 return tsk->handle.GetTraceName();
596}
597
599{
600 STK_ASSERT(tsk != nullptr);
601
602 return tsk->handle.GetId();
603}
604
606{
607 STK_ASSERT(tsk != nullptr);
608
609 FreeTask(tsk);
610}
611
612// -----------------------------------------------------------------------------
613// Kernel services (available inside tasks)
614// -----------------------------------------------------------------------------
615stk_tid_t stk_tid(void) { return stk::GetTid(); }
617uint32_t stk_tick_resolution(void) { return stk::GetTickResolution(); }
625void stk_delay(stk_timeout_t ticks) { stk::Delay(ticks); }
626void stk_sleep(stk_timeout_t ticks) { stk::Sleep(ticks); }
631void stk_yield(void) { stk::Yield(); }
632
633// -----------------------------------------------------------------------------
634// Thread-Local Storage (TLS) API
635// -----------------------------------------------------------------------------
636#if STK_TLS
637void *stk_tls_get(void)
638{
639 return hw::GetTlsPtr<void *>();
640}
641
642void stk_tls_set(void *ptr)
643{
644 hw::SetTlsPtr(ptr);
645}
646#endif
647
648// -----------------------------------------------------------------------------
649// Critical Section - Manual Enter/Exit
650// -----------------------------------------------------------------------------
655
660
661// =============================================================================
662} // extern "C"
663// =============================================================================
Collection of memory-related primitives (stk::memory namespace).
Top-level STK include. Provides the Kernel class template and all built-in task-switching strategies.
#define __stk_forceinline
Forces compiler to always inline the decorated function, regardless of optimisation level.
Definition stk_defs.h:175
#define STK_NONCOPYABLE_CLASS(TYPE)
Disables copy construction and assignment for a class.
Definition stk_defs.h:601
#define STK_ASSERT(e)
Runtime assertion. Halts execution if the expression e evaluates to false.
Definition stk_defs.h:409
#define STK_STATIC_ASSERT(X)
Compile-time assertion. Produces a compilation error if X is false.
Definition stk_defs.h:446
#define STK_VIRT_DTOR
Makes destructors virtual and compliant to strict rules if STK_STRICT_COMPLIANCY=0.
Definition stk_defs.h:159
Collection of synchronization primitives (stk::sync namespace).
Collection of time-related primitives (stk::time namespace).
C language binding/interface for SuperTinyKernel RTOS.
C language binding for stk::time::TimerHost and stk::time::TimerHost::Timer.
static stk_kernel_t * CastCppKernelInterfaceToC(IKernel *const k)
Definition stk_c.cpp:55
static stk_task_t * AllocateTask(stk_task_entry_t entry, void *arg, stk_word_t *stack, uint32_t stack_size, EAccessMode amode)
Definition stk_c.cpp:264
#define STK_KERNEL_CASE(X)
Definition stk_c.cpp:320
static void UnregisterKernel(const IKernel *k)
Definition stk_c.cpp:227
static void RegisterKernel(IKernel *k, uint8_t core_nr)
Definition stk_c.cpp:220
static const IKernel * CastCToKernelInterfaceConst(const stk_kernel_t *const k)
Definition stk_c.cpp:49
static void FreeTask(const stk_task_t *tsk)
Definition stk_c.cpp:290
static stk_task_t * CastCppTaskInterfaceToC(ITask *const t)
Definition stk_c.cpp:142
static void SetEventOverrider(IKernel *k, stk_event_overrider_t *overrider)
Definition stk_c.cpp:240
static struct TaskSlot s_Tasks[((4))]
#define STK_C_TASKS_MAX
Definition stk_c.cpp:37
static IKernel * CastCToKernelInterface(stk_kernel_t *const k)
Definition stk_c.cpp:43
static KernelRegistryEntry s_KernelMap[(1)]
Definition stk_c.cpp:218
void stk_kernel_process_tick(stk_kernel_t *k)
Manually deliver one scheduler tick to the kernel.
Definition stk_c.cpp:504
stk_task_t * stk_task_create_user(stk_task_entry_t entry, void *arg, stk_word_t *stack, uint32_t stack_size)
Create user-mode task.
Definition stk_c.cpp:556
void stk_task_set_name(stk_task_t *tsk, const char *tname)
Assign human-readable task name (for tracing/debugging).
Definition stk_c.cpp:584
stk_cycle_t stk_hires_cycles(void)
Get raw CPU cycle counter.
Definition stk_c.cpp:622
stk_tid_t stk_tid(void)
Returns current task/thread ID (the value set by stk_task_set_id).
Definition stk_c.cpp:615
stk_tick_t stk_ticks_from_ms(stk_time_t msec)
Get ticks from milliseconds using current kernel tick resolution.
Definition stk_c.cpp:619
void stk_kernel_remove_task(stk_kernel_t *k, stk_task_t *tsk)
Remove finished task from dynamic kernel.
Definition stk_c.cpp:425
void * stk_tls_get(void)
Get thread-local pointer (platform-specific slot).
const char * stk_task_get_name(const stk_task_t *tsk)
Get human-readable task name previously set with stk_task_set_name().
Definition stk_c.cpp:591
void stk_kernel_destroy(stk_kernel_t *k)
Destroy dynamic kernel instance (only when not running).
Definition stk_c.cpp:374
void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *tsk, bool *suspended)
Suspend a task (prevent it from being scheduled).
Definition stk_c.cpp:449
struct stk_kernel_t stk_kernel_t
Opaque handle to a kernel instance.
Definition stk_c.h:126
void stk_kernel_resume(stk_kernel_t *k, stk_timeout_t elapsed_ticks)
Resume scheduling after a prior stk_kernel_suspend() call.
Definition stk_c.cpp:497
stk_timeout_t stk_kernel_suspend(stk_kernel_t *k)
Suspend scheduling (tickless idle entry point).
Definition stk_c.cpp:490
void stk_delay_ms(stk_timeout_t ms)
Busy-wait delay (other tasks continue to run).
Definition stk_c.cpp:627
void stk_yield(void)
Voluntarily give up CPU to another ready task (cooperative yield).
Definition stk_c.cpp:631
uint32_t stk_hires_frequency(void)
Get CPU clock frequency in Hz.
Definition stk_c.cpp:623
#define STK_C_CPU_COUNT
Number of kernel instances / CPU cores supported (default: 1).
Definition stk_c.h:60
void stk_kernel_resume_task(stk_kernel_t *k, stk_task_t *tsk)
Resume a previously suspended task.
Definition stk_c.cpp:458
void stk_kernel_start(stk_kernel_t *k)
Start the scheduler - never returns.
Definition stk_c.cpp:395
void stk_sleep(stk_timeout_t ticks)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:626
uint64_t stk_cycle_t
CPU cycles value.
Definition stk_c.h:118
void stk_task_set_weight(stk_task_t *tsk, stk_weight_t weight)
Set task weight (used only by Smooth Weighted Round Robin).
Definition stk_c.cpp:568
void stk_critical_section_exit(void)
Leave critical section - re-enable context switches.
Definition stk_c.cpp:656
void stk_kernel_set_event_overrider(stk_kernel_t *k, stk_event_overrider_t *overrider)
Install a platform event overrider on the kernel.
Definition stk_c.cpp:518
stk_cycle_t stk_sys_timer_count(void)
Get raw system timer counter value.
Definition stk_c.cpp:620
static stk_tick_t stk_ticks_from_ms_r(stk_time_t msec, uint32_t resolution)
Get ticks from milliseconds using an explicit tick resolution.
Definition stk_c.h:629
stk_tid_t stk_task_get_id(const stk_task_t *tsk)
Get the unique identifier of a task.
Definition stk_c.cpp:598
uint32_t stk_tick_resolution(void)
Returns how many microseconds correspond to one kernel tick.
Definition stk_c.cpp:617
uint32_t stk_sys_timer_frequency(void)
Get system timer frequency in Hz.
Definition stk_c.cpp:621
void stk_kernel_schedule_task_removal(stk_kernel_t *k, stk_task_t *tsk)
Schedule removal of a running task from the kernel on the next tick.
Definition stk_c.cpp:441
void stk_sleep_ms(stk_timeout_t ms)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:628
size_t stk_kernel_enumerate_tasks(stk_kernel_t *k, stk_task_t **tasks, size_t max_count)
Enumerate all currently active tasks.
Definition stk_c.cpp:466
void stk_kernel_add_task(stk_kernel_t *k, stk_task_t *tsk)
Add task to non-HRT kernel (static or dynamic).
Definition stk_c.cpp:417
void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
Initialize kernel with given tick period.
Definition stk_c.cpp:388
stk_tick_t stk_hires_time_us(void)
Get elapsed time in microseconds from the high-resolution clock.
Definition stk_c.cpp:624
void(* stk_task_entry_t)(void *arg)
Task entry point function type.
Definition stk_c.h:143
stk_kernel_state_t
Kernel state.
Definition stk_c.h:364
void stk_tls_set(void *ptr)
Set thread-local pointer.
stk_task_t * stk_task_create_privileged(stk_task_entry_t entry, void *arg, stk_word_t *stack, uint32_t stack_size)
Create privileged-mode (kernel-mode) task.
Definition stk_c.cpp:544
stk_tick_t stk_ticks(void)
Returns number of ticks elapsed since kernel start.
Definition stk_c.cpp:616
void stk_task_set_priority(stk_task_t *tsk, uint8_t priority)
Set task priority (used only by Fixed Priority scheduler).
Definition stk_c.cpp:575
stk_word_t stk_tid_t
Task id.
Definition stk_c.h:98
int64_t stk_tick_t
Ticks value.
Definition stk_c.h:103
stk_kernel_t * stk_kernel_create(uint8_t core_nr)
Create kernel.
Definition stk_c.cpp:333
uintptr_t stk_word_t
CPU register type.
Definition stk_c.h:94
bool stk_kernel_is_started(const stk_kernel_t *k)
Check whether the scheduler is currently running (first task switch has occurred).
Definition stk_c.cpp:433
void stk_sleep_cancel(stk_tid_t tid)
Cancel the sleep of a task, waking it immediately.
Definition stk_c.cpp:630
int64_t stk_time_t
Time value.
Definition stk_c.h:108
stk_time_t stk_time_now_ms(void)
Returns current time in milliseconds since kernel start.
Definition stk_c.cpp:618
int32_t stk_weight_t
Task weight value.
Definition stk_c.h:122
void stk_kernel_add_task_hrt(stk_kernel_t *k, stk_task_t *tsk, int32_t periodicity_ticks, int32_t deadline_ticks, int32_t start_delay_ticks)
Add task with HRT timing parameters (HRT kernels only).
Definition stk_c.cpp:525
stk_kernel_state_t stk_kernel_get_state(const stk_kernel_t *k)
Get state of the scheduler.
Definition stk_c.cpp:402
void stk_task_destroy(stk_task_t *tsk)
Destroy dynamically created task object.
Definition stk_c.cpp:605
bool stk_sleep_until(stk_tick_t ts)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:629
void stk_critical_section_enter(void)
Enter critical section - disable context switches on current core.
Definition stk_c.cpp:651
void stk_kernel_process_hard_fault(stk_kernel_t *k)
Trigger a kernel hard fault (safe-state handler).
Definition stk_c.cpp:511
int32_t stk_timeout_t
Timeout value.
Definition stk_c.h:113
void stk_delay(stk_timeout_t ticks)
Busy-wait delay (other tasks continue to run).
Definition stk_c.cpp:625
bool stk_kernel_is_schedulable(const stk_kernel_t *k)
Test whether currently configured task set is schedulable.
Definition stk_c.cpp:409
Namespace of STK package.
uintptr_t Word
Native processor word type.
Definition stk_common.h:115
static void Yield()
Notify scheduler to switch to the next runnable task.
Definition stk_helper.h:408
static void Sleep(Timeout tick_count)
Put calling process into a sleep state.
Definition stk_helper.h:364
static void SleepCancel(TId task_id)
Cancel sleep of the task.
Definition stk_helper.h:399
static void SleepMs(Timeout ms)
Put calling process into a sleep state.
Definition stk_helper.h:377
EAccessMode
Hardware access mode by the user task.
Definition stk_common.h:32
@ ACCESS_USER
Unprivileged access mode (access to some hardware is restricted, see CPU manual for details).
Definition stk_common.h:33
@ ACCESS_PRIVILEGED
Privileged access mode (access to hardware is fully unrestricted).
Definition stk_common.h:34
static Time GetTimeNowMs()
Get current time in milliseconds since kernel start.
Definition stk_helper.h:330
static void DelayMs(Timeout ms)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:430
int32_t Timeout
Timeout time (ticks).
Definition stk_common.h:125
static bool SleepUntil(Ticks timestamp)
Put calling process into a sleep state until the specified timestamp.
Definition stk_helper.h:389
constexpr Weight DEFAULT_WEIGHT
Weight value: default weight of value (1) (see SwitchStrategySmoothWeightedRoundRobin).
Definition stk_common.h:199
static uint32_t GetTickResolution()
Get number of microseconds in one tick.
Definition stk_helper.h:253
static uint32_t GetSysTimerFrequency()
Get system timer frequency.
Definition stk_helper.h:353
static void Delay(Timeout tick_count)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:419
static Ticks GetTicks()
Get number of ticks elapsed since kernel start.
Definition stk_helper.h:319
static TId GetTid()
Get task/thread Id of the calling task.
Definition stk_helper.h:243
static Cycles GetSysTimerCount()
Get system timer count value.
Definition stk_helper.h:344
int32_t Weight
Weight value (aka priority).
Definition stk_common.h:145
void InitializeTimerHost(stk_kernel_t *kernel, stk::time::TimerHost *th, EAccessMode amode)
Definition stk_c.cpp:64
static void Enter()
Enter a critical section.
static void Exit()
Exit a critical section.
static uint32_t GetFrequency()
Get clock frequency.
static __stk_forceinline Ticks GetTimeUs()
Get elapsed time in microseconds.
Definition stk_arch.h:497
static Cycles GetCycles()
Get number of clock cycles elapsed.
Lightweight, non-owning view over a contiguous sequence of elements.
Definition stk_common.h:226
Interface for a user task.
Definition stk_common.h:599
TId GetId() const
Get task Id set by application.
Definition stk_helper.h:234
virtual void ProcessTick()=0
Process one tick.
virtual Timeout Suspend()=0
Suspend scheduling.
virtual void Resume(Timeout elapsed_ticks)=0
Resume scheduling after a prior Suspend() call.
virtual void SetEventOverrider(IEventOverrider *overrider)=0
Set platform event overrider.
virtual void ProcessHardFault()=0
Cause a hard fault of the system.
Interface for a platform event overrider.
Definition stk_common.h:853
Interface for the implementation of the kernel of the scheduler. It supports Soft and Hard Real-Time ...
EKernelState
Kernel state.
@ KSTATE_RUNNING
Initialized and running, IKernel::Start() was called successfully.
@ KSTATE_SUSPENDED
Scheduling is suspended with IKernelService::Suspend().
virtual void ResumeTask(ITask *user_task)=0
Resume task.
virtual void SuspendTask(ITask *user_task, bool &suspended)=0
Suspend task.
virtual IPlatform * GetPlatform()=0
Get platform driver instance.
virtual size_t EnumerateTasks(ArrayView< ITask * > user_tasks)=0
Enumerate user tasks.
virtual EKernelState GetState() const =0
Get a snapshot of the kernel state.
virtual void RemoveTask(ITask *user_task)=0
Remove a previously added task from the kernel before Start().
virtual void AddTask(ITask *user_task)=0
Add user task.
virtual void ScheduleTaskRemoval(ITask *user_task)=0
Schedule task removal from scheduling (exit).
virtual void Initialize(uint32_t resolution_us=PERIODICITY_DEFAULT)=0
Initialize kernel.
virtual void Start()=0
Start kernel scheduling.
static SchedulabilityCheckResult< TTaskCount > IsSchedulableWCRT(const ITaskSwitchStrategy *strategy)
Perform WCRT schedulability analysis on the task set registered with strategy.
RAII-style low-level synchronization primitive for atomic code execution. Used as building brick for ...
Definition stk_sync_cs.h:54
Software timer multiplexer that manages multiple Timer instances on top of a small fixed set of kerne...
void Initialize(IKernel *kernel, EAccessMode mode)
Initialize timer host instance.
C-level callback table that mirrors stk::IPlatform::IEventOverrider.
Definition stk_c.h:490
stk_word_t * m_stack
Definition stk_c.cpp:119
void SetName(const char *tname)
Definition stk_c.cpp:109
const char * m_tname
Definition stk_c.cpp:123
size_t GetStackSize() const override
Get number of elements of the stack memory array.
Definition stk_c.cpp:94
void OnDeadlineMissed(uint32_t duration) override
Called by the scheduler if deadline of the task is missed when Kernel is operating in Hard Real-Time ...
Definition stk_c.cpp:88
stk_task_entry_t m_func
Definition stk_c.cpp:117
EAccessMode m_mode
Definition stk_c.cpp:121
Weight m_weight
Definition stk_c.cpp:122
size_t m_stack_size
Definition stk_c.cpp:120
void * m_user_data
Definition stk_c.cpp:118
const char * GetTraceName() const override
Get task trace name set by application.
Definition stk_c.cpp:90
TaskWrapper()
Definition stk_c.cpp:77
void OnExit() override
Called by the kernel before removal from the scheduling (see stk::KERNEL_DYNAMIC).
Definition stk_c.cpp:147
~TaskWrapper()=default
Destructor.
size_t GetStackSizeBytes() const override
Get size of the memory in bytes.
Definition stk_c.cpp:95
int32_t GetWeight() const override
Get static base weight of the task.
Definition stk_c.cpp:89
const Word * GetStack() const override
Get pointer to the stack memory.
Definition stk_c.cpp:93
void SetWeight(Weight weight)
Definition stk_c.cpp:108
EAccessMode GetAccessMode() const override
Get hardware access mode of the user task.
Definition stk_c.cpp:87
void Run() override
Entry point of the user task.
Definition stk_c.cpp:114
void Initialize(stk_task_entry_t const func, void *user_data, stk_word_t *stack, size_t stack_size, EAccessMode mode)
Definition stk_c.cpp:97
TaskWrapper handle
Definition stk_c.cpp:128
stk_task_t task
Definition stk_c.cpp:137
TaskSlot()
Definition stk_c.cpp:133
bool busy
Definition stk_c.cpp:136
bool OnSleep(Timeout sleep_ticks) override
Called by the Kernel when it is entering a sleep mode.
Definition stk_c.cpp:183
void SetCallback(stk_event_overrider_t *c)
Bind or unbind a C-level overrider struct.
Definition stk_c.cpp:176
bool OnHardFault() override
Called by Kernel when hard fault happens.
Definition stk_c.cpp:194
bool IsActive() const
Returns true when a C-level struct is currently bound.
Definition stk_c.cpp:180
~EventOverrider()=default
Destructor.
stk_event_overrider_t * m_cb
Definition stk_c.cpp:207
IKernel * kernel
Definition stk_c.cpp:215
EventOverrider event_cb
Definition stk_c.cpp:216