SuperTinyKernel™ RTOS 1.08.x
Lightweight, high-performance, deterministic, bare-metal C++ RTOS for resource-constrained embedded systems. MIT Open Source License.
Loading...
Searching...
No Matches
stk_c.h
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#ifndef STK_C_H_
11#define STK_C_H_
12
13#ifdef __cplusplus
14 #include <cstdint>
15 #include <cstddef>
16 #include <cstdbool>
17 #include <cassert>
18#else
19 #include <stdint.h>
20 #include <stddef.h>
21 #include <stdbool.h>
22 #include <assert.h>
23#endif
24
25#include <stk_config.h>
26
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42// =============================================================================
43// Configuration macros (can be overridden before including this file)
44// =============================================================================
45
51#ifndef STK_C_KERNEL_MAX_TASKS
52 #define STK_C_KERNEL_MAX_TASKS (4)
53#endif
54
59#ifndef STK_C_CPU_COUNT
60 #define STK_C_CPU_COUNT (1)
61#endif
62
66#if !defined(STK_SYNC_DEBUG_NAMES) && STK_SEGGER_SYSVIEW
67 #define STK_SYNC_DEBUG_NAMES (1)
68#elif !defined(STK_SYNC_DEBUG_NAMES)
69 #define STK_SYNC_DEBUG_NAMES (0)
70#endif
71
75#define STK_C_ASSERT(e) assert(e)
76
82#ifdef __cplusplus
83 #define STK_STATIC_CAST(type, val) static_cast<type>(val)
84#else
85 #define STK_STATIC_CAST(type, val) ((type)(val))
86#endif
87
88// =============================================================================
89// Types
90// =============================================================================
91
94typedef uintptr_t stk_word_t;
95
99
103typedef int64_t stk_tick_t;
104
108typedef int64_t stk_time_t;
109
113typedef int32_t stk_timeout_t;
114
118typedef uint64_t stk_cycle_t;
119
122typedef int32_t stk_weight_t;
123
127
130typedef struct stk_task_t stk_task_t;
131
134#define STK_PERIODICITY_DEFAULT (1000U)
135
143typedef void (*stk_task_entry_t)(void *arg);
144
147#define STK_WAIT_INFINITE (STK_STATIC_CAST(stk_timeout_t, INT32_MAX))
148
151#define STK_NO_WAIT (STK_STATIC_CAST(stk_timeout_t, 0))
152
155#define STK_ALIGN_SIZE sizeof(stk_word_t)
156
159#define STK_ALIGN_MASK (STK_ALIGN_SIZE - 1U)
160
164#ifndef STK_STACK_MEMORY_ALIGN
165 #if defined(__riscv)
166 #define STK_STACK_MEMORY_ALIGN (16U)
167 #elif defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
168 #define STK_STACK_MEMORY_ALIGN (8U)
169 #else // ARM, others
170 #define STK_STACK_MEMORY_ALIGN (4U)
171 #endif
172#endif
173
181#define STK_DEFINE_STACK_POOL(name, max_tasks, stack_size) \
182 static stk_word_t name[max_tasks][stack_size] __stk_c_stack
183
190#define STK_GET_STACK_FROM_POOL(name, task_id) (name[task_id])
191
192// =============================================================================
193// Attributes
194// =============================================================================
195
199#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
200 #define __stk_c_stack __attribute__((aligned(STK_STACK_MEMORY_ALIGN)))
201#else
202 #define __stk_c_stack
203#endif
204
208#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
209 #define __stk_c_aligned __attribute__((aligned(STK_ALIGN_SIZE)))
210#else
211 #define __stk_c_aligned
212#endif
213
214// =============================================================================
215// Kernel factory functions
216// =============================================================================
217
218/* Available kernel type definitions:
219
220 Kernel mode flags (may be OR-combined, subject to the constraints listed below):
221 KERNEL_STATIC - fixed task list; tasks must never return from their entry function.
222 KERNEL_DYNAMIC - tasks may be added/removed at runtime and may return when done.
223 KERNEL_HRT - Hard Real-Time mode; must be combined with KERNEL_STATIC or KERNEL_DYNAMIC.
224 KERNEL_SYNC - enables synchronization primitives (Mutex, Event, Semaphore, etc.).
225 KERNEL_TICKLESS - tickless low-power idle; suppresses the SysTick when all tasks sleep.
226 Requires STK_TICKLESS_IDLE=1 in stk_config.h.
227 INCOMPATIBLE with KERNEL_HRT (HRT requires a continuous tick).
228
229// Standard variants
230Kernel<KERNEL_STATIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
231Kernel<KERNEL_DYNAMIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
232Kernel<KERNEL_STATIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
233Kernel<KERNEL_DYNAMIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
234Kernel<KERNEL_STATIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
235Kernel<KERNEL_DYNAMIC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
236
237// HRT variants (KERNEL_TICKLESS must NOT be combined with any of these)
238Kernel<KERNEL_STATIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
239Kernel<KERNEL_DYNAMIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
240Kernel<KERNEL_STATIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRM, PlatformDefault>
241Kernel<KERNEL_DYNAMIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRM, PlatformDefault>
242Kernel<KERNEL_STATIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyDM, PlatformDefault>
243Kernel<KERNEL_DYNAMIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyDM, PlatformDefault>
244Kernel<KERNEL_STATIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyEDF, PlatformDefault>
245Kernel<KERNEL_DYNAMIC | KERNEL_HRT, STK_C_KERNEL_MAX_TASKS, SwitchStrategyEDF, PlatformDefault>
246
247// Standard variants with KERNEL_SYNC
248Kernel<KERNEL_STATIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
249Kernel<KERNEL_DYNAMIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
250Kernel<KERNEL_STATIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
251Kernel<KERNEL_DYNAMIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
252Kernel<KERNEL_STATIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
253Kernel<KERNEL_DYNAMIC | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
254
255// HRT variants with KERNEL_SYNC
256Kernel<KERNEL_STATIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
257Kernel<KERNEL_DYNAMIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
258Kernel<KERNEL_STATIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRM, PlatformDefault>
259Kernel<KERNEL_DYNAMIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRM, PlatformDefault>
260Kernel<KERNEL_STATIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyDM, PlatformDefault>
261Kernel<KERNEL_DYNAMIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyDM, PlatformDefault>
262Kernel<KERNEL_STATIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyEDF, PlatformDefault>
263Kernel<KERNEL_DYNAMIC | KERNEL_HRT | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyEDF, PlatformDefault>
264
265// Tickless variants (low-power; KERNEL_TICKLESS requires STK_TICKLESS_IDLE=1 in stk_config.h)
266Kernel<KERNEL_STATIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
267Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
268Kernel<KERNEL_STATIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
269Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
270Kernel<KERNEL_STATIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
271Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
272
273// Tickless variants with KERNEL_SYNC
274Kernel<KERNEL_STATIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
275Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyRR, PlatformDefault>
276Kernel<KERNEL_STATIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
277Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategySWRR, PlatformDefault>
278Kernel<KERNEL_STATIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
279Kernel<KERNEL_DYNAMIC | KERNEL_TICKLESS | KERNEL_SYNC, STK_C_KERNEL_MAX_TASKS, SwitchStrategyFP32, PlatformDefault>
280*/
281
305
312stk_kernel_t *stk_kernel_create(uint8_t core_nr);
313
314#ifdef __cplusplus
315namespace stk { class IKernel; }
316
326extern "C" stk::IKernel *stk_kernel_get_instance(uint8_t core_nr);
327#endif // __cplusplus
328
329// =============================================================================
330// Kernel control
331// =============================================================================
332
338void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us);
339
346
356 stk_task_t *tsk,
357 int32_t periodicity_ticks,
358 int32_t deadline_ticks,
359 int32_t start_delay_ticks);
360
367
374
385
391
398
405
415
424void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *task, bool *suspended);
425
431
442
451void stk_kernel_resume(stk_kernel_t *k, stk_timeout_t elapsed_ticks);
452
461size_t stk_kernel_enumerate_tasks(stk_kernel_t *k, stk_task_t **tasks, size_t max_count);
462
472
481
482// =============================================================================
483// Platform event overrider
484// =============================================================================
485
505{
513 bool (*on_sleep)(stk_timeout_t sleep_ticks, void *user_data);
514
521 bool (*on_hard_fault)(void *user_data);
522
528
542
543// =============================================================================
544// Tasks
545// =============================================================================
546
555 void *arg,
556 stk_word_t *stack,
557 uint32_t stack_size);
558
567 void *arg,
568 stk_word_t *stack,
569 uint32_t stack_size);
570
578
584void stk_task_set_priority(stk_task_t *tsk, uint8_t priority);
585
590void stk_task_set_name(stk_task_t *tsk, const char *tname);
591
597const char *stk_task_get_name(const stk_task_t *tsk);
598
607
608#ifdef __cplusplus
609namespace stk { class ITask; }
610
622#endif // __cplusplus
623
624// =============================================================================
625// Services available from inside tasks
626// =============================================================================
627
631stk_tid_t stk_tid(void);
632
637
641uint32_t stk_tick_resolution(void);
642
651
666
675static inline stk_tick_t stk_ticks_from_ms_r(stk_time_t msec, uint32_t resolution)
676{
677 stk_time_t result = 0LL;
678
679 if (resolution != 0U)
680 {
681 const stk_time_t total_scaled = msec * 1000LL;
682 result = total_scaled / STK_STATIC_CAST(stk_time_t, resolution);
683 }
684
685 return STK_STATIC_CAST(stk_tick_t, result);
686}
687
692
699static inline stk_time_t stk_ms_from_ticks_r(stk_tick_t ticks, uint32_t resolution)
700{
701 const stk_tick_t total_ticks = ticks * STK_STATIC_CAST(stk_tick_t, resolution);
702 return STK_STATIC_CAST(stk_time_t, total_ticks / 1000LL);
703}
704
711{
713}
714
720
726uint32_t stk_sys_timer_frequency(void);
727
728// =============================================================================
729// High-Resolution Clock (see hw::HiResClock)
730// =============================================================================
731
737
742uint32_t stk_hires_frequency(void);
743
749
753void stk_delay(stk_timeout_t ticks);
754
759
770void stk_sleep(stk_timeout_t ticks);
771
783
796
799void stk_yield(void);
800
809
810// =============================================================================
811// Dynamic cleanup
812// =============================================================================
813
820
827
828// =============================================================================
829// Thread-Local Storage (TLS)
830// =============================================================================
831
848
852void *stk_tls_get(void);
853
857void stk_tls_set(void *ptr);
858
862#define STK_TLS_GET_T(type) ((type *)stk_tls_get())
863
867#define STK_TLS_SET_T(ptr) stk_tls_set((void *)(ptr))
868
869// =============================================================================
870// Synchronization Primitives
871// =============================================================================
872
873// ----- Critical Section ------------------------------------------------------
874
877typedef uint8_t stk_cs_session_t;
878
882#define STK_DEFAULT_CS_SESSION (0U)
883
890stk_cs_session_t stk_critical_section_enter_ex(stk_cs_session_t ses /*= STK_DEFAULT_CS_SESSION*/);
891
896void stk_critical_section_exit_ex(stk_cs_session_t ses /*= STK_DEFAULT_CS_SESSION*/);
897
902
907
908// ----- Mutex -----------------------------------------------------------------
909
912#define STK_MUTEX_IMPL_SIZE (10U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
913
919
923
929stk_mutex_t *stk_mutex_create(stk_mutex_mem_t *const membuf, uint32_t membuf_size);
930
935
939void stk_mutex_lock(stk_mutex_t *mtx);
940
946
951
961
962#ifdef __cplusplus
963namespace stk { namespace sync { class Mutex; } }
964
971#endif // __cplusplus
972
973// ----- SpinLock --------------------------------------------------------------
974
977#define STK_SPINLOCK_IMPL_SIZE (1)
978
985
989
995stk_spinlock_t *stk_spinlock_create(stk_spinlock_mem_t *const membuf, uint32_t membuf_size);
996
1000
1004
1009
1013
1014#ifdef __cplusplus
1015namespace stk { namespace sync { class SpinLock; } }
1016
1023#endif // __cplusplus
1024
1025// ----- Condition Variable ----------------------------------------------------
1026
1029#define STK_CV_IMPL_SIZE (7U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1030
1036
1039typedef struct stk_cv_t stk_cv_t;
1040
1046stk_cv_t *stk_cv_create(stk_cv_mem_t *const membuf, uint32_t membuf_size);
1047
1051void stk_cv_destroy(stk_cv_t *cv);
1052
1064bool stk_cv_wait(stk_cv_t *cv, stk_mutex_t *mtx, stk_timeout_t timeout);
1065
1069void stk_cv_notify_one(stk_cv_t *cv);
1070
1074void stk_cv_notify_all(stk_cv_t *cv);
1075
1076#ifdef __cplusplus
1077namespace stk { namespace sync { class ConditionVariable; } }
1078
1085#endif // __cplusplus
1086
1087// ----- Event -----------------------------------------------------------------
1088
1091#define STK_EVENT_IMPL_SIZE (8U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1092
1098
1102
1110 uint32_t membuf_size,
1111 bool manual_reset);
1112
1117
1126bool stk_event_wait(stk_event_t *ev, stk_timeout_t timeout);
1127
1133
1139bool stk_event_set(stk_event_t *ev);
1140
1147
1152
1153#ifdef __cplusplus
1154namespace stk { namespace sync { class Event; } }
1155
1162#endif // __cplusplus
1163
1164// ----- Semaphore -------------------------------------------------------------
1165
1168#define STK_SEM_IMPL_SIZE (8U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1169
1175
1178typedef struct stk_sem_t stk_sem_t;
1179
1188stk_sem_t *stk_sem_create(stk_sem_mem_t *const membuf,
1189 uint32_t membuf_size,
1190 uint32_t initial_count,
1191 uint32_t max_count);
1192
1196void stk_sem_destroy(stk_sem_t *sem);
1197
1206bool stk_sem_wait(stk_sem_t *sem, stk_timeout_t timeout);
1207
1215bool stk_sem_trywait(stk_sem_t *sem);
1216
1225void stk_sem_signal(stk_sem_t *sem);
1226
1239bool stk_sem_trysignal(stk_sem_t *sem);
1240
1247uint16_t stk_sem_get_count(const stk_sem_t *sem);
1248
1249#ifdef __cplusplus
1250namespace stk { namespace sync { class Semaphore; } }
1251
1258#endif // __cplusplus
1259
1260// ----- EventFlags ------------------------------------------------------------
1261
1264#define STK_EF_OPT_WAIT_ANY (0x00000000U)
1265#define STK_EF_OPT_WAIT_ALL (0x00000001U)
1266#define STK_EF_OPT_NO_CLEAR (0x00000002U)
1267
1270#define STK_EF_ERROR_PARAMETER (0x80000001U)
1271#define STK_EF_ERROR_TIMEOUT (0x80000002U)
1272#define STK_EF_ERROR_ISR (0x80000004U)
1273#define STK_EF_ERROR_MASK (0x80000000U)
1274
1278static inline bool stk_ef_is_error(uint32_t result)
1279{
1280 return ((result & STK_EF_ERROR_MASK) != 0U);
1281}
1282
1287#define STK_EF_IMPL_SIZE (STK_CV_IMPL_SIZE + 1U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1288
1294
1297typedef struct stk_ef_t stk_ef_t;
1298
1306stk_ef_t *stk_ef_create(stk_ef_mem_t *const membuf,
1307 uint32_t membuf_size,
1308 uint32_t initial_flags);
1309
1313void stk_ef_destroy(stk_ef_t *ef);
1314
1323uint32_t stk_ef_set(stk_ef_t *ef, uint32_t flags);
1324
1332uint32_t stk_ef_clear(stk_ef_t *ef, uint32_t flags);
1333
1339uint32_t stk_ef_get(stk_ef_t *ef);
1340
1361uint32_t stk_ef_wait(stk_ef_t *ef, uint32_t flags, uint32_t options, stk_timeout_t timeout);
1362
1374uint32_t stk_ef_trywait(stk_ef_t *ef, uint32_t flags, uint32_t options);
1375
1376#ifdef __cplusplus
1377namespace stk { namespace sync { class EventFlags; } }
1378
1385#endif // __cplusplus
1386
1387// ----- Pipe (FIFO) -----------------------------------------------------------
1388
1397#define STK_PIPE_IMPL_SIZE (6U + (2U * STK_CV_IMPL_SIZE) + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1398
1404
1407typedef struct stk_pipe_t stk_pipe_t;
1408
1426#define STK_PIPE_BUF_SIZE(capacity, element_size) \
1427 ((((capacity) * (element_size)) + STK_ALIGN_MASK) & ~STK_ALIGN_MASK)
1428
1449 uint32_t membuf_size,
1450 uint8_t *buf,
1451 uint32_t buf_size,
1452 size_t capacity,
1453 size_t element_size);
1454
1460void stk_pipe_destroy(stk_pipe_t *pipe);
1461
1476bool stk_pipe_write(stk_pipe_t *pipe, const void *data, stk_timeout_t timeout);
1477
1484bool stk_pipe_trywrite(stk_pipe_t *pipe, const void *data);
1485
1500bool stk_pipe_read(stk_pipe_t *pipe, void *data, stk_timeout_t timeout);
1501
1508bool stk_pipe_tryread(stk_pipe_t *pipe, void *data);
1509
1526size_t stk_pipe_write_bulk(stk_pipe_t *pipe, const void *src, size_t count, stk_timeout_t timeout);
1527
1536size_t stk_pipe_trywrite_bulk(stk_pipe_t *pipe, const void *src, size_t count);
1537
1553size_t stk_pipe_read_bulk(stk_pipe_t *pipe, void *dst, size_t count, stk_timeout_t timeout);
1554
1563size_t stk_pipe_tryread_bulk(stk_pipe_t *pipe, void *dst, size_t count);
1564
1585 void *dst,
1586 size_t trigger,
1587 size_t max_count,
1588 stk_timeout_t timeout);
1589
1599size_t stk_pipe_tryread_bulk_triggered(stk_pipe_t *pipe, void *dst, size_t max_count);
1600
1607void stk_pipe_reset(stk_pipe_t *pipe);
1608
1614size_t stk_pipe_get_capacity(const stk_pipe_t *pipe);
1615
1621size_t stk_pipe_get_element_size(const stk_pipe_t *pipe);
1622
1628size_t stk_pipe_get_count(const stk_pipe_t *pipe);
1629
1635size_t stk_pipe_get_space(const stk_pipe_t *pipe);
1636
1642bool stk_pipe_is_empty(const stk_pipe_t *pipe);
1643
1649bool stk_pipe_is_full(const stk_pipe_t *pipe);
1650
1656bool stk_pipe_is_storage_valid(const stk_pipe_t *pipe);
1657
1658#ifdef __cplusplus
1659namespace stk { namespace sync { class Pipe; } }
1660
1667#endif // __cplusplus
1668
1669// ----- MessageQueue ----------------------------------------------------------
1670
1679#define STK_MSGQ_IMPL_SIZE (6U + (2U * STK_CV_IMPL_SIZE) + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
1680
1686
1689typedef struct stk_msgq_t stk_msgq_t;
1690
1708#define STK_MSGQ_BUF_SIZE(capacity, msg_size) ((capacity) * (msg_size))
1709
1732 uint32_t membuf_size,
1733 uint8_t *buf,
1734 uint32_t buf_size,
1735 size_t capacity,
1736 size_t msg_size);
1737
1744
1759bool stk_msgq_put(stk_msgq_t *mq, const void *msg, stk_timeout_t timeout);
1760
1767bool stk_msgq_tryput(stk_msgq_t *mq, const void *msg);
1768
1784bool stk_msgq_putfront(stk_msgq_t *mq, const void *msg, stk_timeout_t timeout);
1785
1792bool stk_msgq_tryputfront(stk_msgq_t *mq, const void *msg);
1793
1807bool stk_msgq_get(stk_msgq_t *mq, void *msg, stk_timeout_t timeout);
1808
1815bool stk_msgq_tryget(stk_msgq_t *mq, void *msg);
1816
1833bool stk_msgq_peek(stk_msgq_t *mq, void *msg, stk_timeout_t timeout);
1834
1841bool stk_msgq_trypeek(stk_msgq_t *mq, void *msg);
1842
1858bool stk_msgq_peekfront(stk_msgq_t *mq, void *msg, stk_timeout_t timeout);
1859
1866bool stk_msgq_trypeekfront(stk_msgq_t *mq, void *msg);
1867
1875void stk_msgq_reset(stk_msgq_t *mq);
1876
1882size_t stk_msgq_get_capacity(const stk_msgq_t *mq);
1883
1889size_t stk_msgq_get_msg_size(const stk_msgq_t *mq);
1890
1896size_t stk_msgq_get_count(const stk_msgq_t *mq);
1897
1903size_t stk_msgq_get_space(const stk_msgq_t *mq);
1904
1910bool stk_msgq_is_empty(const stk_msgq_t *mq);
1911
1918uint8_t *stk_msgq_get_buffer(stk_msgq_t *mq);
1919
1925bool stk_msgq_is_full(const stk_msgq_t *mq);
1926
1937
1938#ifdef __cplusplus
1939namespace stk { namespace sync { class MessageQueue; } }
1940
1947#endif // __cplusplus
1948
1949// ----- RWMutex (Reader-Writer Lock) ------------------------------------------
1950
1953#define STK_RWMUTEX_IMPL_SIZE (17U + (STK_SYNC_DEBUG_NAMES ? 3U : 0U))
1954
1960
1964
1970stk_rwmutex_t *stk_rwmutex_create(stk_rwmutex_mem_t *const membuf, uint32_t membuf_size);
1971
1976
1983
1989
2000
2006
2013
2019
2030
2037
2038#ifdef __cplusplus
2039namespace stk { namespace sync { class RWMutex; } }
2040
2047#endif // __cplusplus
2048
2049// ----- Barrier -----------------------------------------------------------------
2050
2056#define STK_BARRIER_IMPL_SIZE (STK_MUTEX_IMPL_SIZE + STK_CV_IMPL_SIZE + 4U + (STK_SYNC_DEBUG_NAMES ? 1U : 0U))
2057
2063
2067
2075stk_barrier_t *stk_barrier_create(stk_barrier_mem_t *const membuf, uint32_t membuf_size, uint32_t count);
2076
2080void stk_barrier_destroy(stk_barrier_t *barrier);
2081
2090bool stk_barrier_wait(stk_barrier_t *barrier);
2091
2097uint32_t stk_barrier_get_threshold(const stk_barrier_t *barrier);
2098
2099#ifdef __cplusplus
2100namespace stk { namespace sync { class Barrier; } }
2101
2108#endif // __cplusplus
2109
2110#ifdef __cplusplus
2111}
2112#endif
2113
2115
2116#endif /* STK_C_H_ */
@ Mutex
Mutex or recursive mutex (backed by stk::sync::Mutex).
stk::sync::Barrier * stk_barrier_get_instance(stk_barrier_t *barrier)
Get the underlying C++ stk::sync::Barrier object wrapped by a stk_barrier_t handle.
stk_rwmutex_t * stk_rwmutex_create(stk_rwmutex_mem_t *const membuf, uint32_t membuf_size)
Create an RWMutex (using provided memory).
void stk_kernel_process_tick(stk_kernel_t *k)
Manually deliver one scheduler tick to the kernel.
Definition stk_c.cpp:516
stk::sync::EventFlags * stk_ef_get_instance(stk_ef_t *ef)
Get the underlying C++ stk::sync::EventFlags object wrapped by a stk_ef_t handle.
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:568
void stk_task_set_name(stk_task_t *tsk, const char *tname)
Assign human-readable task name (for tracing/debugging).
Definition stk_c.cpp:596
void stk_barrier_destroy(stk_barrier_t *barrier)
Destroy a Barrier.
void stk_sem_signal(stk_sem_t *sem)
Signal/Release a semaphore resource.
stk_cycle_t stk_hires_cycles(void)
Get raw CPU cycle counter.
Definition stk_c.cpp:642
size_t stk_pipe_get_capacity(const stk_pipe_t *pipe)
Get the maximum number of elements the pipe can hold.
void stk_msgq_reset(stk_msgq_t *mq)
Discard all messages and reset the queue to the empty state.
bool stk_msgq_is_full(const stk_msgq_t *mq)
Check whether the queue is currently full.
#define STK_STATIC_CAST(type, val)
Convenience wrapper for static_cast and C-style cast.
Definition stk_c.h:83
#define STK_BARRIER_IMPL_SIZE
A memory size (multiples of stk_word_t) required for Barrier instance.
Definition stk_c.h:2056
uint32_t stk_ef_set(stk_ef_t *ef, uint32_t flags)
Set one or more flags.
bool stk_event_set(stk_event_t *ev)
Set the event to signaled state.
uint32_t stk_ef_clear(stk_ef_t *ef, uint32_t flags)
Clear one or more flags.
void stk_mutex_destroy(stk_mutex_t *mtx)
Destroy a Mutex.
size_t stk_pipe_get_count(const stk_pipe_t *pipe)
Get the current number of elements in the pipe.
bool stk_sem_trysignal(stk_sem_t *sem)
Try to signal/release a semaphore resource without exceeding max_count.
stk_barrier_t * stk_barrier_create(stk_barrier_mem_t *const membuf, uint32_t membuf_size, uint32_t count)
Create a Barrier (using provided memory).
bool stk_pipe_write(stk_pipe_t *pipe, const void *data, stk_timeout_t timeout)
Write a single element to the pipe.
stk_tid_t stk_tid(void)
Returns current task/thread ID (the value set by stk_task_set_id).
Definition stk_c.cpp:634
size_t stk_pipe_read_bulk(stk_pipe_t *pipe, void *dst, size_t count, stk_timeout_t timeout)
Read multiple elements from the pipe.
size_t stk_pipe_trywrite_bulk(stk_pipe_t *pipe, const void *src, size_t count)
Attempt to write multiple elements to the pipe without blocking.
bool stk_rwmutex_try_read_lock(stk_rwmutex_t *rw)
Try to acquire the read lock without blocking.
stk_tick_t stk_ticks_from_ms(stk_time_t msec)
Get ticks from milliseconds using current kernel tick resolution.
Definition stk_c.cpp:638
size_t stk_pipe_get_space(const stk_pipe_t *pipe)
Get the number of free slots currently available.
stk_sem_t * stk_sem_create(stk_sem_mem_t *const membuf, uint32_t membuf_size, uint32_t initial_count, uint32_t max_count)
Create a Semaphore (using provided memory).
uint32_t stk_ef_wait(stk_ef_t *ef, uint32_t flags, uint32_t options, stk_timeout_t timeout)
Wait for one or more flags to be set.
void stk_ef_destroy(stk_ef_t *ef)
Destroy an EventFlags object.
void stk_kernel_remove_task(stk_kernel_t *k, stk_task_t *tsk)
Remove finished task from dynamic kernel.
Definition stk_c.cpp:437
void * stk_tls_get(void)
Get thread-local pointer (platform-specific slot).
bool stk_event_wait(stk_event_t *ev, stk_timeout_t timeout)
Wait for the event to become signaled.
bool stk_rwmutex_trylock(stk_rwmutex_t *rw)
Try to acquire the write lock without blocking.
bool stk_cv_wait(stk_cv_t *cv, stk_mutex_t *mtx, stk_timeout_t timeout)
Wait for a signal on the condition variable.
uint32_t stk_ef_trywait(stk_ef_t *ef, uint32_t flags, uint32_t options)
Non-blocking flag poll.
uint8_t stk_cs_session_t
Session of Critical Section.
Definition stk_c.h:877
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:603
#define STK_SEM_IMPL_SIZE
A memory size (multiples of stk_word_t) required for Semaphore instance.
Definition stk_c.h:1168
void stk_spinlock_destroy(stk_spinlock_t *slock)
Destroy the SpinLock.
void stk_kernel_destroy(stk_kernel_t *k)
Destroy dynamic kernel instance (only when not running).
Definition stk_c.cpp:386
void stk_cv_notify_one(stk_cv_t *cv)
Wake one task waiting on the condition variable.
void stk_kernel_suspend_task(stk_kernel_t *k, stk_task_t *task, bool *suspended)
Suspend a task (prevent it from being scheduled).
Definition stk_c.cpp:461
bool stk_spinlock_trylock(stk_spinlock_t *slock)
Attempt to acquire the SpinLock immediately.
stk::IKernel * stk_kernel_get_instance(uint8_t core_nr)
Get the underlying C++ stk::IKernel object for a given core.
Definition stk_c.cpp:373
stk_msgq_t * stk_msgq_create(stk_msgq_mem_t *const membuf, uint32_t membuf_size, uint8_t *buf, uint32_t buf_size, size_t capacity, size_t msg_size)
Create a MessageQueue (using provided memory).
#define STK_EVENT_IMPL_SIZE
A memory size (multiples of stk_word_t) required for Event instance.
Definition stk_c.h:1091
bool stk_msgq_tryget(stk_msgq_t *mq, void *msg)
Attempt to get a message from the queue without blocking.
bool stk_event_trywait(stk_event_t *ev)
Wait for the event to become signaled.
stk::sync::SpinLock * stk_spinlock_get_instance(stk_spinlock_t *slock)
Get the underlying C++ stk::sync::SpinLock object wrapped by a stk_spinlock_t handle.
size_t stk_msgq_get_space(const stk_msgq_t *mq)
Get the number of free slots currently available.
struct stk_kernel_t stk_kernel_t
Opaque handle to a kernel instance.
Definition stk_c.h:126
void stk_event_destroy(stk_event_t *ev)
Destroy an Event.
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:509
stk_timeout_t stk_kernel_suspend(stk_kernel_t *k)
Suspend scheduling (tickless idle entry point).
Definition stk_c.cpp:502
bool stk_pipe_is_storage_valid(const stk_pipe_t *pipe)
Verify that the backing storage is valid and the pipe is ready for use.
uint16_t stk_sem_get_count(const stk_sem_t *sem)
Get the current counter value.
void stk_delay_ms(stk_timeout_t ms)
Busy-wait delay (other tasks continue to run).
Definition stk_c.cpp:647
stk_event_t * stk_event_create(stk_event_mem_t *const membuf, uint32_t membuf_size, bool manual_reset)
Create an Event (using provided memory).
void stk_yield(void)
Voluntarily give up CPU to another ready task (cooperative yield).
Definition stk_c.cpp:651
bool stk_msgq_trypeekfront(stk_msgq_t *mq, void *msg)
Attempt to peek at the front message without blocking.
uint32_t stk_hires_frequency(void)
Get CPU clock frequency in Hz.
Definition stk_c.cpp:643
stk::sync::Semaphore * stk_sem_get_instance(stk_sem_t *sem)
Get the underlying C++ stk::sync::Semaphore object wrapped by a stk_sem_t handle.
bool stk_mutex_timed_lock(stk_mutex_t *mtx, stk_timeout_t timeout)
Try to lock the mutex with a timeout.
bool stk_msgq_peekfront(stk_msgq_t *mq, void *msg, stk_timeout_t timeout)
Peek at the most recently front-inserted message without removing it.
void stk_kernel_resume_task(stk_kernel_t *k, stk_task_t *task)
Resume a previously suspended task.
Definition stk_c.cpp:470
void stk_mutex_lock(stk_mutex_t *mtx)
Lock the mutex. Blocks until available.
void stk_kernel_start(stk_kernel_t *k)
Start the scheduler - never returns.
Definition stk_c.cpp:407
stk::sync::Pipe * stk_pipe_get_instance(stk_pipe_t *pipe)
Get the underlying C++ stk::sync::Pipe object wrapped by a stk_pipe_t handle.
size_t stk_pipe_write_bulk(stk_pipe_t *pipe, const void *src, size_t count, stk_timeout_t timeout)
Write multiple elements to the pipe.
void stk_rwmutex_lock(stk_rwmutex_t *rw)
Acquire the lock for exclusive writing. Blocks until available.
stk_ef_t * stk_ef_create(stk_ef_mem_t *const membuf, uint32_t membuf_size, uint32_t initial_flags)
Create an EventFlags object (using provided memory).
void stk_cv_destroy(stk_cv_t *cv)
Destroy a Condition Variable.
void stk_sleep(stk_timeout_t ticks)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:646
bool stk_msgq_is_empty(const stk_msgq_t *mq)
Check whether the queue is currently empty.
uint64_t stk_cycle_t
CPU cycles value.
Definition stk_c.h:118
uint32_t stk_barrier_get_threshold(const stk_barrier_t *barrier)
Get the number of tasks required to trip the barrier.
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:580
bool stk_mutex_trylock(stk_mutex_t *mtx)
Try locking the mutex. Does not block if already locked.
void stk_rwmutex_read_lock(stk_rwmutex_t *rw)
Acquire the lock for shared reading. Blocks until available.
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:530
size_t stk_msgq_get_capacity(const stk_msgq_t *mq)
Get the maximum number of messages the queue can hold.
void stk_mutex_unlock(stk_mutex_t *mtx)
Unlock the mutex.
void stk_pipe_destroy(stk_pipe_t *pipe)
Destroy a Pipe.
stk_cs_session_t stk_critical_section_enter_ex(stk_cs_session_t ses)
Enter global critical section - disable context switches on current core.
Definition stk_c.cpp:672
stk_timeout_t stk_ticks_from_ms_clamped_to_timeout(stk_timeout_t ms)
Get ticks from milliseconds using current kernel tick resolution, clamped to the maximum value repres...
Definition stk_c.cpp:639
size_t stk_pipe_get_element_size(const stk_pipe_t *pipe)
Get the size of each element in bytes.
stk_cycle_t stk_sys_timer_count(void)
Get raw system timer counter value.
Definition stk_c.cpp:640
#define STK_MUTEX_IMPL_SIZE
A memory size (multiples of stk_word_t) required for Mutex instance.
Definition stk_c.h:912
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:675
stk_tid_t stk_task_get_id(const stk_task_t *tsk)
Get the unique identifier of a task.
Definition stk_c.cpp:610
#define STK_EF_ERROR_MASK
Definition stk_c.h:1273
uint32_t stk_tick_resolution(void)
Returns how many microseconds correspond to one kernel tick.
Definition stk_c.cpp:636
bool stk_sem_wait(stk_sem_t *sem, stk_timeout_t timeout)
Wait for a semaphore resource.
bool stk_msgq_putfront(stk_msgq_t *mq, const void *msg, stk_timeout_t timeout)
Put a message into the front of the queue (priority insert).
size_t stk_msgq_get_count(const stk_msgq_t *mq)
Get the current number of messages waiting in the queue.
uint32_t stk_sys_timer_frequency(void)
Get system timer frequency in Hz.
Definition stk_c.cpp:641
void stk_kernel_schedule_task_removal(stk_kernel_t *k, stk_task_t *task)
Schedule removal of a running task from the kernel on the next tick.
Definition stk_c.cpp:453
void stk_sleep_ms(stk_timeout_t ms)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:648
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:478
#define STK_CV_IMPL_SIZE
A memory size (multiples of stk_word_t) required for ConditionVariable instance.
Definition stk_c.h:1029
uint8_t * stk_msgq_get_buffer(stk_msgq_t *mq)
Get a pointer to the raw message data buffer.
#define STK_MSGQ_IMPL_SIZE
A memory size (multiples of stk_word_t) required for a MessageQueue instance.
Definition stk_c.h:1679
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:429
void stk_spinlock_lock(stk_spinlock_t *slock)
Acquire the SpinLock (recursive).
bool stk_msgq_put(stk_msgq_t *mq, const void *msg, stk_timeout_t timeout)
Put a message into the queue.
bool stk_msgq_tryput(stk_msgq_t *mq, const void *msg)
Attempt to put a message into the queue without blocking.
stk::sync::Event * stk_event_get_instance(stk_event_t *ev)
Get the underlying C++ stk::sync::Event object wrapped by a stk_event_t handle.
void stk_kernel_init(stk_kernel_t *k, uint32_t tick_period_us)
Initialize kernel with given tick period.
Definition stk_c.cpp:400
void stk_critical_section_exit_ex(stk_cs_session_t ses)
Leave global critical section - re-enable context switches.
Definition stk_c.cpp:677
stk_tick_t stk_hires_time_us(void)
Get elapsed time in microseconds from the high-resolution clock.
Definition stk_c.cpp:644
#define __stk_c_aligned
Memory buffer alignment attribute.
Definition stk_c.h:211
void stk_pipe_reset(stk_pipe_t *pipe)
Discard all elements and reset the pipe to the empty state.
void(* stk_task_entry_t)(void *arg)
Task entry point function type.
Definition stk_c.h:143
void stk_sem_destroy(stk_sem_t *sem)
Destroy a Semaphore.
void stk_spinlock_unlock(stk_spinlock_t *slock)
Release the SpinLock.
size_t stk_pipe_tryread_bulk_triggered(stk_pipe_t *pipe, void *dst, size_t max_count)
Non-blocking variant of stk_pipe_read_bulk_triggered.
bool stk_sem_trywait(stk_sem_t *sem)
Poll the semaphore without blocking.
stk_kernel_state_t
Kernel state.
Definition stk_c.h:379
stk_pipe_t * stk_pipe_create(stk_pipe_mem_t *const membuf, uint32_t membuf_size, uint8_t *buf, uint32_t buf_size, size_t capacity, size_t element_size)
Create a Pipe (using provided memory).
void stk_tls_set(void *ptr)
Set thread-local pointer.
stk::sync::RWMutex * stk_rwmutex_get_instance(stk_rwmutex_t *rw)
Get the underlying C++ stk::sync::RWMutex object wrapped by a stk_rwmutex_t handle.
void stk_rwmutex_read_unlock(stk_rwmutex_t *rw)
Release the shared reader lock.
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:556
stk_tick_t stk_ticks(void)
Returns number of ticks elapsed since kernel start.
Definition stk_c.cpp:635
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:587
size_t stk_msgq_get_msg_size(const stk_msgq_t *mq)
Get the size of each message in bytes.
stk_spinlock_t * stk_spinlock_create(stk_spinlock_mem_t *const membuf, uint32_t membuf_size)
Create a recursive SpinLock.
bool stk_pipe_tryread(stk_pipe_t *pipe, void *data)
Attempt to read a single element from the pipe without blocking.
void stk_critical_section_enter()
Enter global critical section - disable context switches on current core.
Definition stk_c.cpp:682
uint32_t stk_ef_get(stk_ef_t *ef)
Read the current flags word without modifying it.
stk_word_t stk_tid_t
Task id.
Definition stk_c.h:98
stk::ITask * stk_task_get_instance(stk_task_t *tsk)
Get the underlying C++ stk::ITask object wrapped by a stk_task_t handle.
Definition stk_c.cpp:617
#define STK_PIPE_IMPL_SIZE
A memory size (multiples of stk_word_t) required for a Pipe control-block.
Definition stk_c.h:1397
stk::sync::ConditionVariable * stk_cv_get_instance(stk_cv_t *cv)
Get the underlying C++ stk::sync::ConditionVariable object wrapped by a stk_cv_t handle.
int64_t stk_tick_t
Ticks value.
Definition stk_c.h:103
size_t stk_pipe_read_bulk_triggered(stk_pipe_t *pipe, void *dst, size_t trigger, size_t max_count, stk_timeout_t timeout)
Read at least trigger elements, then drain up to max_count without blocking.
bool stk_msgq_get(stk_msgq_t *mq, void *msg, stk_timeout_t timeout)
Get a message from the queue.
#define STK_SPINLOCK_IMPL_SIZE
A memory size (multiples of stk_word_t) required for SpinLock instance.
Definition stk_c.h:977
void stk_event_pulse(stk_event_t *ev)
Pulse the event (signal then immediately reset).
bool stk_msgq_tryputfront(stk_msgq_t *mq, const void *msg)
Attempt to put a message into the front of the queue without blocking.
stk_kernel_t * stk_kernel_create(uint8_t core_nr)
Create kernel.
Definition stk_c.cpp:332
bool stk_pipe_is_full(const stk_pipe_t *pipe)
Check whether the pipe is currently full.
uintptr_t stk_word_t
CPU register type.
Definition stk_c.h:94
bool stk_pipe_is_empty(const stk_pipe_t *pipe)
Check whether the pipe is currently empty.
static bool stk_ef_is_error(uint32_t result)
Returns true if a value returned by stk_ef_set(), stk_ef_clear(), stk_ef_wait(), or stk_ef_trywait() ...
Definition stk_c.h:1278
bool stk_pipe_read(stk_pipe_t *pipe, void *data, stk_timeout_t timeout)
Read a single element from the pipe.
stk_cv_t * stk_cv_create(stk_cv_mem_t *const membuf, uint32_t membuf_size)
Create a Condition Variable (using provided memory).
stk_mutex_t * stk_mutex_create(stk_mutex_mem_t *const membuf, uint32_t membuf_size)
Create a Mutex (using provided memory).
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:445
void stk_sleep_cancel(stk_tid_t tid)
Cancel the sleep of a task, waking it immediately.
Definition stk_c.cpp:650
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:637
bool stk_event_reset(stk_event_t *ev)
Reset the event to non-signaled state.
int32_t stk_weight_t
Task weight value.
Definition stk_c.h:122
#define STK_RWMUTEX_IMPL_SIZE
A memory size (multiples of stk_word_t) required for RWMutex instance.
Definition stk_c.h:1953
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:537
stk_kernel_state_t stk_kernel_get_state(const stk_kernel_t *k)
Get state of the scheduler.
Definition stk_c.cpp:414
void stk_task_destroy(stk_task_t *tsk)
Destroy dynamically created task object.
Definition stk_c.cpp:624
bool stk_sleep_until(stk_tick_t ts)
Put current task to sleep (non-HRT kernels only).
Definition stk_c.cpp:649
bool stk_msgq_is_storage_valid(const stk_msgq_t *mq)
Verify that the backing storage is valid and the queue is ready for use.
bool stk_rwmutex_timed_lock(stk_rwmutex_t *rw, stk_timeout_t timeout)
Try to acquire the write lock with a timeout.
#define STK_EF_IMPL_SIZE
A memory size (multiples of stk_word_t) required for EventFlags instance.
Definition stk_c.h:1287
void stk_rwmutex_destroy(stk_rwmutex_t *rw)
Destroy an RWMutex.
void stk_msgq_destroy(stk_msgq_t *mq)
Destroy a MessageQueue.
void stk_kernel_process_hard_fault(stk_kernel_t *k)
Trigger a kernel hard fault (safe-state handler).
Definition stk_c.cpp:523
static stk_time_t stk_ms_from_ticks_r(stk_tick_t ticks, uint32_t resolution)
Convert ticks to milliseconds using an explicit tick resolution.
Definition stk_c.h:699
bool stk_rwmutex_timed_read_lock(stk_rwmutex_t *rw, stk_timeout_t timeout)
Try to acquire the read lock with a timeout.
int32_t stk_timeout_t
Timeout value.
Definition stk_c.h:113
stk::sync::Mutex * stk_mutex_get_instance(stk_mutex_t *mtx)
Get the underlying C++ stk::sync::Mutex object wrapped by a stk_mutex_t handle.
bool stk_msgq_peek(stk_msgq_t *mq, void *msg, stk_timeout_t timeout)
Peek at the next message to be delivered without removing it.
static stk_time_t stk_ms_from_ticks(stk_tick_t ticks)
Convert ticks to milliseconds using the current kernel tick resolution.
Definition stk_c.h:710
void stk_critical_section_exit()
Leave global critical section - re-enable context switches.
Definition stk_c.cpp:687
bool stk_msgq_trypeek(stk_msgq_t *mq, void *msg)
Attempt to peek at the next message without blocking.
void stk_delay(stk_timeout_t ticks)
Busy-wait delay (other tasks continue to run).
Definition stk_c.cpp:645
bool stk_kernel_is_schedulable(const stk_kernel_t *k)
Test whether currently configured task set is schedulable.
Definition stk_c.cpp:421
void stk_cv_notify_all(stk_cv_t *cv)
Wake all tasks waiting on the condition variable.
bool stk_pipe_trywrite(stk_pipe_t *pipe, const void *data)
Attempt to write a single element to the pipe without blocking.
void stk_rwmutex_unlock(stk_rwmutex_t *rw)
Release the exclusive writer lock.
stk::sync::MessageQueue * stk_msgq_get_instance(stk_msgq_t *mq)
Get the underlying C++ stk::sync::MessageQueue object wrapped by a stk_msgq_t handle.
bool stk_barrier_wait(stk_barrier_t *barrier)
Block the calling task until count tasks have called stk_barrier_wait().
size_t stk_pipe_tryread_bulk(stk_pipe_t *pipe, void *dst, size_t count)
Attempt to read multiple elements from the pipe without blocking.
@ STK_KERNEL_STATE_INACTIVE
not ready, stk_kernel_init() must be called
Definition stk_c.h:380
@ STK_KERNEL_STATE_READY
ready to start, stk_kernel_start() must be called
Definition stk_c.h:381
@ STK_KERNEL_STATE_RUNNING
initialized and running, stk_kernel_start() was called successfully
Definition stk_c.h:382
@ STK_KERNEL_STATE_SUSPENDED
scheduling suspended via stk_kernel_service_suspend() (tickless idle)
Definition stk_c.h:383
Namespace of STK package.
Interface for a user task.
Definition stk_common.h:755
Interface for the implementation of the kernel of the scheduler. It supports Soft and Hard Real-Time ...
Cyclic barrier that blocks a fixed-size group of tasks until all of them have arrived.
Condition Variable primitive for signaling between tasks based on specific predicates.
Definition stk_sync_cv.h:68
Binary synchronization event (signaled / non-signaled) primitive.
32-bit event flags group for multi-flag synchronization between tasks.
Fixed-capacity, fixed-message-size FIFO queue for inter-task communication.
Recursive mutex primitive that allows the same thread to acquire the lock multiple times.
Thread-safe FIFO communication pipe for inter-task data passing.
Reader-Writer Lock synchronization primitive for non-recursive shared and exclusive access.
Counting semaphore primitive for resource management and signaling.
Recursive spinlock.
C-level callback table that mirrors stk::IPlatform::IEventOverrider.
Definition stk_c.h:505
bool(* on_hard_fault)(void *user_data)
Called by the kernel when a hard fault occurs (e.g. HRT deadline missed).
Definition stk_c.h:521
bool(* on_sleep)(stk_timeout_t sleep_ticks, void *user_data)
Called by the kernel when it is about to enter a sleep (idle) state.
Definition stk_c.h:513
void * user_data
Opaque pointer forwarded unchanged to every callback.
Definition stk_c.h:526
Opaque memory container for a Mutex instance.
Definition stk_c.h:916
stk_word_t data[(10U+((0) ? 1U :0U))]
Definition stk_c.h:917
Opaque memory container for SpinLock object.
Definition stk_c.h:982
stk_word_t data[(1)]
Definition stk_c.h:983
Opaque memory container for a ConditionVariable instance.
Definition stk_c.h:1033
stk_word_t data[(7U+((0) ? 1U :0U))]
Definition stk_c.h:1034
Opaque memory container for an Event instance.
Definition stk_c.h:1095
stk_word_t data[(8U+((0) ? 1U :0U))]
Definition stk_c.h:1096
Opaque memory container for a Semaphore instance.
Definition stk_c.h:1172
stk_word_t data[(8U+((0) ? 1U :0U))]
Definition stk_c.h:1173
Opaque memory container for an EventFlags instance.
Definition stk_c.h:1291
stk_word_t data[((7U+((0) ? 1U :0U))+1U+((0) ? 1U :0U))]
Definition stk_c.h:1292
Opaque memory container for a Pipe control-block.
Definition stk_c.h:1401
stk_word_t data[(6U+(2U *(7U+((0) ? 1U :0U)))+((0) ? 1U :0U))]
Definition stk_c.h:1402
Opaque memory container for a MessageQueue instance.
Definition stk_c.h:1683
stk_word_t data[(6U+(2U *(7U+((0) ? 1U :0U)))+((0) ? 1U :0U))]
Definition stk_c.h:1684
Opaque memory container for an RWMutex instance.
Definition stk_c.h:1957
stk_word_t data[(17U+((0) ? 3U :0U))]
Definition stk_c.h:1958
Opaque memory container for a Barrier instance.
Definition stk_c.h:2060
stk_word_t data[((10U+((0) ? 1U :0U))+(7U+((0) ? 1U :0U))+4U+((0) ? 1U :0U))]
Definition stk_c.h:2061