16 #include <intrinsics.h>
17 #if (__IAR_SYSTEMS_ICC__ < 8)
18 #error "Only IAR EWARM 8.0 and higher is supported by STK."
28#include "stk_config.h"
41#ifndef STK_TICKLESS_IDLE
42 #define STK_TICKLESS_IDLE (0)
49#ifndef STK_STRICT_COMPLIANCY
50 #define STK_STRICT_COMPLIANCY (0)
61#ifndef STK_TICKLESS_USE_ARM_DWT
62 #define STK_TICKLESS_USE_ARM_DWT (1)
75#ifndef STK_TICKLESS_TICKS_MAX
76 #define STK_TICKLESS_TICKS_MAX (1000)
78#if STK_TICKLESS_TICKS_MAX > 100000
79 #error "STK_TICKLESS_TICKS_MAX is too large: cpu_ticks_requested may overflow uint32_t."
125#ifndef STK_TLS_PREFER_REGISTER
126 #define STK_TLS_PREFER_REGISTER (0)
137#if STK_SEGGER_SYSVIEW
138 #define STK_STACK_NEEDS_TASK_ID (1)
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)
157#if !STK_STRICT_COMPLIANCY
158 #define STK_VIRT_DTOR
160 #define STK_VIRT_DTOR virtual
169#if defined(__GNUC__) || defined(__ICCARM__)
170 #define __stk_forceinline __attribute__((always_inline)) inline
171#elif defined(_MSC_VER)
172 #define __stk_forceinline __forceinline
174 #define __stk_forceinline inline
183#if defined(__GNUC__) || defined(__ICCARM__)
184 #define __stk_aligned(x) __attribute__((aligned(x)))
186 #define __stk_aligned(x)
194#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) || defined(__CC_ARM) || defined(__ARMCC_VERSION)
195 #define __stk_weak __attribute__((weak))
207#if defined(__GNUC__) || defined(__ICCARM__)
208 #define __stk_attr_naked __attribute__((naked))
210 #define __stk_attr_naked
218#if defined(__GNUC__) || defined(__ICCARM__)
219 #define __stk_attr_noreturn __attribute__((__noreturn__))
221 #define __stk_attr_noreturn
229#if defined(__GNUC__) || defined(__ICCARM__)
230 #define __stk_attr_unused __attribute__((unused))
232 #define __stk_attr_unused
240#if defined(__GNUC__) || defined(__ICCARM__)
241 #define __stk_attr_used __attribute__((used))
243 #define __stk_attr_used
251#if defined(__GNUC__) || defined(__ICCARM__)
252 #define __stk_attr_noinline __attribute__((noinline))
254 #define __stk_attr_noinline
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)
267 #define __stk_attr_deprecated
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()
283 #error "__stk_full_memfence() is not implemented for this compiler. Add a definition to stk_defs.h."
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()
300 #error "__stk_compiler_barrier() is not implemented for this compiler. Add a definition to stk_defs.h."
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()
324 #define __stk_relax_cpu() __stk_full_memfence()
326 #elif defined(__ARM_ARCH) || defined(_STK_ARCH_ARM_CORTEX_M)
327 #define __stk_relax_cpu() __asm volatile("yield")
329 #define __stk_relax_cpu() __stk_full_memfence()
331#elif defined(__ICCARM__)
332 #define __stk_relax_cpu() __asm volatile("YIELD")
333#elif defined(_MSC_VER)
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()
340 #define __stk_relax_cpu() __stk_full_memfence()
343 #error "__stk_relax_cpu() is not implemented for this compiler. Add a definition to stk_defs.h."
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)
368 #define __stk_debug_break() __debugbreak()
370 #define __stk_debug_break() __asm volatile("int $3")
374 #define __stk_debug_break()
381#if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))
382 #define __stk_constexpr_cpp17 constexpr
384 #define __stk_constexpr_cpp17
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__))
407 #if defined(DEBUG) || defined(_DEBUG)
409 #define STK_ASSERT(e) assert(e)
411 #define STK_ASSERT(e)
423#define STK_STATIC_ASSERT_DESC_N(NAME, X, DESC) static_assert((X), DESC)
431#define STK_STATIC_ASSERT_DESC(X, DESC) STK_STATIC_ASSERT_DESC_N(_, X, DESC)
440#define STK_STATIC_ASSERT_N(NAME, X) STK_STATIC_ASSERT_DESC_N(N, (X), #X)
448#define STK_STATIC_ASSERT(X) STK_STATIC_ASSERT_DESC_N(_, (X), #X)
457#ifndef STK_STACK_MEMORY_FILLER
458 #define STK_STACK_MEMORY_FILLER (static_cast<stk::Word>((sizeof(stk::Word) <= 4U) ? 0xDEADBEEFU : 0xDEADBEEFDEADBEEFULL))
464#ifndef STK_STACK_MEMORY_ALIGN
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)
470 #define STK_STACK_MEMORY_ALIGN (4U)
484#ifndef STK_CRITICAL_SECTION_NESTINGS_MAX
485 #define STK_CRITICAL_SECTION_NESTINGS_MAX (16U)
494#ifndef STK_ARCH_CPU_COUNT
495 #define STK_ARCH_CPU_COUNT (1U)
513#ifndef STK_STACK_SIZE_MIN
515 #if defined(__riscv_32e) && (__riscv_32e == 1)
517 #if !defined(__riscv_flen) || (__riscv_flen == 0)
518 #define STK_STACK_SIZE_MIN (32U)
521 #define STK_STACK_SIZE_MIN (32U + (__riscv_flen * 2))
526 #if !defined(__riscv_flen) || (__riscv_flen == 0)
527 #define STK_STACK_SIZE_MIN (256U)
530 #define STK_STACK_SIZE_MIN (512U + (__riscv_flen * 2))
535 #define STK_STACK_SIZE_MIN (32U)
547#ifndef STK_SLEEP_TRAP_STACK_SIZE
548 #define STK_SLEEP_TRAP_STACK_SIZE (STK_STACK_SIZE_MIN)
562template <
size_t MODE,
size_t FLAG,
size_t ONTRUE,
size_t ONFALSE>
565#if defined(_MSC_VER) || defined(__ICCARM__)
567 static constexpr size_t Value = ((ONTRUE > ONFALSE) ? ONTRUE : ONFALSE);
570 static constexpr size_t Value = (((MODE & FLAG) != 0U) ? ONTRUE : ONFALSE);
584#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
585 #define STK_ENDIAN_IDX_HI (0)
586 #define STK_ENDIAN_IDX_LO (1)
588 #define STK_ENDIAN_IDX_HI (1)
589 #define STK_ENDIAN_IDX_LO (0)
603#define STK_NONCOPYABLE_CLASS(TYPE)\
604 TYPE(const TYPE &) = delete;\
605 TYPE &operator=(const TYPE &) = delete;
610#define STK_UNUSED(X) static_cast<void>((X))
615#ifndef _STK_CUSTOM_MEMCPY
620 static_cast<void>(memcpy(dest, src, size));
633static constexpr T
Min(T a, T b) {
return ((a < b) ? a : b); }
639static constexpr T
Max(T a, T b) {
return ((a > b) ? a : b); }
#define __stk_forceinline
Forces compiler to always inline the decorated function, regardless of optimisation level.
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.
Namespace of STK package.
static constexpr T Max(T a, T b)
Compile-time maximum of two values.
static constexpr T Min(T a, T b)
Compile-time minimum of two values.
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.
static constexpr size_t Value