SuperTinyKernel™ RTOS 1.05.3
Lightweight, high-performance, deterministic, bare-metal C++ RTOS for resource-constrained embedded systems. MIT Open Source License.
Loading...
Searching...
No Matches
stk Namespace Reference

Namespace of STK package. More...

Namespaces

namespace  memory
 Memory-related primitives.
namespace  hw
 Hardware Abstraction Layer (HAL) for architecture-specific operations.
namespace  util
 Internal utility namespace containing data structure helpers (linked lists, etc.) used by the kernel implementation. Not part of the public user API.
namespace  sync
 Synchronization primitives for task coordination and resource protection.
namespace  time
 Time-related primitives.
namespace  test
 Namespace of the test inventory.

Classes

class  PlatformArmCortexM
 Concrete implementation of IPlatform driver for the Arm Cortex-M0, M3, M4, M7 processors. More...
class  PlatformRiscV
 Concrete implementation of IPlatform driver for the Risc-V processors. More...
class  PlatformContext
 Base platform context for all platform implementations. More...
class  PlatformX86Win32
 Concrete implementation of IPlatform driver for the x86 Win32 platform. More...
class  Kernel
 Concrete implementation of IKernel. More...
class  StackMemoryDef
 Stack memory type definition. More...
class  Stack
 Stack descriptor. More...
class  IStackMemory
 Interface for a stack memory region. More...
class  IWaitObject
 Wait object. More...
class  ITraceable
 Traceable object. More...
class  ISyncObject
 Synchronization object. More...
class  IMutex
 Interface for mutex synchronization primitive. More...
class  ITask
 Interface for a user task. More...
class  IKernelTask
 Scheduling-strategy-facing interface for a kernel task slot. More...
class  IPlatform
 Interface for a platform driver. More...
class  ITaskSwitchStrategy
 Interface for a task switching strategy implementation. More...
class  IKernel
 Interface for the implementation of the kernel of the scheduler. It supports Soft and Hard Real-Time modes. More...
class  IKernelService
 Interface for the kernel services exposed to the user processes during run-time when Kernel started scheduling the processes. More...
class  Task
 Partial implementation of the user task. More...
class  TaskW
 Partial implementation of the user task with a compile-time scheduling weight. Use when the kernel is configured with SwitchStrategySmoothWeightedRoundRobin. More...
class  StackMemoryWrapper
 Adapts an externally-owned stack memory array to the IStackMemory interface. More...
class  SwitchStrategyEDF
 Earliest Deadline First (EDF) scheduling strategy: always selects the runnable task with the least time remaining before its deadline expires. More...
class  SwitchStrategyFixedPriority
 Fixed-priority preemptive scheduling strategy with round-robin arbitration within each priority level. More...
class  SwitchStrategyMonotonic
 Monotonic scheduling strategy: Rate-Monotonic (RM) or Deadline-Monotonic (DM), selected at compile time by the _Type template parameter. More...
class  SchedulabilityCheck
 Utility class providing static methods for Worst-Case Response Time (WCRT) schedulability analysis of a monotonic HRT task set. More...
class  SwitchStrategyRoundRobin
 Round-Robin task-switching strategy: each runnable task receives one time slice (one tick interval) in turn before the kernel moves to the next task. More...
class  SwitchStrategySmoothWeightedRoundRobin
 Smooth Weighted Round-Robin (SWRR) task-switching strategy: distributes CPU time proportionally to per-task weights while avoiding execution bursts by spreading selections evenly over time. More...

Typedefs

typedef PlatformArmCortexM PlatformDefault
 Default platform implementation.
typedef uintptr_t Word
 Native processor word type.
typedef Word TId
typedef int32_t Timeout
 Timeout time (ticks).
typedef int64_t Ticks
 Ticks value.
typedef uint64_t Cycles
 Cycles value.
typedef SwitchStrategyFixedPriority< 32 > SwitchStrategyFP32
 Shorthand alias for SwitchStrategyFixedPriority<32>: 32 priority levels (0..31), using a single 32-bit m_ready_bitmap for O(1) highest-priority lookup.
typedef SwitchStrategyMonotonic< MSS_TYPE_RATESwitchStrategyRM
 Shorthand alias for SwitchStrategyMonotonic<MSS_TYPE_RATE>: Rate-Monotonic scheduling (shorter scheduling period -> higher priority).
typedef SwitchStrategyMonotonic< MSS_TYPE_DEADLINESwitchStrategyDM
 Shorthand alias for SwitchStrategyMonotonic<MSS_TYPE_DEADLINE>: Deadline-Monotonic scheduling (shorter execution deadline -> higher priority).
typedef SwitchStrategyRoundRobin SwitchStrategyRR
 Shorthand alias for SwitchStrategyRoundRobin.
typedef SwitchStrategySmoothWeightedRoundRobin SwitchStrategySWRR
 Shorthand alias for SwitchStrategySmoothWeightedRoundRobin.

Enumerations

enum  EAccessMode : int32_t {
  ACCESS_USER = 0 ,
  ACCESS_PRIVILEGED
}
 Hardware access mode by the user task. More...
enum  EKernelMode : uint8_t {
  KERNEL_STATIC = (1 << 0) ,
  KERNEL_DYNAMIC = (1 << 1) ,
  KERNEL_HRT = (1 << 2) ,
  KERNEL_SYNC = (1 << 3) ,
  KERNEL_TICKLESS = (1 << 4)
}
 Kernel operating mode. More...
enum  EKernelPanicId : uint32_t {
  KERNEL_PANIC_NONE = 0 ,
  KERNEL_PANIC_SPINLOCK_DEADLOCK = 1 ,
  KERNEL_PANIC_STACK_CORRUPT = 2 ,
  KERNEL_PANIC_ASSERT = 3 ,
  KERNEL_PANIC_HRT_HARD_FAULT = 4 ,
  KERNEL_PANIC_CPU_EXCEPTION = 5 ,
  KERNEL_PANIC_CS_NESTING_OVERFLOW = 6 ,
  KERNEL_PANIC_UNKNOWN_SVC = 7 ,
  KERNEL_PANIC_BAD_STATE = 8 ,
  KERNEL_PANIC_BAD_MODE = 9
}
 Identifies the source of a kernel panic. More...
enum  EStackType {
  STACK_USER_TASK = 0 ,
  STACK_SLEEP_TRAP ,
  STACK_EXIT_TRAP
}
 Stack type. More...
enum  EConsts {
  PERIODICITY_MAX = 99000 ,
  PERIODICITY_DEFAULT = 1000 ,
  STACK_SIZE_MIN = 32U
}
 Constants. More...
enum  ESystemTaskId {
  SYS_TASK_ID_SLEEP = 0xFFFFFFFF ,
  SYS_TASK_ID_EXIT = 0xFFFFFFFE
}
 System task id. More...
enum  ETraceEventId {
  TRACE_EVENT_UNKNOWN = 0 ,
  TRACE_EVENT_SWITCH = 1000 + 1 ,
  TRACE_EVENT_SLEEP = 1000 + 2
}
 Trace event identifiers for tracing task suspension and resume with debugging tools (e.g. SEGGER SystemView). More...
enum  EMonotonicSwitchStrategyType {
  MSS_TYPE_RATE ,
  MSS_TYPE_DEADLINE
}
 Policy selector for SwitchStrategyMonotonic: determines the timing attribute used to assign fixed priorities to tasks at AddTask() time. More...

Functions

Word GetTls ()
 Get thread-local storage (TLS).
void SetTls (Word tp)
 Set thread-local storage (TLS).
static __stk_forceinline Cycles ConvertTimeUsToClockCycles (Cycles clock_freq, Ticks time_us)
 Convert time (microseconds) to core clock cycles.
static bool IsIsrTid (TId tid)
 Test whether a task identifier represents an ISR context.
template<typename T>
static constexpr T Min (T a, T b)
 Compile-time minimum of two values.
template<typename T>
static constexpr T Max (T a, T b)
 Compile-time maximum of two values.
TId GetTid ()
 Get task/thread Id of the calling task.
int64_t GetMsFromTicks (int64_t ticks, int32_t resolution)
 Convert ticks to milliseconds.
Ticks GetTicksFromMs (int64_t ms, int32_t resolution)
 Convert milliseconds to ticks.
Ticks GetTicks ()
 Get number of ticks elapsed since kernel start.
int32_t GetTickResolution ()
 Get number of microseconds in one tick.
Ticks GetTicksFromMs (int64_t ms)
 Convert milliseconds to ticks using the current kernel tick resolution.
static int64_t GetTimeNowMs ()
 Get current time in milliseconds since kernel start.
Cycles GetSysTimerCount ()
 Get system timer count value.
uint32_t GetSysTimerFrequency ()
 Get system timer frequency.
void Sleep (Timeout ticks)
 Put calling process into a sleep state.
static void SleepMs (Timeout ms)
 Put calling process into a sleep state.
void SleepUntil (Ticks timestamp)
 Put calling process into a sleep state until the specified timestamp.
void Yield ()
 Notify scheduler to switch to the next runnable task.
void Delay (Timeout ticks)
 Delay calling process by busy-waiting until the deadline expires.
static void DelayMs (Timeout ms)
 Delay calling process by busy-waiting until the deadline expires.

Variables

static constexpr TId TID_ISR_N = static_cast<TId>(0xFFFFF000U)
 Bitmask sentinel for ISR-context task identifiers.
static constexpr TId TID_NONE = static_cast<TId>(0U)
 Reserved task/thread id representing zero/none thread id.
static constexpr Timeout WAIT_INFINITE = INT32_MAX
 Timeout value: block indefinitely until the synchronization object is signaled.
static constexpr Timeout NO_WAIT = 0
 Timeout value: return immediately if the synchronization object is not yet signaled (non-blocking poll).

Detailed Description

Namespace of STK package.

Typedef Documentation

◆ Cycles

typedef uint64_t stk::Cycles

Cycles value.

Definition at line 133 of file stk_common.h.

◆ PlatformDefault

Default platform implementation.

Definition at line 56 of file stk_arch_arm-cortex-m.h.

◆ SwitchStrategyDM

Shorthand alias for SwitchStrategyMonotonic<MSS_TYPE_DEADLINE>: Deadline-Monotonic scheduling (shorter execution deadline -> higher priority).

See also
SwitchStrategyMonotonic, SchedulabilityCheck

Definition at line 505 of file stk_strategy_monotonic.h.

◆ SwitchStrategyFP32

Shorthand alias for SwitchStrategyFixedPriority<32>: 32 priority levels (0..31), using a single 32-bit m_ready_bitmap for O(1) highest-priority lookup.

See also
SwitchStrategyFixedPriority

Definition at line 355 of file stk_strategy_fpriority.h.

◆ SwitchStrategyRM

Shorthand alias for SwitchStrategyMonotonic<MSS_TYPE_RATE>: Rate-Monotonic scheduling (shorter scheduling period -> higher priority).

See also
SwitchStrategyMonotonic, SchedulabilityCheck

Definition at line 498 of file stk_strategy_monotonic.h.

◆ SwitchStrategyRR

◆ SwitchStrategySWRR

◆ Ticks

typedef int64_t stk::Ticks

Ticks value.

Definition at line 128 of file stk_common.h.

◆ TId

typedef Word stk::TId

Definition at line 118 of file stk_common.h.

◆ Timeout

typedef int32_t stk::Timeout

Timeout time (ticks).

Definition at line 123 of file stk_common.h.

◆ Word

typedef uintptr_t stk::Word

Native processor word type.

Represents natural data width of the CPU (matching uintptr_t). Used for stack allocation, register storage, pointer value storage, and memory alignment to ensure atomic access, optimal performance, and hardware compatibility.

Definition at line 113 of file stk_common.h.

Enumeration Type Documentation

◆ EAccessMode

enum stk::EAccessMode : int32_t

Hardware access mode by the user task.

Warning
Type is explicitly 32-bit to be compatible with platform implementations.
Enumerator
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).

Definition at line 30 of file stk_common.h.

34};
@ ACCESS_USER
Unprivileged access mode (access to some hardware is restricted, see CPU manual for details).
Definition stk_common.h:32
@ ACCESS_PRIVILEGED
Privileged access mode (access to hardware is fully unrestricted).
Definition stk_common.h:33

◆ EConsts

Constants.

Enumerator
PERIODICITY_MAX 

Maximum periodicity (microseconds), 99 milliseconds (note: this value is the highest working on a real hardware and QEMU).

PERIODICITY_DEFAULT 

Default periodicity (microseconds), 1 millisecond.

STACK_SIZE_MIN 

Minimum stack size in elements of Word. Used as a lower bound for all stack allocations (user task, sleep trap, exit trap). See: StackMemoryDef, StackMemoryWrapper.

Definition at line 79 of file stk_common.h.

80{
81 PERIODICITY_MAX = 99000,
82 PERIODICITY_DEFAULT = 1000,
84};
#define STK_STACK_SIZE_MIN
Minimum stack size in elements of Word, shared by all stack allocation lower-bound checks.
Definition stk_defs.h:454
@ PERIODICITY_DEFAULT
Default periodicity (microseconds), 1 millisecond.
Definition stk_common.h:82
@ STACK_SIZE_MIN
Minimum stack size in elements of Word. Used as a lower bound for all stack allocations (user task,...
Definition stk_common.h:83
@ PERIODICITY_MAX
Maximum periodicity (microseconds), 99 milliseconds (note: this value is the highest working on a rea...
Definition stk_common.h:81

◆ EKernelMode

enum stk::EKernelMode : uint8_t

Kernel operating mode.

Enumerator
KERNEL_STATIC 

All tasks are static and can not exit.

KERNEL_DYNAMIC 

Tasks can be added or removed and therefore exit when done.

KERNEL_HRT 

Hard Real-Time (HRT) behavior (tasks are scheduled periodically and have an execution deadline, whole system is failed when task's deadline is failed).

KERNEL_SYNC 

Synchronization support (see Event).

KERNEL_TICKLESS 

Tickless mode. To use this mode STK_TICKLESS_IDLE must be defined to 1 in stk_config.h.

Definition at line 39 of file stk_common.h.

40{
41 KERNEL_STATIC = (1 << 0),
42 KERNEL_DYNAMIC = (1 << 1),
43 KERNEL_HRT = (1 << 2),
44 KERNEL_SYNC = (1 << 3),
45 KERNEL_TICKLESS = (1 << 4),
46};
@ KERNEL_TICKLESS
Tickless mode. To use this mode STK_TICKLESS_IDLE must be defined to 1 in stk_config....
Definition stk_common.h:45
@ KERNEL_SYNC
Synchronization support (see Event).
Definition stk_common.h:44
@ KERNEL_HRT
Hard Real-Time (HRT) behavior (tasks are scheduled periodically and have an execution deadline,...
Definition stk_common.h:43
@ KERNEL_STATIC
All tasks are static and can not exit.
Definition stk_common.h:41
@ KERNEL_DYNAMIC
Tasks can be added or removed and therefore exit when done.
Definition stk_common.h:42

◆ EKernelPanicId

enum stk::EKernelPanicId : uint32_t

Identifies the source of a kernel panic.

Enumerator
KERNEL_PANIC_NONE 

Panic is absent (no fault).

KERNEL_PANIC_SPINLOCK_DEADLOCK 

Spin-lock timeout expired: lock owner never released.

KERNEL_PANIC_STACK_CORRUPT 

Stack integrity check failed.

KERNEL_PANIC_ASSERT 

Internal assertion failed (maps from STK_ASSERT).

KERNEL_PANIC_HRT_HARD_FAULT 

Kernel running in KERNEL_HRT mode reported deadline failure of the task.

KERNEL_PANIC_CPU_EXCEPTION 

CPU reported an exception and halted execution.

KERNEL_PANIC_CS_NESTING_OVERFLOW 

Critical section nesting limit exceeded: violation of STK_CRITICAL_SECTION_NESTINGS_MAX.

KERNEL_PANIC_UNKNOWN_SVC 

Unknown service command received by SVC handler.

KERNEL_PANIC_BAD_STATE 

Kernel entered unexpected (bad) state.

KERNEL_PANIC_BAD_MODE 

Kernel is in bad/unsupported mode for the current operation.

Definition at line 51 of file stk_common.h.

52{
63};
@ KERNEL_PANIC_UNKNOWN_SVC
Unknown service command received by SVC handler.
Definition stk_common.h:60
@ KERNEL_PANIC_BAD_MODE
Kernel is in bad/unsupported mode for the current operation.
Definition stk_common.h:62
@ KERNEL_PANIC_HRT_HARD_FAULT
Kernel running in KERNEL_HRT mode reported deadline failure of the task.
Definition stk_common.h:57
@ KERNEL_PANIC_CS_NESTING_OVERFLOW
Critical section nesting limit exceeded: violation of STK_CRITICAL_SECTION_NESTINGS_MAX.
Definition stk_common.h:59
@ KERNEL_PANIC_NONE
Panic is absent (no fault).
Definition stk_common.h:53
@ KERNEL_PANIC_CPU_EXCEPTION
CPU reported an exception and halted execution.
Definition stk_common.h:58
@ KERNEL_PANIC_STACK_CORRUPT
Stack integrity check failed.
Definition stk_common.h:55
@ KERNEL_PANIC_SPINLOCK_DEADLOCK
Spin-lock timeout expired: lock owner never released.
Definition stk_common.h:54
@ KERNEL_PANIC_BAD_STATE
Kernel entered unexpected (bad) state.
Definition stk_common.h:61
@ KERNEL_PANIC_ASSERT
Internal assertion failed (maps from STK_ASSERT).
Definition stk_common.h:56

◆ EMonotonicSwitchStrategyType

Policy selector for SwitchStrategyMonotonic: determines the timing attribute used to assign fixed priorities to tasks at AddTask() time.

Enumerator
MSS_TYPE_RATE 

Rate-Monotonic (RM): shorter scheduling period -> higher priority. Priority is derived from GetHrtPeriodicity() and is fixed at task registration.

MSS_TYPE_DEADLINE 

Deadline-Monotonic (DM): shorter execution deadline -> higher priority. Priority is derived from GetHrtDeadline() and is fixed at task registration.

Definition at line 28 of file stk_strategy_monotonic.h.

29{
32};
@ MSS_TYPE_DEADLINE
Deadline-Monotonic (DM): shorter execution deadline -> higher priority. Priority is derived from GetH...
@ MSS_TYPE_RATE
Rate-Monotonic (RM): shorter scheduling period -> higher priority. Priority is derived from GetHrtPer...

◆ EStackType

Stack type.

See also
IPlatform::InitStack
Enumerator
STACK_USER_TASK 

Stack of the user task.

STACK_SLEEP_TRAP 

Stack of the Sleep trap.

STACK_EXIT_TRAP 

Stack of the Exit trap.

Definition at line 69 of file stk_common.h.

70{
71 STACK_USER_TASK = 0,
74};
@ STACK_SLEEP_TRAP
Stack of the Sleep trap.
Definition stk_common.h:72
@ STACK_USER_TASK
Stack of the user task.
Definition stk_common.h:71
@ STACK_EXIT_TRAP
Stack of the Exit trap.
Definition stk_common.h:73

◆ ESystemTaskId

System task id.

Enumerator
SYS_TASK_ID_SLEEP 

Sleep trap.

SYS_TASK_ID_EXIT 

Exit trap.

Definition at line 89 of file stk_common.h.

90{
91 SYS_TASK_ID_SLEEP = 0xFFFFFFFF,
92 SYS_TASK_ID_EXIT = 0xFFFFFFFE
93};
@ SYS_TASK_ID_EXIT
Exit trap.
Definition stk_common.h:92
@ SYS_TASK_ID_SLEEP
Sleep trap.
Definition stk_common.h:91

◆ ETraceEventId

Trace event identifiers for tracing task suspension and resume with debugging tools (e.g. SEGGER SystemView).

Note
Values are offset by 1000 to avoid collisions with the host tool's built-in system event range (0–999).
Enumerator
TRACE_EVENT_UNKNOWN 

Unknown / uninitialized trace event.

TRACE_EVENT_SWITCH 

Task context switch event (task became active).

TRACE_EVENT_SLEEP 

Task entered sleep / blocked state.

Definition at line 99 of file stk_common.h.

100{
102 TRACE_EVENT_SWITCH = 1000 + 1,
103 TRACE_EVENT_SLEEP = 1000 + 2
104};
@ TRACE_EVENT_UNKNOWN
Unknown / uninitialized trace event.
Definition stk_common.h:101
@ TRACE_EVENT_SLEEP
Task entered sleep / blocked state.
Definition stk_common.h:103
@ TRACE_EVENT_SWITCH
Task context switch event (task became active).
Definition stk_common.h:102

Function Documentation

◆ ConvertTimeUsToClockCycles()

__stk_forceinline Cycles stk::ConvertTimeUsToClockCycles ( Cycles clock_freq,
Ticks time_us )
static

Convert time (microseconds) to core clock cycles.

Parameters
[in]clock_freqClock frequency.
[in]time_usTime (microseconds).
Returns
Clock cycles.

Definition at line 104 of file stk_arch_common.h.

105{
106 return ((clock_freq * static_cast<Cycles>(time_us)) / 1000000ULL);
107}
uint64_t Cycles
Cycles value.
Definition stk_common.h:133

References __stk_forceinline.

◆ Delay()

void stk::Delay ( Timeout ticks)

Delay calling process by busy-waiting until the deadline expires.

Note
Unlike Sleep this function delays code execution by spinning in a loop until deadline expiry.
Use with care in HRT mode to avoid missed deadline (see stk::KERNEL_HRT, ITask::OnDeadlineMissed).
Parameters
[in]ticksDelay time (ticks). Negative will cause an assertion.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 370 of file stk_helper.h.

371{
373}
static IKernelService * GetInstance()
Get CPU-local instance of the kernel service.
Definition stktest.cpp:69
virtual void Delay(Timeout ticks)=0
Delay calling process.

References __stk_forceinline, stk::IKernelService::Delay(), and stk::IKernelService::GetInstance().

Referenced by DelayMs(), stk::test::blockpool::StressTask< _AccessMode >::Run(), stk::test::chain::TestTask< _AccessMode >::Run(), stk::test::condvar::NotifyOneOrderTask< _AccessMode >::Run(), stk::test::condvar::NotifyOneWakesTask< _AccessMode >::Run(), stk::test::condvar::PredicateLoopTask< _AccessMode >::Run(), stk::test::event::AutoResetBasicTask< _AccessMode >::Run(), stk::test::event::PulseAutoResetTask< _AccessMode >::Run(), stk::test::eventflags::MultiWaiterAllTask< _AccessMode >::Run(), stk::test::eventflags::SetWaitAnyTask< _AccessMode >::Run(), stk::test::hrt::TestTask< _AccessMode >::Run(), stk::test::msgqueue::StressTask< _AccessMode >::Run(), stk::test::mutex::BasicLockUnlockTask< _AccessMode >::Run(), stk::test::mutex::InterTaskCoordinationTask< _AccessMode >::Run(), stk::test::mutex::StressTestTask< _AccessMode >::Run(), stk::test::rwmutex::ReaderWriterAlternationTask< _AccessMode >::Run(), stk::test::rwmutex::StressTestTask< _AccessMode >::Run(), stk::test::rwmutex::WriterExclusivityTask< _AccessMode >::Run(), stk::test::rwmutex::WriterStarvationTask< _AccessMode >::Run(), stk::test::semaphore::BasicSignalWaitTask< _AccessMode >::Run(), stk::test::semaphore::BoundedBufferTask< _AccessMode >::Run(), stk::test::semaphore::FIFOOrderTask< _AccessMode >::Run(), stk::test::semaphore::StressTestTask< _AccessMode >::Run(), stk::test::spinlock::MutualExclusionTask< _AccessMode >::Run(), stk::test::spinlock::UnlockTransferTask< _AccessMode >::Run(), stk::test::switch_::TestTask< _AccessMode >::Run(), stk_delay(), stk::test::TEST(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DelayMs()

void stk::DelayMs ( Timeout ms)
inlinestatic

Delay calling process by busy-waiting until the deadline expires.

Note
Unlike Sleep this function delays code execution by spinning in a loop until deadline expiry.
Use with care in HRT mode to avoid missed deadline (see stk::KERNEL_HRT, ITask::OnDeadlineMissed).
Parameters
[in]msDelay time (milliseconds). Negative will cause an assertion.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 381 of file stk_helper.h.

382{
383 Delay(static_cast<Timeout>(GetTicksFromMs(ms)));
384}
int32_t Timeout
Timeout time (ticks).
Definition stk_common.h:123
Ticks GetTicksFromMs(int64_t ms, int32_t resolution)
Convert milliseconds to ticks.
Definition stk_helper.h:249
void Delay(Timeout ticks)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:370

References Delay(), and GetTicksFromMs().

Referenced by stk_delay_ms(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetMsFromTicks()

int64_t stk::GetMsFromTicks ( int64_t ticks,
int32_t resolution )

Convert ticks to milliseconds.

Parameters
[in]ticksTick count to convert.
[in]resolutionMicroseconds per tick, as returned by IKernelService::GetTickResolution().
Returns
Equivalent time in milliseconds.
Note
ISR-safe (performs only arithmetic, no kernel calls).

Definition at line 238 of file stk_helper.h.

239{
240 return (ticks * resolution) / 1000;
241}

References __stk_forceinline.

Referenced by stk::test::TEST().

Here is the caller graph for this function:

◆ GetSysTimerCount()

Cycles stk::GetSysTimerCount ( )

Get system timer count value.

Note
ISR-safe.
Returns
64-bit count value.

Definition at line 306 of file stk_helper.h.

307{
309}
virtual Cycles GetSysTimerCount() const =0
Get system timer count value.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::GetSysTimerCount().

Referenced by osKernelGetSysTimerCount(), osKernelGetSysTimerCount64(), stk_sys_timer_count(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetSysTimerFrequency()

uint32_t stk::GetSysTimerFrequency ( )

Get system timer frequency.

Note
ISR-safe.
Returns
Frequency (Hz).

Definition at line 315 of file stk_helper.h.

316{
318}
virtual uint32_t GetSysTimerFrequency() const =0
Get system timer frequency.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::GetSysTimerFrequency().

Referenced by osKernelGetSysTimerFreq(), stk_sys_timer_frequency(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetTickResolution()

int32_t stk::GetTickResolution ( )

Get number of microseconds in one tick.

Note
Tick is a periodicity of the system timer expressed in microseconds.
ISR-safe.
Returns
Microseconds in one tick.

Definition at line 268 of file stk_helper.h.

269{
271}
virtual uint32_t GetTickResolution() const =0
Get number of microseconds in one tick.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::GetTickResolution().

Referenced by GetTicksFromMs(), osKernelGetTickFreq(), stk_tick_resolution(), stk_ticks_from_ms(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetTicks()

◆ GetTicksFromMs() [1/2]

Ticks stk::GetTicksFromMs ( int64_t ms)

Convert milliseconds to ticks using the current kernel tick resolution.

Parameters
[in]msTime in milliseconds to convert.
Returns
Equivalent tick count.
Note
Convenience overload that queries GetTickResolution() automatically. Use the two-argument form GetTicksFromMsec(ms, resolution) in ISR context.
Warning
ISR-unsafe (internally calls GetTickResolution() which accesses the kernel service).

Definition at line 280 of file stk_helper.h.

281{
282 return GetTicksFromMs(ms, GetTickResolution());
283}
int32_t GetTickResolution()
Get number of microseconds in one tick.
Definition stk_helper.h:268

References __stk_forceinline, GetTickResolution(), and GetTicksFromMs().

Here is the call graph for this function:

◆ GetTicksFromMs() [2/2]

Ticks stk::GetTicksFromMs ( int64_t ms,
int32_t resolution )

Convert milliseconds to ticks.

Parameters
[in]msTime in milliseconds to convert.
[in]resolutionMicroseconds per tick, as returned by IKernelService::GetTickResolution().
Returns
Equivalent tick count.
Note
ISR-safe (performs only arithmetic, no kernel calls).

Definition at line 249 of file stk_helper.h.

250{
251 return ms * 1000 / resolution;
252}

References __stk_forceinline.

Referenced by DelayMs(), GetTicksFromMs(), stk::test::stk::SetTimeNowMsec(), and SleepMs().

Here is the caller graph for this function:

◆ GetTid()

TId stk::GetTid ( )

Get task/thread Id of the calling task.

Returns
Id of the calling task/thread.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 227 of file stk_helper.h.

228{
230}
virtual TId GetTid() const =0
Get thread Id of the currently running task.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::GetTid().

Referenced by stk::sync::SpinLock::Lock(), osThreadGetId(), stk_tid(), stk::test::TEST(), stk::test::TEST(), stk::test::Test_SyncWait(), stk::sync::SpinLock::TryLock(), stk::sync::Mutex::Unlock(), and stk::sync::SpinLock::Unlock().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetTimeNowMs()

int64_t stk::GetTimeNowMs ( )
inlinestatic

Get current time in milliseconds since kernel start.

Returns
Milliseconds elapsed since IKernel::Start() was called.
Note
ISR-safe.
When the tick resolution is exactly 1000 µs (1 ms, the default PERIODICITY_DEFAULT), the tick count is returned directly without multiplication, avoiding a 64-bit multiply.

Definition at line 291 of file stk_helper.h.

292{
294 int32_t resolution = service->GetTickResolution();
295
296 if (resolution == 1000) // fast path: tick == 1 ms, no conversion needed
297 return service->GetTicks();
298 else
299 return (service->GetTicks() * resolution) / 1000;
300}
Interface for the kernel services exposed to the user processes during run-time when Kernel started s...

References stk::IKernelService::GetInstance(), stk::IKernelService::GetTickResolution(), and stk::IKernelService::GetTicks().

Referenced by stk::test::timer::TestTimer::OnExpired(), stk::test::blockpool::TimedAllocTimeoutTask< _AccessMode >::Run(), stk::test::chain::TestTask< _AccessMode >::Run(), stk::test::condvar::NoWaitTimeoutTask< _AccessMode >::Run(), stk::test::condvar::TimeoutExpiresTask< _AccessMode >::Run(), stk::test::event::TimeoutWaitTask< _AccessMode >::Run(), stk::test::event::TryWaitTask< _AccessMode >::Run(), stk::test::eventflags::TimeoutTask< _AccessMode >::Run(), stk::test::eventflags::TryWaitTask< _AccessMode >::Run(), stk::test::hrt::TestTask< _AccessMode >::Run(), stk::test::msgqueue::TimedGetTimeoutTask< _AccessMode >::Run(), stk::test::msgqueue::TimedPutTimeoutTask< _AccessMode >::Run(), stk::test::mutex::TimedLockTask< _AccessMode >::Run(), stk::test::mutex::TryLockTask< _AccessMode >::Run(), stk::test::pipe::TimeoutTask< _AccessMode >::Run(), stk::test::rwmutex::ReadUnlockWakesWriterTask< _AccessMode >::Run(), stk::test::rwmutex::TimedReadLockTask< _AccessMode >::Run(), stk::test::rwmutex::TimedWriteLockTask< _AccessMode >::Run(), stk::test::rwmutex::TryReadLockWhileWriterTask< _AccessMode >::Run(), stk::test::rwmutex::WriterStarvationTask< _AccessMode >::Run(), stk::test::semaphore::TimeoutWaitTask< _AccessMode >::Run(), stk::test::semaphore::ZeroTimeoutTask< _AccessMode >::Run(), stk::test::sleep::TestTask< _AccessMode >::Run(), stk::test::spinlock::TryLockContendedTask< _AccessMode >::Run(), stk::test::timer::OneShotTimerTask< _AccessMode >::Run(), stk::test::timer::ResetPeriodicTimerTask< _AccessMode >::Run(), stk::test::timer::RestartTimerTask< _AccessMode >::Run(), stk::test::timer::StartOrResetTask< _AccessMode >::Run(), stk_time_now_ms(), stk::test::TEST(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetTls()

uintptr_t stk::hw::GetTls ( )

Get thread-local storage (TLS).

Returns
TLS value.
Note
Using r9 register.
Returns
TLS value.
Note
tp register is an alias for x4

Definition at line 62 of file stk_arch_arm-cortex-m.h.

63{
64 Word tp;
65 __asm volatile("MOV %0, r9" : "=r"(tp) : /* input: none */ : /* clobbers: none */);
66 return tp;
67}
uintptr_t Word
Native processor word type.
Definition stk_common.h:113

References __stk_forceinline.

◆ IsIsrTid()

bool stk::IsIsrTid ( TId tid)
inlinestatic

Test whether a task identifier represents an ISR context.

Returns true if tid was produced by GetTid() called from an interrupt service routine, i.e. its upper 20 bits match TID_ISR_N. Use this predicate instead of comparing against TID_ISR_N directly.

Parameters
[in]tidTask identifier to test.
Returns
true if tid encodes an ISR context, false otherwise.
Note
ISR-safe (bitmask arithmetic only, no kernel calls).
See also
TID_ISR_N

Definition at line 190 of file stk_common.h.

191{
192 return ((tid & TID_ISR_N) == TID_ISR_N);
193}
static constexpr TId TID_ISR_N
Bitmask sentinel for ISR-context task identifiers.
Definition stk_common.h:160

References TID_ISR_N.

◆ Max()

template<typename T>
constexpr T stk::Max ( T a,
T b )
staticconstexpr

Compile-time maximum of two values.

Note
Arguments are evaluated exactly once, safe for any expression type.

Definition at line 541 of file stk_defs.h.

541{ return ((a > b) ? a : b); }

Referenced by stk::memory::AlignBlockSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::KernelTask::GetSleepTicks(), stk::Kernel< stk::KERNEL_DYNAMIC|stk::KERNEL_SYNC, 16U, stk::SwitchStrategyFP32, stk::PlatformDefault >::OnTaskSleepUntil(), and stk::test::TEST().

Here is the caller graph for this function:

◆ Min()

template<typename T>
constexpr T stk::Min ( T a,
T b )
staticconstexpr

Compile-time minimum of two values.

Note
Arguments are evaluated exactly once, safe for any expression type.

Definition at line 535 of file stk_defs.h.

535{ return ((a < b) ? a : b); }

Referenced by stk::Kernel< TMode, TSize, TStrategy, TPlatform >::KernelTask::GetSleepTicks(), osSemaphoreNew(), and stk::test::TEST().

Here is the caller graph for this function:

◆ SetTls()

void stk::hw::SetTls ( Word tp)

Set thread-local storage (TLS).

Parameters
[in]tpTLS value.
Note
Using r9 register.
Parameters
[in]tpTLS value.
Note
tp register is an alias for x4

Definition at line 73 of file stk_arch_arm-cortex-m.h.

74{
75 __asm volatile("MOV r9, %0" : /* output: none */ : "r"(tp) : /* clobbers: none */);
76}

References __stk_forceinline.

◆ Sleep()

void stk::Sleep ( Timeout ticks)

Put calling process into a sleep state.

Note
Unlike Delay this function does not waste CPU cycles and allows kernel to put CPU into a low-power state.
Unsupported in HRT mode (see stk::KERNEL_HRT); in HRT mode tasks sleep automatically according to their periodicity and workload.
Parameters
[in]ticksSleep time (ticks). 0 does not cause yield, use Yield instead. Negative will cause an assertion.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 326 of file stk_helper.h.

327{
329}
virtual void Sleep(Timeout ticks)=0
Put calling process into a sleep state.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::Sleep().

Referenced by osDelay(), stk::test::blockpool::BlockingAllocTask< _AccessMode >::Run(), stk::test::blockpool::ConcurrentAllocFreeTask< _AccessMode >::Run(), stk::test::blockpool::StressTask< _AccessMode >::Run(), stk::test::blockpool::TimedAllocSuccessTask< _AccessMode >::Run(), stk::test::blockpool::TimedAllocTimeoutTask< _AccessMode >::Run(), stk::test::condvar::MutexReacquiredTask< _AccessMode >::Run(), stk::test::condvar::NotifyAllWakesTask< _AccessMode >::Run(), stk::test::condvar::NotifyOneOrderTask< _AccessMode >::Run(), stk::test::condvar::NotifyOneWakesTask< _AccessMode >::Run(), stk::test::condvar::NoWaitTimeoutTask< _AccessMode >::Run(), stk::test::condvar::PredicateLoopTask< _AccessMode >::Run(), stk::test::condvar::StressTestTask< _AccessMode >::Run(), stk::test::condvar::TimeoutExpiresTask< _AccessMode >::Run(), stk::test::event::AutoResetBasicTask< _AccessMode >::Run(), stk::test::event::InitialStateTask< _AccessMode >::Run(), stk::test::event::ManualResetBasicTask< _AccessMode >::Run(), stk::test::event::PulseAutoResetTask< _AccessMode >::Run(), stk::test::event::PulseManualResetTask< _AccessMode >::Run(), stk::test::event::ResetManualTask< _AccessMode >::Run(), stk::test::event::TimeoutWaitTask< _AccessMode >::Run(), stk::test::event::TryWaitTask< _AccessMode >::Run(), stk::test::eventflags::ClearTask< _AccessMode >::Run(), stk::test::eventflags::GetTask< _AccessMode >::Run(), stk::test::eventflags::InitialFlagsTask< _AccessMode >::Run(), stk::test::eventflags::MultiWaiterAllTask< _AccessMode >::Run(), stk::test::eventflags::MultiWaiterAnyTask< _AccessMode >::Run(), stk::test::eventflags::NoClearTask< _AccessMode >::Run(), stk::test::eventflags::SetWaitAllTask< _AccessMode >::Run(), stk::test::eventflags::SetWaitAnyTask< _AccessMode >::Run(), stk::test::eventflags::TimeoutTask< _AccessMode >::Run(), stk::test::eventflags::TryWaitTask< _AccessMode >::Run(), stk::test::msgqueue::BlockingGetTask< _AccessMode >::Run(), stk::test::msgqueue::BlockingPutTask< _AccessMode >::Run(), stk::test::msgqueue::PingPongTask< _AccessMode >::Run(), stk::test::msgqueue::ResetTask< _AccessMode >::Run(), stk::test::msgqueue::StressTask< _AccessMode >::Run(), stk::test::msgqueue::TimedGetSuccessTask< _AccessMode >::Run(), stk::test::msgqueue::TimedPutTimeoutTask< _AccessMode >::Run(), stk::test::mutex::BasicLockUnlockTask< _AccessMode >::Run(), stk::test::mutex::FIFOOrderTask< _AccessMode >::Run(), stk::test::mutex::InterTaskCoordinationTask< _AccessMode >::Run(), stk::test::mutex::RecursiveDepthTask< _AccessMode >::Run(), stk::test::mutex::RecursiveLockTask< _AccessMode >::Run(), stk::test::mutex::StressTestTask< _AccessMode >::Run(), stk::test::mutex::TimedLockTask< _AccessMode >::Run(), stk::test::mutex::TryLockTask< _AccessMode >::Run(), stk::test::pipe::BasicWriteReadTask< _AccessMode >::Run(), stk::test::pipe::BulkWriteReadTask< _AccessMode >::Run(), stk::test::pipe::GetSizeIsEmptyTask< _AccessMode >::Run(), stk::test::pipe::MultiProducerConsumerTask< _AccessMode >::Run(), stk::test::pipe::ReadBlocksWhenEmptyTask< _AccessMode >::Run(), stk::test::pipe::StressTestTask< _AccessMode >::Run(), stk::test::pipe::TimeoutTask< _AccessMode >::Run(), stk::test::pipe::WriteBlocksWhenFullTask< _AccessMode >::Run(), stk::test::rwmutex::ConcurrentReadersTask< _AccessMode >::Run(), stk::test::rwmutex::ReaderWriterAlternationTask< _AccessMode >::Run(), stk::test::rwmutex::ReadUnlockWakesWriterTask< _AccessMode >::Run(), stk::test::rwmutex::StressTestTask< _AccessMode >::Run(), stk::test::rwmutex::TimedReadLockTask< _AccessMode >::Run(), stk::test::rwmutex::TimedWriteLockTask< _AccessMode >::Run(), stk::test::rwmutex::TryReadLockWhileWriterTask< _AccessMode >::Run(), stk::test::rwmutex::WriterExclusivityTask< _AccessMode >::Run(), stk::test::rwmutex::WriterPriorityTask< _AccessMode >::Run(), stk::test::rwmutex::WriterStarvationTask< _AccessMode >::Run(), stk::test::semaphore::BasicSignalWaitTask< _AccessMode >::Run(), stk::test::semaphore::BoundedBufferTask< _AccessMode >::Run(), stk::test::semaphore::FIFOOrderTask< _AccessMode >::Run(), stk::test::semaphore::InitialCountTask< _AccessMode >::Run(), stk::test::semaphore::SignalBeforeWaitTask< _AccessMode >::Run(), stk::test::semaphore::StressTestTask< _AccessMode >::Run(), stk::test::semaphore::TimeoutWaitTask< _AccessMode >::Run(), stk::test::semaphore::ZeroTimeoutTask< _AccessMode >::Run(), stk::test::sleep::TestTask< _AccessMode >::Run(), stk::test::spinlock::MutualExclusionTask< _AccessMode >::Run(), stk::test::spinlock::RecursiveLockTask< _AccessMode >::Run(), stk::test::spinlock::RecursiveTryLockTask< _AccessMode >::Run(), stk::test::spinlock::StressTestTask< _AccessMode >::Run(), stk::test::spinlock::TryLockContendedTask< _AccessMode >::Run(), stk::test::spinlock::TryLockFreeTask< _AccessMode >::Run(), stk::test::spinlock::UnlockTransferTask< _AccessMode >::Run(), stk::test::spinlock::YieldUnderContentionTask< _AccessMode >::Run(), stk::test::timer::MultipleTimersTask< _AccessMode >::Run(), stk::test::timer::OneShotTimerTask< _AccessMode >::Run(), stk::test::timer::PeriodicTimerTask< _AccessMode >::Run(), stk::test::timer::ResetPeriodicTimerTask< _AccessMode >::Run(), stk::test::timer::RestartTimerTask< _AccessMode >::Run(), stk::test::timer::SetPeriodTask< _AccessMode >::Run(), stk::test::timer::StartOrResetTask< _AccessMode >::Run(), stk::test::timer::StopTimerTask< _AccessMode >::Run(), stk::test::timer::StressTestTask< _AccessMode >::Run(), SleepMs(), stk_sleep(), stk::test::TEST(), stk::test::TEST(), stk::test::TEST(), stk::test::TEST(), stk::test::TEST(), and stk::test::TestTaskSleep().

Here is the call graph for this function:

◆ SleepMs()

void stk::SleepMs ( Timeout ms)
inlinestatic

Put calling process into a sleep state.

Note
Unlike Delay this function does not waste CPU cycles and allows kernel to put CPU into a low-power state.
Unsupported in HRT mode (see stk::KERNEL_HRT); in HRT mode tasks sleep automatically according to their periodicity and workload.
Converts ms to ticks and calls IKernelService::SleepTicks() which schedules the calling task to sleep and spins until the kernel switches it back in.
Parameters
[in]msSleep time (milliseconds). 0 does not cause yield, use Yield instead. Negative will cause an assertion.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 339 of file stk_helper.h.

340{
341 Sleep(static_cast<Timeout>(GetTicksFromMs(ms)));
342}
void Sleep(Timeout ticks)
Put calling process into a sleep state.
Definition stk_helper.h:326

References GetTicksFromMs(), and Sleep().

Referenced by stk_sleep_ms(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SleepUntil()

void stk::SleepUntil ( Ticks timestamp)

Put calling process into a sleep state until the specified timestamp.

Note
Unlike Delay this function does not waste CPU cycles and allows kernel to put CPU into a low-power state.
Unsupported in HRT mode (see stk::KERNEL_HRT); in HRT mode tasks sleep automatically according to their periodicity and workload.
Parameters
[in]timestampAbsolute timestamp (ticks). 0 does not cause yield, use Yield instead. Negative will cause an assertion.
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 350 of file stk_helper.h.

351{
353}
virtual void SleepUntil(Ticks timestamp)=0
Put calling process into a sleep state until the specified timestamp.

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::SleepUntil().

Referenced by osDelayUntil(), stk_sleep_until(), stk::test::TEST(), stk::test::TEST(), stk::test::TEST(), and stk::test::TestTaskSleep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Yield()

void stk::Yield ( )

Notify scheduler to switch to the next runnable task.

Note
A cooperative scheduling mechanism. In HRT mode acts as a cooperation point (see stk::KERNEL_HRT).
Warning
ISR-unsafe. Calling from an ISR context is not permitted and will trigger an assertion.

Definition at line 359 of file stk_helper.h.

360{
362}
virtual void SwitchToNext()=0
Notify scheduler to switch to the next task (yield).

References __stk_forceinline, stk::IKernelService::GetInstance(), and stk::IKernelService::SwitchToNext().

Referenced by osThreadExit(), osThreadYield(), stk::test::EDFDynamicSchedulingContext::Process(), stk::test::blockpool::ConcurrentAllocFreeTask< _AccessMode >::Run(), stk::test::hrt::TestTask< _AccessMode >::Run(), stk::test::mutex::BasicLockUnlockTask< _AccessMode >::Run(), stk::test::rwmutex::ReadUnlockWakesWriterTask< _AccessMode >::Run(), stk::test::rwmutex::TimedReadLockTask< _AccessMode >::Run(), stk::test::rwmutex::TimedWriteLockTask< _AccessMode >::Run(), stk::test::rwmutex::TryReadLockWhileWriterTask< _AccessMode >::Run(), stk::test::rwmutex::WriterExclusivityTask< _AccessMode >::Run(), stk::test::rwmutex::WriterPriorityTask< _AccessMode >::Run(), stk::test::spinlock::MutualExclusionTask< _AccessMode >::Run(), stk::test::spinlock::RecursiveTryLockTask< _AccessMode >::Run(), stk::test::spinlock::TryLockContendedTask< _AccessMode >::Run(), stk::test::spinlock::TryLockFreeTask< _AccessMode >::Run(), stk::test::timer::PeriodicTimerTask< _AccessMode >::Run(), stk::test::timer::StartOrResetTask< _AccessMode >::Run(), stk_yield(), stk::test::TEST(), stk::test::TEST(), stk::test::TEST(), and stk::test::TEST().

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ NO_WAIT

◆ TID_ISR_N

TId stk::TID_ISR_N = static_cast<TId>(0xFFFFF000U)
staticconstexpr

Bitmask sentinel for ISR-context task identifiers.

The upper 20 bits of the TId space are reserved for ISR contexts. When GetTid() is called from an interrupt service routine, it returns TID_ISR_N | exception_number, where exception_number is the raw value:

// bits[31:12] = 0xFFFFF (this sentinel mask)
// bits[11:0] = exception number

This encoding guarantees uniqueness per exception, so two ISRs at different priority levels or with different exception numbers are never treated as the same owner by synchronization primitives.

Task TIds are word-aligned pointers. On all supported Cortex-M and RISC-V targets they fall in the range 0x00000000..0xEFFFFFFF, so no overlap with the 0xFFFFF000..0xFFFFFFFF sentinel range is possible.

Note
Use IsIsrTid() to test for this sentinel rather than comparing against this constant directly.
See also
IsIsrTid()

Definition at line 160 of file stk_common.h.

Referenced by IsIsrTid().

◆ TID_NONE

TId stk::TID_NONE = static_cast<TId>(0U)
staticconstexpr

◆ WAIT_INFINITE