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_defs.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_DEFS_H_
11#define STK_DEFS_H_
12
13#include <stddef.h>
14#include <stdint.h>
15#ifdef __ICCARM__
16 #include <intrinsics.h>
17 #if (__IAR_SYSTEMS_ICC__ < 8)
18 #error "Only IAR EWARM 8.0 and higher is supported by STK."
19 #endif
20#endif
21
28#include "stk_config.h"
29
41#ifndef STK_TICKLESS_IDLE
42 #define STK_TICKLESS_IDLE (0)
43#endif
44
49#ifndef STK_STRICT_COMPLIANCY
50 #define STK_STRICT_COMPLIANCY (0)
51#endif
52
61#ifndef STK_TICKLESS_USE_ARM_DWT
62 #define STK_TICKLESS_USE_ARM_DWT (1)
63#endif
64
75#ifndef STK_TICKLESS_TICKS_MAX
76 #define STK_TICKLESS_TICKS_MAX (1000)
77#endif
78#if STK_TICKLESS_TICKS_MAX > 100000
79 #error "STK_TICKLESS_TICKS_MAX is too large: cpu_ticks_requested may overflow uint32_t."
80#endif
81
97#ifndef STK_TLS
98 #define STK_TLS (0)
99#endif
100
125#ifndef STK_TLS_PREFER_REGISTER
126 #define STK_TLS_PREFER_REGISTER (0)
127#endif
128
137#if STK_SEGGER_SYSVIEW
138 #define STK_STACK_NEEDS_TASK_ID (1)
139#endif
140
148#if !defined(STK_SYNC_DEBUG_NAMES) && STK_SEGGER_SYSVIEW
149 #define STK_SYNC_DEBUG_NAMES (1)
150#elif !defined(STK_SYNC_DEBUG_NAMES)
151 #define STK_SYNC_DEBUG_NAMES (0)
152#endif
153
157#if !STK_STRICT_COMPLIANCY
158 #define STK_VIRT_DTOR
159#else
160 #define STK_VIRT_DTOR virtual
161#endif
162
169#if defined(__GNUC__) || defined(__ICCARM__)
170 #define __stk_forceinline __attribute__((always_inline)) inline
171#elif defined(_MSC_VER)
172 #define __stk_forceinline __forceinline
173#else
174 #define __stk_forceinline inline
175#endif
176
183#if defined(__GNUC__) || defined(__ICCARM__)
184 #define __stk_aligned(x) __attribute__((aligned(x)))
185#else
186 #define __stk_aligned(x)
187#endif
188
194#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) || defined(__CC_ARM) || defined(__ARMCC_VERSION)
195 #define __stk_weak __attribute__((weak))
196#else
197 #define __stk_weak
198#endif
199
207#if defined(__GNUC__) || defined(__ICCARM__)
208 #define __stk_attr_naked __attribute__((naked))
209#else
210 #define __stk_attr_naked
211#endif
212
218#if defined(__GNUC__) || defined(__ICCARM__)
219 #define __stk_attr_noreturn __attribute__((__noreturn__))
220#else
221 #define __stk_attr_noreturn
222#endif
223
229#if defined(__GNUC__) || defined(__ICCARM__)
230 #define __stk_attr_unused __attribute__((unused))
231#else
232 #define __stk_attr_unused
233#endif
234
240#if defined(__GNUC__) || defined(__ICCARM__)
241 #define __stk_attr_used __attribute__((used))
242#else
243 #define __stk_attr_used
244#endif
245
251#if defined(__GNUC__) || defined(__ICCARM__)
252 #define __stk_attr_noinline __attribute__((noinline))
253#else
254 #define __stk_attr_noinline
255#endif
256
262#if defined(__GNUC__) || defined(__ICCARM__)
263 #define __stk_attr_deprecated __attribute__((deprecated))
264#elif defined(_MSC_VER)
265 #define __stk_attr_deprecated __declspec(deprecated)
266#else
267 #define __stk_attr_deprecated
268#endif
269
276#if defined(__GNUC__) || defined(__clang__)
277 #define __stk_full_memfence() __sync_synchronize()
278#elif defined(__ICCARM__)
279 #define __stk_full_memfence() __DMB()
280#elif defined(_MSC_VER)
281 #define __stk_full_memfence() __stk_dmb()
282#else
283 #error "__stk_full_memfence() is not implemented for this compiler. Add a definition to stk_defs.h."
284#endif
285
295#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
296 #define __stk_compiler_barrier() __asm volatile("" ::: "memory")
297#elif defined(_MSC_VER)
298 #define __stk_compiler_barrier() _ReadWriteBarrier()
299#else
300 #error "__stk_compiler_barrier() is not implemented for this compiler. Add a definition to stk_defs.h."
301#endif
302
316#ifndef __stk_relax_cpu
317#if defined(__GNUC__) || defined(__clang__)
318 #if defined(__i386__) || defined(__x86_64__)
319 #define __stk_relax_cpu() __builtin_ia32_pause()
320 #elif defined(__riscv)
321 #ifdef __riscv_zihintpause
322 #define __stk_relax_cpu() __builtin_riscv_pause()
323 #else
324 #define __stk_relax_cpu() __stk_full_memfence()
325 #endif
326 #elif defined(__ARM_ARCH) || defined(_STK_ARCH_ARM_CORTEX_M)
327 #define __stk_relax_cpu() __asm volatile("yield")
328 #else
329 #define __stk_relax_cpu() __stk_full_memfence()
330 #endif
331#elif defined(__ICCARM__)
332 #define __stk_relax_cpu() __asm volatile("YIELD")
333#elif defined(_MSC_VER)
334 #include <intrin.h>
335 #if defined(_M_IX86) || defined(_M_X64)
336 #define __stk_relax_cpu() _mm_pause()
337 #elif defined(_M_ARM) || defined(_M_ARM64)
338 #define __stk_relax_cpu() __yield()
339 #else
340 #define __stk_relax_cpu() __stk_full_memfence()
341 #endif
342#else
343 #error "__stk_relax_cpu() is not implemented for this compiler. Add a definition to stk_defs.h."
344#endif
345#endif
346
361#if defined(DEBUG) || defined(_DEBUG)
362 #if defined(_STK_ARCH_ARM_CORTEX_M)
363 #define __stk_debug_break() __asm volatile("bkpt 0")
364 #elif defined(_STK_ARCH_RISC_V)
365 #define __stk_debug_break() __asm volatile("ebreak")
366 #elif defined(_STK_ARCH_X86_WIN32)
367 #ifdef _MSC_VER
368 #define __stk_debug_break() __debugbreak()
369 #else
370 #define __stk_debug_break() __asm volatile("int $3")
371 #endif
372 #endif
373#else
374 #define __stk_debug_break()
375#endif
376
381#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))
382 #define __stk_constexpr_cpp17 constexpr
383#else
384 #define __stk_constexpr_cpp17
385#endif
386
403#ifdef _STK_ASSERT_REDIRECT
404 extern void STK_ASSERT_HANDLER(const char *, const char *, int32_t);
405 #define STK_ASSERT(e) ((e) ? (void)0 : STK_ASSERT_HANDLER(#e, __FILE__, __LINE__))
406#else
407 #if defined(DEBUG) || defined(_DEBUG)
408 #include <assert.h>
409 #define STK_ASSERT(e) assert(e)
410 #else
411 #define STK_ASSERT(e)
412 #endif
413#endif
414
423#define STK_STATIC_ASSERT_DESC_N(NAME, X, DESC) static_assert((X), DESC)
424
431#define STK_STATIC_ASSERT_DESC(X, DESC) STK_STATIC_ASSERT_DESC_N(_, X, DESC)
432
440#define STK_STATIC_ASSERT_N(NAME, X) STK_STATIC_ASSERT_DESC_N(N, (X), #X)
441
448#define STK_STATIC_ASSERT(X) STK_STATIC_ASSERT_DESC_N(_, (X), #X)
449
457#ifndef STK_STACK_MEMORY_FILLER
458 #define STK_STACK_MEMORY_FILLER (static_cast<stk::Word>((sizeof(stk::Word) <= 4U) ? 0xDEADBEEFU : 0xDEADBEEFDEADBEEFULL))
459#endif
460
464#ifndef STK_STACK_MEMORY_ALIGN
465 #if defined(__riscv)
466 #define STK_STACK_MEMORY_ALIGN (16U)
467 #elif defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
468 #define STK_STACK_MEMORY_ALIGN (8U)
469 #else // ARM, others
470 #define STK_STACK_MEMORY_ALIGN (4U)
471 #endif
472#endif
473
484#ifndef STK_CRITICAL_SECTION_NESTINGS_MAX
485 #define STK_CRITICAL_SECTION_NESTINGS_MAX (16U)
486#endif
487
494#ifndef STK_ARCH_CPU_COUNT
495 #define STK_ARCH_CPU_COUNT (1U)
496#endif
497
513#ifndef STK_STACK_SIZE_MIN
514 #ifdef __riscv
515 #if defined(__riscv_32e) && (__riscv_32e == 1)
516 // RISC-V RV32E (Embedded): Small 16-register file
517 #if !defined(__riscv_flen) || (__riscv_flen == 0)
518 #define STK_STACK_SIZE_MIN (32U)
519 #else
520 // FPU present: Requires additional space for 32 FP registers
521 #define STK_STACK_SIZE_MIN (32U + (__riscv_flen * 2))
522 #endif
523 #else
524 // Standard RISC-V (RV32I/RV64I): Large 32-register file
525 // Higher minimum to prevent memory corruption on platforms like RP2350
526 #if !defined(__riscv_flen) || (__riscv_flen == 0)
527 #define STK_STACK_SIZE_MIN (256U)
528 #else
529 // Standard RISC-V with FPU: Maximum frame allocation
530 #define STK_STACK_SIZE_MIN (512U + (__riscv_flen * 2))
531 #endif
532 #endif
533 #else
534 // ARM Cortex-M and other architectures
535 #define STK_STACK_SIZE_MIN (32U)
536 #endif
537#endif
538
547#ifndef STK_SLEEP_TRAP_STACK_SIZE
548 #define STK_SLEEP_TRAP_STACK_SIZE (STK_STACK_SIZE_MIN)
549#endif
550
562template <size_t MODE, size_t FLAG, size_t ONTRUE, size_t ONFALSE>
564{
565#if defined(_MSC_VER) || defined(__ICCARM__)
566 /* MSVC and IAR builds may over-allocate when the flag is not set to avoid compile errors. */
567 static constexpr size_t Value = ((ONTRUE > ONFALSE) ? ONTRUE : ONFALSE);
568#else
569 /* GCC and Clang support zero-sized array extensions natively. */
570 static constexpr size_t Value = (((MODE & FLAG) != 0U) ? ONTRUE : ONFALSE);
571#endif
572};
573
584#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
585 #define STK_ENDIAN_IDX_HI (0) // big-endian: high word at index 0
586 #define STK_ENDIAN_IDX_LO (1) // big-endian: low word at index 1
587#else
588 #define STK_ENDIAN_IDX_HI (1) // little-endian (default): high word at index 1
589 #define STK_ENDIAN_IDX_LO (0) // little-endian (default): low word at index 0
590#endif
591
603#define STK_NONCOPYABLE_CLASS(TYPE)\
604 TYPE(const TYPE &) = delete;\
605 TYPE &operator=(const TYPE &) = delete;
606
610#define STK_UNUSED(X) static_cast<void>((X))
611
615#ifndef _STK_CUSTOM_MEMCPY
616#include <cstring>
617static __stk_forceinline void STK_MEMCPY(void *const dest, const void *const src, const size_t size)
618{
619 /* MISRA-compliant explicitly-typed call to underlying implementation */
620 static_cast<void>(memcpy(dest, src, size));
621}
622#endif
623
627namespace stk {
628
632template <typename T>
633static constexpr T Min(T a, T b) { return ((a < b) ? a : b); }
634
638template <typename T>
639static constexpr T Max(T a, T b) { return ((a > b) ? a : b); }
640
645namespace util {}
646
647} // namespace stk
648
649#endif /* STK_DEFS_H_ */
#define __stk_forceinline
Forces compiler to always inline the decorated function, regardless of optimisation level.
Definition stk_defs.h:174
static void STK_MEMCPY(void *const dest, const void *const src, const size_t size)
A wrapper for a built-in memcpy, redefine to your own if required.
Definition stk_defs.h:617
Namespace of STK package.
static constexpr T Max(T a, T b)
Compile-time maximum of two values.
Definition stk_defs.h:639
static constexpr T Min(T a, T b)
Compile-time minimum of two values.
Definition stk_defs.h:633
Internal utility namespace containing data structure helpers (linked lists, etc.) used by the kernel ...
Selects a static array element count at compile time based on a mode flag.
Definition stk_defs.h:564
static constexpr size_t Value
Definition stk_defs.h:570