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
96 void Initialize(stk_task_entry_t const func, void *user_data, stk_word_t *stack,
97 size_t stack_size, EAccessMode mode)
98 {
99 m_func = func;
100 m_user_data = user_data;
101 m_stack = stack;
102 m_stack_size = stack_size;
103 m_mode = mode;
105 }
106
107 void SetWeight(Weight weight) { m_weight = weight; }
108 void SetName(const char *tname) { m_tname = tname; }
109
110private:
112
113 void Run() override { m_func(m_user_data); }
114 void OnExit() override;
115
122 const char *m_tname;
123};
124
129
130static struct TaskSlot
131{
132 TaskSlot() : busy(false), task()
133 {}
134
135 bool busy;
137}
139
140// Cast from stk_task_t to TaskWrapper without a warning.
142{
143 return reinterpret_cast<stk_task_t *>(reinterpret_cast<void *>(t));
144}
145
150
151// -----------------------------------------------------------------------------
152// EventOverriderWrapper - bridges stk_event_overrider_t callbacks into the
153// C++ IPlatform::IEventOverrider interface.
154//
155// One instance is embedded per kernel slot (indexed by core_nr). The wrapper
156// is stateless when m_c == nullptr, which makes it safe to construct at file
157// scope. SetC(nullptr) is equivalent to removing the overrider.
158// -----------------------------------------------------------------------------
159
161{
162public:
163 EventOverrider() : m_cb(nullptr)
164 {}
165
170
176
179 bool IsActive() const { return (m_cb != nullptr); }
180
181 // IPlatform::IEventOverrider
182 bool OnSleep(Timeout sleep_ticks) override
183 {
184 bool is_handled = false;
185
186 if ((m_cb != nullptr) && (m_cb->on_sleep != nullptr))
187 {
188 is_handled = m_cb->on_sleep(static_cast<stk_timeout_t>(sleep_ticks), m_cb->user_data);
189 }
190
191 return is_handled;
192 }
193 bool OnHardFault() override
194 {
195 bool is_handled = false;
196
197 if ((m_cb != nullptr) && (m_cb->on_hard_fault != nullptr))
198 {
199 is_handled = m_cb->on_hard_fault(m_cb->user_data);
200 }
201
202 return is_handled;
203 }
204
205private:
207};
208
218
219static void RegisterKernel(IKernel *k, uint8_t core_nr)
220{
221 STK_ASSERT(s_KernelMap[core_nr].kernel == nullptr);
222
223 s_KernelMap[core_nr].kernel = k;
224}
225
226static void UnregisterKernel(const IKernel *k)
227{
228 for (uint32_t i = 0U; i < STK_C_CPU_COUNT; ++i)
229 {
230 if (s_KernelMap[i].kernel == k)
231 {
232 s_KernelMap[i].event_cb.SetCallback(nullptr);
233 s_KernelMap[i].kernel = nullptr;
234 break;
235 }
236 }
237}
238
240{
241 bool found = false;
242
243 for (uint32_t i = 0U; (i < STK_C_CPU_COUNT) && (!found); ++i)
244 {
245 if (s_KernelMap[i].kernel == k)
246 {
247 s_KernelMap[i].event_cb.SetCallback(overrider);
249 (overrider != nullptr) ? &s_KernelMap[i].event_cb : nullptr);
250 found = true;
251 }
252 }
253
254 // Kernel not found: stk_kernel_set_event_overrider() called before
255 // stk_kernel_create() or after stk_kernel_destroy().
256 STK_ASSERT(found);
257}
258
259// -----------------------------------------------------------------------------
260// Helpers
261// -----------------------------------------------------------------------------
262
264 void *arg,
265 stk_word_t *stack,
266 uint32_t stack_size,
267 EAccessMode amode)
268{
269 stk_task_t *tsk = nullptr;
270
272
273 for (uint32_t i = 0U; i < STK_C_TASKS_MAX; ++i)
274 {
275 if (!s_Tasks[i].busy)
276 {
277 s_Tasks[i].busy = true;
278
279 tsk = &s_Tasks[i].task;
280 tsk->handle.Initialize(entry, arg, stack, stack_size, amode);
281 break;
282 }
283 }
284
285 STK_ASSERT(tsk != nullptr);
286 return tsk;
287}
288
289void FreeTask(const stk_task_t *tsk)
290{
291 bool found = false;
292
294
295 for (uint32_t i = 0U; ((i < STK_C_TASKS_MAX) && !found); ++i)
296 {
297 if (s_Tasks[i].busy && (tsk == &s_Tasks[i].task))
298 {
299 s_Tasks[i].busy = false;
300 found = true;
301 }
302 }
303
304 STK_ASSERT(found);
305}
306
307// =============================================================================
308// C-interface
309// =============================================================================
310extern "C" {
311
312// -----------------------------------------------------------------------------
313// Kernel create/destroy wrappers
314// -----------------------------------------------------------------------------
315#define STK_PP_CAT(A, B) A##B
316#define STK_PP_CAT_EXPAND(A, B) STK_PP_CAT(A, B)
317#define STK_KERNEL_TYPE(X) STK_PP_CAT(STK_C_KERNEL_TYPE_CPU_, X)
318#define STK_KERNEL_MEM(X) STK_PP_CAT_EXPAND(kernel_, STK_PP_CAT_EXPAND(X, _mem))
319#define STK_KERNEL_CASE(X) \
320 case X: \
321 { \
322 using KernelType_ = STK_KERNEL_TYPE(X); \
323 STK_STATIC_ASSERT_N(((sizeof(KernelType_) % sizeof(Word)) == 0U), \
324 "Kernel memory size must be multiple of Word"); \
325 alignas(alignof(KernelType_)) \
326 static Word STK_KERNEL_MEM(X)[sizeof(KernelType_) / sizeof(Word)]; \
327 k = new (STK_KERNEL_MEM(X)) KernelType_(); \
328 RegisterKernel(k, static_cast<uint8_t>(X)); \
329 break; \
330 }
331
333{
334 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
335 STK_ASSERT(core_nr < STK_C_CPU_COUNT);
336
337 IKernel *k;
338
339 switch (core_nr)
340 {
341#ifdef STK_C_KERNEL_TYPE_CPU_0
343#endif
344#ifdef STK_C_KERNEL_TYPE_CPU_1
346#endif
347#ifdef STK_C_KERNEL_TYPE_CPU_2
349#endif
350#ifdef STK_C_KERNEL_TYPE_CPU_3
352#endif
353#ifdef STK_C_KERNEL_TYPE_CPU_4
355#endif
356#ifdef STK_C_KERNEL_TYPE_CPU_5
358#endif
359#ifdef STK_C_KERNEL_TYPE_CPU_6
361#endif
362#ifdef STK_C_KERNEL_TYPE_CPU_7
364#endif
365 default: {
366 k = nullptr;
367 break; }
368 }
369
371}
372
374{
375 STK_ASSERT(k != nullptr);
376
377 // Detach the event overrider and clear the registry entry BEFORE calling
378 // the destructor: the platform teardown inside ~IKernel() may still invoke
379 // GetPlatform() paths, and we must not leave a dangling overrider pointer
380 // registered at that point.
382}
383
384// -----------------------------------------------------------------------------
385// Kernel control wrappers
386// -----------------------------------------------------------------------------
387void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
388{
389 STK_ASSERT(k != nullptr);
390
391 CastCToKernelInterface(k)->Initialize(tick_period_us);
392}
393
395{
396 STK_ASSERT(k != nullptr);
397
399}
400
402{
403 STK_ASSERT(k != nullptr);
404
406}
407
409{
410 STK_ASSERT(k != nullptr);
411
413 const_cast<IKernel *>(CastCToKernelInterfaceConst(k))->GetSwitchStrategy());
414}
415
417{
418 STK_ASSERT(k != nullptr);
419 STK_ASSERT(tsk != nullptr);
420
422}
423
425{
426 STK_ASSERT(k != nullptr);
427 STK_ASSERT(tsk != nullptr);
428
430}
431
433{
434 STK_ASSERT(k != nullptr);
435
438}
439
441{
442 STK_ASSERT(k != nullptr);
443 STK_ASSERT(tsk != nullptr);
444
446}
447
448void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *tsk, bool *suspended)
449{
450 STK_ASSERT(k != nullptr);
451 STK_ASSERT(tsk != nullptr);
452 STK_ASSERT(suspended != nullptr);
453
454 CastCToKernelInterface(k)->SuspendTask(&tsk->handle, *suspended);
455}
456
458{
459 STK_ASSERT(k != nullptr);
460 STK_ASSERT(tsk != nullptr);
461
463}
464
465size_t stk_kernel_enumerate_tasks(stk_kernel_t *k, stk_task_t **tasks, size_t max_count)
466{
467 STK_ASSERT(k != nullptr);
468 STK_ASSERT(tasks != nullptr);
469
470 stk::ITask *itasks[STK_C_TASKS_MAX] = {};
471
472 // Determine the safe upper bound for the temporary buffer
473 const size_t requested_size = (max_count < static_cast<size_t>(STK_C_TASKS_MAX)) ? max_count :
474 static_cast<size_t>(STK_C_TASKS_MAX);
475
476 // Pass via ArrayView temporary object
477 const size_t ret_count = CastCToKernelInterface(k)->EnumerateTasks(
478 ArrayView<stk::ITask *>(itasks, requested_size));
479
480 ArrayView<stk_task_t *> output_view(tasks, max_count);
481 for (size_t i = 0U; i < ret_count; ++i)
482 {
483 output_view[i] = CastCppTaskInterfaceToC(itasks[i]);
484 }
485
486 return ret_count;
487}
488
490{
491 STK_ASSERT(k != nullptr);
492
493 return static_cast<stk_timeout_t>(CastCToKernelInterface(k)->GetPlatform()->Suspend());
494}
495
497{
498 STK_ASSERT(k != nullptr);
499
500 CastCToKernelInterface(k)->GetPlatform()->Resume(static_cast<stk::Timeout>(elapsed_ticks));
501}
502
504{
505 STK_ASSERT(k != nullptr);
506
508}
509
516
518{
519 STK_ASSERT(k != nullptr);
520
522}
523
525 stk_task_t *tsk,
526 int32_t periodicity_ticks,
527 int32_t deadline_ticks,
528 int32_t start_delay_ticks)
529{
530 STK_ASSERT(k != nullptr);
531 STK_ASSERT(tsk != nullptr);
532
534 &tsk->handle,
535 periodicity_ticks,
536 deadline_ticks,
537 start_delay_ticks);
538}
539
540// -----------------------------------------------------------------------------
541// Task creation
542// -----------------------------------------------------------------------------
544 void *arg,
545 stk_word_t *stack,
546 uint32_t stack_size)
547{
548 STK_ASSERT(entry != nullptr);
549 STK_ASSERT(stack != nullptr);
550 STK_ASSERT(stack_size != 0);
551
552 return AllocateTask(entry, arg, stack, stack_size, ACCESS_PRIVILEGED);
553}
554
556 void *arg,
557 stk_word_t *stack,
558 uint32_t stack_size)
559{
560 STK_ASSERT(entry != nullptr);
561 STK_ASSERT(stack != nullptr);
562 STK_ASSERT(stack_size != 0);
563
564 return AllocateTask(entry, arg, stack, stack_size, ACCESS_USER);
565}
566
568{
569 STK_ASSERT(tsk != nullptr);
570
571 tsk->handle.SetWeight(weight);
572}
573
574void stk_task_set_priority(stk_task_t *tsk, uint8_t priority)
575{
576 STK_ASSERT(priority <= 31U);
577
578 const stk_weight_t weight = static_cast<stk_weight_t>(priority);
579
580 stk_task_set_weight(tsk, weight);
581}
582
583void stk_task_set_name(stk_task_t *tsk, const char *tname)
584{
585 STK_ASSERT(tsk != nullptr);
586
587 tsk->handle.SetName(tname);
588}
589
590const char *stk_task_get_name(const stk_task_t *tsk)
591{
592 STK_ASSERT(tsk != nullptr);
593
594 return tsk->handle.GetTraceName();
595}
596
598{
599 STK_ASSERT(tsk != nullptr);
600
601 return tsk->handle.GetId();
602}
603
605{
606 STK_ASSERT(tsk != nullptr);
607
608 FreeTask(tsk);
609}
610
611// -----------------------------------------------------------------------------
612// Kernel services (available inside tasks)
613// -----------------------------------------------------------------------------
614stk_tid_t stk_tid(void) { return stk::GetTid(); }
616uint32_t stk_tick_resolution(void) { return stk::GetTickResolution(); }
624void stk_delay(stk_timeout_t ticks) { stk::Delay(ticks); }
625void stk_sleep(stk_timeout_t ticks) { stk::Sleep(ticks); }
630void stk_yield(void) { stk::Yield(); }
631
632// -----------------------------------------------------------------------------
633// Thread-Local Storage (TLS) API
634// -----------------------------------------------------------------------------
635#if STK_TLS
636void *stk_tls_get(void)
637{
638 return hw::GetTlsPtr<void *>();
639}
640
641void stk_tls_set(void *ptr)
642{
643 hw::SetTlsPtr(ptr);
644}
645#endif
646
647// -----------------------------------------------------------------------------
648// Critical Section - Manual Enter/Exit
649// -----------------------------------------------------------------------------
654
659
660// =============================================================================
661} // extern "C"
662// =============================================================================
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:263
#define STK_KERNEL_CASE(X)
Definition stk_c.cpp:319
static void UnregisterKernel(const IKernel *k)
Definition stk_c.cpp:226
static void RegisterKernel(IKernel *k, uint8_t core_nr)
Definition stk_c.cpp:219
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:289
static stk_task_t * CastCppTaskInterfaceToC(ITask *const t)
Definition stk_c.cpp:141
static void SetEventOverrider(IKernel *k, stk_event_overrider_t *overrider)
Definition stk_c.cpp:239
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:217
void stk_kernel_process_tick(stk_kernel_t *k)
Manually deliver one scheduler tick to the kernel.
Definition stk_c.cpp:503
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:555
void stk_task_set_name(stk_task_t *tsk, const char *tname)
Assign human-readable task name (for tracing/debugging).
Definition stk_c.cpp:583
stk_cycle_t stk_hires_cycles(void)
Get raw CPU cycle counter.
Definition stk_c.cpp:621
stk_tid_t stk_tid(void)
Returns current task/thread ID (the value set by stk_task_set_id).
Definition stk_c.cpp:614
stk_tick_t stk_ticks_from_ms(stk_time_t msec)
Get ticks from milliseconds using current kernel tick resolution.
Definition stk_c.cpp:618
void stk_kernel_remove_task(stk_kernel_t *k, stk_task_t *tsk)
Remove finished task from dynamic kernel.
Definition stk_c.cpp:424
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:590
void stk_kernel_destroy(stk_kernel_t *k)
Destroy dynamic kernel instance (only when not running).
Definition stk_c.cpp:373
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:448
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:496
stk_timeout_t stk_kernel_suspend(stk_kernel_t *k)
Suspend scheduling (tickless idle entry point).
Definition stk_c.cpp:489
void stk_delay_ms(stk_timeout_t ms)
Busy-wait delay (other tasks continue to run).
Definition stk_c.cpp:626
void stk_yield(void)
Voluntarily give up CPU to another ready task (cooperative yield).
Definition stk_c.cpp:630
uint32_t stk_hires_frequency(void)
Get CPU clock frequency in Hz.
Definition stk_c.cpp:622
#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:457
void stk_kernel_start(stk_kernel_t *k)
Start the scheduler - never returns.
Definition stk_c.cpp:394
void stk_sleep(stk_timeout_t ticks)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:625
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:567
void stk_critical_section_exit(void)
Leave critical section - re-enable context switches.
Definition stk_c.cpp:655
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:517
stk_cycle_t stk_sys_timer_count(void)
Get raw system timer counter value.
Definition stk_c.cpp:619
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:597
uint32_t stk_tick_resolution(void)
Returns how many microseconds correspond to one kernel tick.
Definition stk_c.cpp:616
uint32_t stk_sys_timer_frequency(void)
Get system timer frequency in Hz.
Definition stk_c.cpp:620
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:440
void stk_sleep_ms(stk_timeout_t ms)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:627
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:465
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:416
void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
Initialize kernel with given tick period.
Definition stk_c.cpp:387
stk_tick_t stk_hires_time_us(void)
Get elapsed time in microseconds from the high-resolution clock.
Definition stk_c.cpp:623
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:543
stk_tick_t stk_ticks(void)
Returns number of ticks elapsed since kernel start.
Definition stk_c.cpp:615
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:574
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:332
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:432
void stk_sleep_cancel(stk_tid_t tid)
Cancel the sleep of a task, waking it immediately.
Definition stk_c.cpp:629
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:617
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:524
stk_kernel_state_t stk_kernel_get_state(const stk_kernel_t *k)
Get state of the scheduler.
Definition stk_c.cpp:401
void stk_task_destroy(stk_task_t *tsk)
Destroy dynamically created task object.
Definition stk_c.cpp:604
bool stk_sleep_until(stk_tick_t ts)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:628
void stk_critical_section_enter(void)
Enter critical section - disable context switches on current core.
Definition stk_c.cpp:650
void stk_kernel_process_hard_fault(stk_kernel_t *k)
Trigger a kernel hard fault (safe-state handler).
Definition stk_c.cpp:510
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:624
bool stk_kernel_is_schedulable(const stk_kernel_t *k)
Test whether currently configured task set is schedulable.
Definition stk_c.cpp:408
Namespace of STK package.
uintptr_t Word
Native processor word type.
Definition stk_common.h:136
static void Yield()
Notify scheduler to switch to the next runnable task.
Definition stk_helper.h:402
static void Sleep(Timeout tick_count)
Put calling process into a sleep state.
Definition stk_helper.h:358
static void SleepCancel(TId task_id)
Cancel sleep of the task.
Definition stk_helper.h:393
static void SleepMs(Timeout ms)
Put calling process into a sleep state.
Definition stk_helper.h:371
EAccessMode
Hardware access modes by the task.
Definition stk_common.h:42
@ ACCESS_USER
Unprivileged access mode (access to some hardware is restricted, see CPU manual for details)....
Definition stk_common.h:43
@ ACCESS_PRIVILEGED
Privileged access mode (access to hardware is fully unrestricted).
Definition stk_common.h:44
static Time GetTimeNowMs()
Get current time in milliseconds since kernel start.
Definition stk_helper.h:324
static void DelayMs(Timeout ms)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:424
int32_t Timeout
Timeout time (ticks).
Definition stk_common.h:146
static bool SleepUntil(Ticks timestamp)
Put calling process into a sleep state until the specified timestamp.
Definition stk_helper.h:383
constexpr Weight DEFAULT_WEIGHT
Weight value: default weight of value (1) (see SwitchStrategySmoothWeightedRoundRobin).
Definition stk_common.h:220
static uint32_t GetTickResolution()
Get number of microseconds in one tick.
Definition stk_helper.h:247
static uint32_t GetSysTimerFrequency()
Get system timer frequency.
Definition stk_helper.h:347
static void Delay(Timeout tick_count)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:413
static Ticks GetTicks()
Get number of ticks elapsed since kernel start.
Definition stk_helper.h:313
static TId GetTid()
Get task/thread Id of the calling task.
Definition stk_helper.h:237
static Cycles GetSysTimerCount()
Get system timer count value.
Definition stk_helper.h:338
int32_t Weight
Weight value (aka priority).
Definition stk_common.h:166
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:503
static Cycles GetCycles()
Get number of clock cycles elapsed.
Lightweight, non-owning view over a contiguous sequence of elements.
Definition stk_common.h:247
Interface for a user task.
Definition stk_common.h:670
TId GetId() const
Get task Id set by application.
Definition stk_helper.h:228
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:930
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 when it is not started.
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:118
void SetName(const char *tname)
Definition stk_c.cpp:108
const char * m_tname
Definition stk_c.cpp:122
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:116
EAccessMode m_mode
Definition stk_c.cpp:120
Weight m_weight
Definition stk_c.cpp:121
size_t m_stack_size
Definition stk_c.cpp:119
void * m_user_data
Definition stk_c.cpp:117
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:146
~TaskWrapper()=default
Destructor.
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:107
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:113
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:96
TaskWrapper handle
Definition stk_c.cpp:127
stk_task_t task
Definition stk_c.cpp:136
TaskSlot()
Definition stk_c.cpp:132
bool busy
Definition stk_c.cpp:135
bool OnSleep(Timeout sleep_ticks) override
Called by the Kernel when it is entering a sleep mode.
Definition stk_c.cpp:182
void SetCallback(stk_event_overrider_t *c)
Bind or unbind a C-level overrider struct.
Definition stk_c.cpp:175
bool OnHardFault() override
Called by Kernel when hard fault happens.
Definition stk_c.cpp:193
bool IsActive() const
Returns true when a C-level struct is currently bound.
Definition stk_c.cpp:179
~EventOverrider()=default
Destructor.
stk_event_overrider_t * m_cb
Definition stk_c.cpp:206
IKernel * kernel
Definition stk_c.cpp:214
EventOverrider event_cb
Definition stk_c.cpp:215