20#undef STK_TIMER_COUNT_MAX
21#define STK_TIMER_COUNT_MAX (STK_C_TIMER_MAX)
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."
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."
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."
37#define STK_C_TASKS_MAX (STK_C_KERNEL_MAX_TASKS)
45 return reinterpret_cast<IKernel *
>(
reinterpret_cast<void *
>(k));
51 return reinterpret_cast<const IKernel *
>(
reinterpret_cast<const void *
>(k));
57 return reinterpret_cast<stk_kernel_t *
>(
reinterpret_cast<void *
>(k));
144 return reinterpret_cast<stk_task_t *
>(
reinterpret_cast<void *
>(t));
185 bool is_handled =
false;
187 if ((
m_cb !=
nullptr) && (
m_cb->on_sleep !=
nullptr))
196 bool is_handled =
false;
198 if ((
m_cb !=
nullptr) && (
m_cb->on_hard_fault !=
nullptr))
200 is_handled =
m_cb->on_hard_fault(
m_cb->user_data);
250 (overrider !=
nullptr) ? &
s_KernelMap[i].event_cb :
nullptr);
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) \
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)); \
342#ifdef STK_C_KERNEL_TYPE_CPU_0
345#ifdef STK_C_KERNEL_TYPE_CPU_1
348#ifdef STK_C_KERNEL_TYPE_CPU_2
351#ifdef STK_C_KERNEL_TYPE_CPU_3
354#ifdef STK_C_KERNEL_TYPE_CPU_4
357#ifdef STK_C_KERNEL_TYPE_CPU_5
360#ifdef STK_C_KERNEL_TYPE_CPU_6
363#ifdef STK_C_KERNEL_TYPE_CPU_7
474 const size_t requested_size = (max_count < static_cast<size_t>(
STK_C_TASKS_MAX)) ? max_count :
482 for (
size_t i = 0U; i < ret_count; ++i)
527 int32_t periodicity_ticks,
528 int32_t deadline_ticks,
529 int32_t start_delay_ticks)
639 return hw::GetTlsPtr<void *>();
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.
#define STK_NONCOPYABLE_CLASS(TYPE)
Disables copy construction and assignment for a class.
#define STK_ASSERT(e)
Runtime assertion. Halts execution if the expression e evaluates to false.
#define STK_STATIC_ASSERT(X)
Compile-time assertion. Produces a compilation error if X is false.
#define STK_VIRT_DTOR
Makes destructors virtual and compliant to strict rules if STK_STRICT_COMPLIANCY=0.
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)
static stk_task_t * AllocateTask(stk_task_entry_t entry, void *arg, stk_word_t *stack, uint32_t stack_size, EAccessMode amode)
#define STK_KERNEL_CASE(X)
static void UnregisterKernel(const IKernel *k)
static void RegisterKernel(IKernel *k, uint8_t core_nr)
static const IKernel * CastCToKernelInterfaceConst(const stk_kernel_t *const k)
static void FreeTask(const stk_task_t *tsk)
static stk_task_t * CastCppTaskInterfaceToC(ITask *const t)
static void SetEventOverrider(IKernel *k, stk_event_overrider_t *overrider)
static struct TaskSlot s_Tasks[((4))]
static IKernel * CastCToKernelInterface(stk_kernel_t *const k)
static KernelRegistryEntry s_KernelMap[(1)]
void stk_kernel_process_tick(stk_kernel_t *k)
Manually deliver one scheduler tick to the kernel.
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.
void stk_task_set_name(stk_task_t *tsk, const char *tname)
Assign human-readable task name (for tracing/debugging).
stk_cycle_t stk_hires_cycles(void)
Get raw CPU cycle counter.
stk_tid_t stk_tid(void)
Returns current task/thread ID (the value set by stk_task_set_id).
stk_tick_t stk_ticks_from_ms(stk_time_t msec)
Get ticks from milliseconds using current kernel tick resolution.
void stk_kernel_remove_task(stk_kernel_t *k, stk_task_t *tsk)
Remove finished task from dynamic kernel.
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().
void stk_kernel_destroy(stk_kernel_t *k)
Destroy dynamic kernel instance (only when not running).
void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *tsk, bool *suspended)
Suspend a task (prevent it from being scheduled).
struct stk_kernel_t stk_kernel_t
Opaque handle to a kernel instance.
void stk_kernel_resume(stk_kernel_t *k, stk_timeout_t elapsed_ticks)
Resume scheduling after a prior stk_kernel_suspend() call.
stk_timeout_t stk_kernel_suspend(stk_kernel_t *k)
Suspend scheduling (tickless idle entry point).
void stk_delay_ms(stk_timeout_t ms)
Busy-wait delay (other tasks continue to run).
void stk_yield(void)
Voluntarily give up CPU to another ready task (cooperative yield).
uint32_t stk_hires_frequency(void)
Get CPU clock frequency in Hz.
#define STK_C_CPU_COUNT
Number of kernel instances / CPU cores supported (default: 1).
void stk_kernel_resume_task(stk_kernel_t *k, stk_task_t *tsk)
Resume a previously suspended task.
void stk_kernel_start(stk_kernel_t *k)
Start the scheduler - never returns.
void stk_sleep(stk_timeout_t ticks)
Put current task to sleep (non-HRT kernels only).
uint64_t stk_cycle_t
CPU cycles value.
void stk_task_set_weight(stk_task_t *tsk, stk_weight_t weight)
Set task weight (used only by Smooth Weighted Round Robin).
void stk_critical_section_exit(void)
Leave critical section - re-enable context switches.
void stk_kernel_set_event_overrider(stk_kernel_t *k, stk_event_overrider_t *overrider)
Install a platform event overrider on the kernel.
stk_cycle_t stk_sys_timer_count(void)
Get raw system timer counter value.
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.
stk_tid_t stk_task_get_id(const stk_task_t *tsk)
Get the unique identifier of a task.
uint32_t stk_tick_resolution(void)
Returns how many microseconds correspond to one kernel tick.
uint32_t stk_sys_timer_frequency(void)
Get system timer frequency in Hz.
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.
void stk_sleep_ms(stk_timeout_t ms)
Put current task to sleep (non-HRT kernels only).
size_t stk_kernel_enumerate_tasks(stk_kernel_t *k, stk_task_t **tasks, size_t max_count)
Enumerate all currently active tasks.
void stk_kernel_add_task(stk_kernel_t *k, stk_task_t *tsk)
Add task to non-HRT kernel (static or dynamic).
void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
Initialize kernel with given tick period.
stk_tick_t stk_hires_time_us(void)
Get elapsed time in microseconds from the high-resolution clock.
void(* stk_task_entry_t)(void *arg)
Task entry point function type.
stk_kernel_state_t
Kernel state.
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.
stk_tick_t stk_ticks(void)
Returns number of ticks elapsed since kernel start.
void stk_task_set_priority(stk_task_t *tsk, uint8_t priority)
Set task priority (used only by Fixed Priority scheduler).
stk_word_t stk_tid_t
Task id.
int64_t stk_tick_t
Ticks value.
stk_kernel_t * stk_kernel_create(uint8_t core_nr)
Create kernel.
uintptr_t stk_word_t
CPU register type.
bool stk_kernel_is_started(const stk_kernel_t *k)
Check whether the scheduler is currently running (first task switch has occurred).
void stk_sleep_cancel(stk_tid_t tid)
Cancel the sleep of a task, waking it immediately.
int64_t stk_time_t
Time value.
stk_time_t stk_time_now_ms(void)
Returns current time in milliseconds since kernel start.
int32_t stk_weight_t
Task weight value.
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).
stk_kernel_state_t stk_kernel_get_state(const stk_kernel_t *k)
Get state of the scheduler.
void stk_task_destroy(stk_task_t *tsk)
Destroy dynamically created task object.
bool stk_sleep_until(stk_tick_t ts)
Put current task to sleep (non-HRT kernels only).
void stk_critical_section_enter(void)
Enter critical section - disable context switches on current core.
void stk_kernel_process_hard_fault(stk_kernel_t *k)
Trigger a kernel hard fault (safe-state handler).
int32_t stk_timeout_t
Timeout value.
void stk_delay(stk_timeout_t ticks)
Busy-wait delay (other tasks continue to run).
bool stk_kernel_is_schedulable(const stk_kernel_t *k)
Test whether currently configured task set is schedulable.
Namespace of STK package.
uintptr_t Word
Native processor word type.
static void Yield()
Notify scheduler to switch to the next runnable task.
static void Sleep(Timeout tick_count)
Put calling process into a sleep state.
static void SleepCancel(TId task_id)
Cancel sleep of the task.
static void SleepMs(Timeout ms)
Put calling process into a sleep state.
EAccessMode
Hardware access mode by the user task.
@ ACCESS_USER
Unprivileged access mode (access to some hardware is restricted, see CPU manual for details).
@ ACCESS_PRIVILEGED
Privileged access mode (access to hardware is fully unrestricted).
static Time GetTimeNowMs()
Get current time in milliseconds since kernel start.
static void DelayMs(Timeout ms)
Delay calling process by busy-waiting until the deadline expires.
int32_t Timeout
Timeout time (ticks).
static bool SleepUntil(Ticks timestamp)
Put calling process into a sleep state until the specified timestamp.
constexpr Weight DEFAULT_WEIGHT
Weight value: default weight of value (1) (see SwitchStrategySmoothWeightedRoundRobin).
static uint32_t GetTickResolution()
Get number of microseconds in one tick.
static uint32_t GetSysTimerFrequency()
Get system timer frequency.
static void Delay(Timeout tick_count)
Delay calling process by busy-waiting until the deadline expires.
static Ticks GetTicks()
Get number of ticks elapsed since kernel start.
static TId GetTid()
Get task/thread Id of the calling task.
static Cycles GetSysTimerCount()
Get system timer count value.
int32_t Weight
Weight value (aka priority).
void InitializeTimerHost(stk_kernel_t *kernel, stk::time::TimerHost *th, EAccessMode amode)
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.
static Cycles GetCycles()
Get number of clock cycles elapsed.
Lightweight, non-owning view over a contiguous sequence of elements.
Interface for a user task.
TId GetId() const
Get task Id set by application.
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.
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 ...
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.
void SetName(const char *tname)
size_t GetStackSize() const override
Get number of elements of the stack memory array.
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 ...
const char * GetTraceName() const override
Get task trace name set by application.
void OnExit() override
Called by the kernel before removal from the scheduling (see stk::KERNEL_DYNAMIC).
~TaskWrapper()=default
Destructor.
size_t GetStackSizeBytes() const override
Get size of the memory in bytes.
int32_t GetWeight() const override
Get static base weight of the task.
const Word * GetStack() const override
Get pointer to the stack memory.
void SetWeight(Weight weight)
EAccessMode GetAccessMode() const override
Get hardware access mode of the user task.
void Run() override
Entry point of the user task.
void Initialize(stk_task_entry_t const func, void *user_data, stk_word_t *stack, size_t stack_size, EAccessMode mode)
bool OnSleep(Timeout sleep_ticks) override
Called by the Kernel when it is entering a sleep mode.
void SetCallback(stk_event_overrider_t *c)
Bind or unbind a C-level overrider struct.
bool OnHardFault() override
Called by Kernel when hard fault happens.
bool IsActive() const
Returns true when a C-level struct is currently bound.
~EventOverrider()=default
Destructor.
stk_event_overrider_t * m_cb