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::test Namespace Reference

Namespace of the test inventory. More...

Namespaces

namespace  chain
 Namespace of Chain test.
namespace  condvar
 Namespace of ConditionVariable test.
namespace  event
 Namespace of Event test.
namespace  eventflags
 Namespace of EventFlags test.
namespace  stk
 Mock of GetTimeNowMs().
namespace  hrt
 Namespace of HRT test.
namespace  mutex
 Namespace of Mutex test.
namespace  pipe
 Namespace of Pipe test.
namespace  rwmutex
 Namespace of RWMutex test.
namespace  semaphore
 Namespace of Semaphore test.
namespace  sleep
 Namespace of Sleep test.
namespace  spinlock
 Namespace of SpinLock test.
namespace  switch_
 Namespace of Switch test.
namespace  timer
 Namespace of TimerHost test.

Classes

class  KernelMock
struct  AddTaskWhenStartedRelaxCpuContext
struct  HrtTaskDeadlineMissedRelaxCpuContext
struct  SyncWaitRelaxCpuContext
struct  DelayContext
struct  SwitchToNextRelaxCpuContext
struct  SleepRelaxCpuContext
struct  SleepAllAndWakeRelaxCpuContext
struct  SleepAndWakeTicklessRelaxCpuContext
struct  EDFDynamicSchedulingContext
struct  PrioritySleepRelaxCpuContext
struct  SyncWaitWakeRelaxCpuContext
class  TestAssertPassed
 Throwable class for catching assertions from STK_ASSERT_HANDLER(). More...
class  PlatformTestMock
 IPlatform mock. More...
class  KernelServiceMock
 IKernelService mock. More...
class  TaskMock
 Task mock. More...
class  TaskMockW
 Task mock for SwitchStrategySmoothWeightedRoundRobin and similar algorithms. More...
struct  MutexMock
struct  SyncObjectMock
class  TestContext
 Common context for a test suite. More...

Functions

 TEST_GROUP (Kernel)
 TEST (Kernel, MaxTasks)
 TEST (Kernel, State)
 TEST (Kernel, InitDoubleFail)
 TEST (Kernel, AddTaskNoInit)
 TEST (Kernel, AddTask)
 TEST (Kernel, AddTaskInitStack)
 TEST (Kernel, AddTaskFailMaxOut)
 TEST (Kernel, AddTaskFailSameTask)
static void AddTaskWhenStartedRelaxCpu ()
 TEST (Kernel, AddTaskWhenStarted)
 TEST (Kernel, AddTaskFailStaticStarted)
 TEST (Kernel, AddTaskFailHrtStarted)
 TEST (Kernel, RemoveTask)
 TEST (Kernel, RemoveTaskFailNull)
 TEST (Kernel, RemoveTaskFailUnsupported)
 TEST (Kernel, RemoveTaskFailStarted)
 TEST (Kernel, StartInvalidPeriodicity)
 TEST (Kernel, StartNotIntialized)
 TEST (Kernel, StartNoTasks)
 TEST (Kernel, Start)
 TEST (Kernel, StartBeginISR)
 TEST (Kernel, ContextSwitchOnSysTickISR)
 TEST (Kernel, ContextSwitchAccessModeChange)
 TEST (Kernel, ContextSwitchCorruptedFsmMode)
 TEST (Kernel, SingleTask)
template<class _SwitchStrategy>
static void TestTaskExit ()
 TEST (Kernel, OnTaskExitRR)
 TEST (Kernel, OnTaskExitSWRR)
 TEST (Kernel, OnTaskExitFP31)
 TEST (Kernel, OnTaskExitUnknownOrNull)
 TEST (Kernel, OnTaskExitUnsupported)
 TEST (Kernel, OnTaskNotFoundBySP)
 TEST (Kernel, OnTaskSkipFreedTask)
 TEST (Kernel, Hrt)
 TEST (Kernel, HrtAddNonHrt)
 TEST (Kernel, HrtAddNotAllowedForNonHrtMode)
 TEST (Kernel, HrtSleepNotAllowed)
 TEST (Kernel, HrtTaskCompleted)
static void HrtTaskDeadlineMissedRelaxCpu ()
 TEST (Kernel, HrtTaskDeadlineMissedRR)
 TEST (Kernel, HrtTaskDeadlineNotMissedRR)
 TEST (Kernel, HrtSkipSleepingNextRM)
template<class _SwitchStrategy>
static void TestHrtTaskExitDuringSleepState ()
 TEST (Kernel, HrtTaskExitDuringSleepStateRR)
 TEST (Kernel, HrtTaskExitDuringSleepStateRM)
 TEST (Kernel, HrtTaskExitDuringSleepStateDM)
 TEST (Kernel, HrtTaskExitDuringSleepStateEDF)
 TEST (Kernel, HrtSleepingAwakeningStateChange)
 TEST (Kernel, HrtOnlyAPI)
 TEST (Kernel, SyncNotEnabledFailsOnWait)
 TEST (Kernel, SyncNoNullSyncObj)
 TEST (Kernel, SyncNoNullMutex)
 TEST (Kernel, SyncNoZeroWait)
 TEST (Kernel, SyncMutexMustBeLocked)
 TEST (Kernel, SyncTaskExitAfterWait)
static void SyncWaitRelaxCpu ()
template<bool TTickless>
void Test_SyncWait ()
 TEST (Kernel, SyncWait)
 TEST (Kernel, SyncWaitTickless)
 TEST (Kernel, SyncWaitTicklessDuration)
 TEST_GROUP (KernelService)
 TEST (KernelService, GetMsecToTicks)
static void DelayRelaxCpu ()
 TEST (KernelService, Delay)
 TEST (KernelService, DelayMs)
 TEST (KernelService, InitStackFailure)
 TEST (KernelService, GetTid)
 TEST (KernelService, GetTickResolution)
 TEST (KernelService, GetTicks)
 TEST (KernelService, GetTimeNowMs)
 TEST (KernelService, GetTimeNowMsWith10UsecTick)
static void SwitchToNextRelaxCpu ()
 TEST (KernelService, SwitchToNext)
 TEST (KernelService, SwitchToNextInactiveTask)
static void SleepRelaxCpu ()
template<class _SwitchStrategy>
static void TestTaskSleep (bool until)
 TEST (KernelService, SleepRR)
 TEST (KernelService, SleepSWRR)
 TEST (KernelService, SleepFP31)
 TEST (KernelService, SleepUntilRR)
 TEST (KernelService, SleepUntilSWRR)
 TEST (KernelService, SleepUntilFP31)
 TEST (KernelService, SleepMsRR)
 TEST (KernelService, SleepUntilMissDeadline)
static void SleepAllAndWakeRelaxCpu ()
 TEST (KernelService, SleepAllAndWake)
static void SleepAndWakeTicklessRelaxCpu ()
 TEST (KernelService, SleepAndWakeTickless)
 TEST_GROUP (KernelServiceIsrSafety)
 TEST (KernelServiceIsrSafety, Common)
 TEST_GROUP (Basic)
 TEST (Basic, MinMax)
 TEST_GROUP (UserTask)
 TEST (UserTask, GetStackSize)
 TEST (UserTask, GetStackSizeBytes)
 TEST (UserTask, GetWeight)
 TEST (UserTask, GetIdAndName)
 TEST (UserTask, TaskWUnsupportedHrt)
 TEST_GROUP (StackMemoryWrapper)
 TEST (StackMemoryWrapper, GetStack)
 TEST (StackMemoryWrapper, GetStackSize)
 TEST (StackMemoryWrapper, GetStackSizeBytes)
 TEST_GROUP (DList)
 TEST (DList, Empty)
 TEST (DList, LinkFront)
 TEST (DList, LinkBack)
 TEST (DList, PopFront)
 TEST (DList, PopBack)
 TEST (DList, Clear)
 TEST (DList, Iteration)
 TEST (DList, Relink)
 TEST_GROUP (SwitchStrategyEDF)
 TEST (SwitchStrategyEDF, GetFirstEmpty)
 TEST (SwitchStrategyEDF, GetNextEmpty)
 TEST (SwitchStrategyEDF, OnTaskDeadlineMissedNotSupported)
 TEST (SwitchStrategyEDF, PriorityNext)
 TEST (SwitchStrategyEDF, Algorithm)
 TEST (SwitchStrategyEDF, RelativeDeadlineEvolution)
static void g_EDFDynamicSchedulingContextProcess ()
 TEST (SwitchStrategyEDF, DynamicScheduling)
 TEST_GROUP (SwitchStrategyFixedPriority)
 TEST (SwitchStrategyFixedPriority, GetFirstEmpty)
 TEST (SwitchStrategyFixedPriority, GetNextEmpty)
 TEST (SwitchStrategyFixedPriority, OnTaskDeadlineMissedNotSupported)
 TEST (SwitchStrategyFixedPriority, EndlessNext)
 TEST (SwitchStrategyFixedPriority, Algorithm)
static void PrioritySleepRelaxCpu ()
 TEST (SwitchStrategyFixedPriority, Priority)
 TEST_GROUP (SwitchStrategyMonotonic)
 TEST (SwitchStrategyMonotonic, GetFirstEmpty)
 TEST (SwitchStrategyMonotonic, SleepNotSupported)
 TEST (SwitchStrategyMonotonic, OnTaskDeadlineMissedNotSupported)
 TEST (SwitchStrategyMonotonic, GetNextEmpty)
template<class _SwitchStrategy>
static void TestPriorityNext ()
 TEST (SwitchStrategyMonotonic, PriorityNextRM)
 TEST (SwitchStrategyMonotonic, PriorityNextDM)
template<class _SwitchStrategy>
static void TestAlgorithm ()
 TEST (SwitchStrategyMonotonic, AlgorithmRM)
 TEST (SwitchStrategyMonotonic, AlgorithmDM)
 TEST (SwitchStrategyMonotonic, FailedWCRT)
 TEST (SwitchStrategyMonotonic, SchedulableWCRT)
 TEST_GROUP (SwitchStrategyRoundRobin)
 TEST (SwitchStrategyRoundRobin, GetFirstEmpty)
 TEST (SwitchStrategyRoundRobin, GetNextEmpty)
 TEST (SwitchStrategyRoundRobin, OnTaskDeadlineMissedNotSupported)
 TEST (SwitchStrategyRoundRobin, EndlessNext)
 TEST (SwitchStrategyRoundRobin, Algorithm)
 TEST_GROUP (SwitchStrategySWRoundRobin)
 TEST (SwitchStrategySWRoundRobin, GetFirstEmpty)
 TEST (SwitchStrategySWRoundRobin, GetNextEmpty)
 TEST (SwitchStrategySWRoundRobin, OnTaskDeadlineMissedNotSupported)
 TEST (SwitchStrategySWRoundRobin, EndlessNext)
 TEST (SwitchStrategySWRoundRobin, Algorithm)
 TEST_GROUP (Sync)
 TEST (Sync, CriticalSection)
 TEST (Sync, IMutex_ScopedLock)
static void SyncWaitWakeRelaxCpu ()
 TEST (Sync, SyncWait_Wake)
 TEST_GROUP (PeriodicTrigger)
 TEST (PeriodicTrigger, MustBeArmed)
 TEST (PeriodicTrigger, DoesNotFireBeforePeriod)
 TEST (PeriodicTrigger, FiresAtExactPeriod)
 TEST (PeriodicTrigger, PreservesRemainderAfterFire)
 TEST (PeriodicTrigger, AccumulatesAcrossMultiplePolls)
 TEST (PeriodicTrigger, ManualResetSyncsToCurrentTime)

Variables

static struct stk::test::AddTaskWhenStartedRelaxCpuContext g_AddTaskWhenStartedRelaxCpuContext
static struct stk::test::HrtTaskDeadlineMissedRelaxCpuContext g_HrtTaskDeadlineMissedRelaxCpuContext
static struct stk::test::SyncWaitRelaxCpuContext g_SyncWaitRelaxCpuContext
static struct stk::test::DelayContext g_DelayContext
static struct stk::test::SwitchToNextRelaxCpuContext g_SwitchToNextRelaxCpuContext
static struct stk::test::SleepRelaxCpuContext g_SleepRelaxCpuContext
static struct stk::test::SleepAllAndWakeRelaxCpuContext g_SleepAllAndWakeRelaxCpuContext
static struct stk::test::SleepAndWakeTicklessRelaxCpuContext g_SleepAndWakeTicklessRelaxCpuContext
static struct stk::test::EDFDynamicSchedulingContext g_EDFDynamicSchedulingContext
static struct stk::test::PrioritySleepRelaxCpuContext g_PrioritySleepRelaxCpuContext
static struct stk::test::SyncWaitWakeRelaxCpuContext g_SyncWaitWakeRelaxCpuContext
IKernelServiceg_KernelService = NULL
int32_t g_CriticalSectionState = false
 Critical section state.
bool g_InsideISR = false
 ISR state.
EKernelPanicId g_PanicValue = KERNEL_PANIC_NONE
 Panic value.
TestContext g_TestContext
 Global instance of the TestContext.

Detailed Description

Namespace of the test inventory.

Function Documentation

◆ AddTaskWhenStartedRelaxCpu()

void stk::test::AddTaskWhenStartedRelaxCpu ( )
static

Definition at line 229 of file stktest_kernel.cpp.

230{
232}
static struct stk::test::AddTaskWhenStartedRelaxCpuContext g_AddTaskWhenStartedRelaxCpuContext

References g_AddTaskWhenStartedRelaxCpuContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ DelayRelaxCpu()

void stk::test::DelayRelaxCpu ( )
static

Definition at line 61 of file stktest_kernelservice.cpp.

62{
63 g_DelayContext.Process();
64}
static struct stk::test::DelayContext g_DelayContext

References g_DelayContext.

Referenced by TEST(), TEST(), and TEST_GROUP().

Here is the caller graph for this function:

◆ g_EDFDynamicSchedulingContextProcess()

void stk::test::g_EDFDynamicSchedulingContextProcess ( )
static

Definition at line 280 of file stktest_switchstrategyedf.cpp.

281{
283}
static struct stk::test::EDFDynamicSchedulingContext g_EDFDynamicSchedulingContext

References g_EDFDynamicSchedulingContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ HrtTaskDeadlineMissedRelaxCpu()

void stk::test::HrtTaskDeadlineMissedRelaxCpu ( )
static

Definition at line 905 of file stktest_kernel.cpp.

906{
908}
static struct stk::test::HrtTaskDeadlineMissedRelaxCpuContext g_HrtTaskDeadlineMissedRelaxCpuContext

References g_HrtTaskDeadlineMissedRelaxCpuContext.

Referenced by TEST(), TEST(), and TEST().

Here is the caller graph for this function:

◆ PrioritySleepRelaxCpu()

void stk::test::PrioritySleepRelaxCpu ( )
static

Definition at line 229 of file stktest_switchstrategyfpriority.cpp.

230{
232}
static struct stk::test::PrioritySleepRelaxCpuContext g_PrioritySleepRelaxCpuContext

References g_PrioritySleepRelaxCpuContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ SleepAllAndWakeRelaxCpu()

void stk::test::SleepAllAndWakeRelaxCpu ( )
static

Definition at line 587 of file stktest_kernelservice.cpp.

588{
590}
static struct stk::test::SleepAllAndWakeRelaxCpuContext g_SleepAllAndWakeRelaxCpuContext

References g_SleepAllAndWakeRelaxCpuContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ SleepAndWakeTicklessRelaxCpu()

void stk::test::SleepAndWakeTicklessRelaxCpu ( )
static

Definition at line 635 of file stktest_kernelservice.cpp.

636{
638}
static struct stk::test::SleepAndWakeTicklessRelaxCpuContext g_SleepAndWakeTicklessRelaxCpuContext

References g_SleepAndWakeTicklessRelaxCpuContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ SleepRelaxCpu()

void stk::test::SleepRelaxCpu ( )
static

Definition at line 393 of file stktest_kernelservice.cpp.

394{
395 g_SleepRelaxCpuContext.Process();
396}
static struct stk::test::SleepRelaxCpuContext g_SleepRelaxCpuContext

References g_SleepRelaxCpuContext.

Referenced by TEST(), TEST(), and TestTaskSleep().

Here is the caller graph for this function:

◆ SwitchToNextRelaxCpu()

void stk::test::SwitchToNextRelaxCpu ( )
static

Definition at line 276 of file stktest_kernelservice.cpp.

277{
279}
static struct stk::test::SwitchToNextRelaxCpuContext g_SwitchToNextRelaxCpuContext

References g_SwitchToNextRelaxCpuContext.

Referenced by TEST(), and TEST().

Here is the caller graph for this function:

◆ SyncWaitRelaxCpu()

void stk::test::SyncWaitRelaxCpu ( )
static

Definition at line 1321 of file stktest_kernel.cpp.

1322{
1323 g_SyncWaitRelaxCpuContext.Process();
1324}
static struct stk::test::SyncWaitRelaxCpuContext g_SyncWaitRelaxCpuContext

References g_SyncWaitRelaxCpuContext.

Referenced by TEST(), and Test_SyncWait().

Here is the caller graph for this function:

◆ SyncWaitWakeRelaxCpu()

void stk::test::SyncWaitWakeRelaxCpu ( )
static

Definition at line 74 of file stktest_sync.cpp.

75{
77}
static struct stk::test::SyncWaitWakeRelaxCpuContext g_SyncWaitWakeRelaxCpuContext

References g_SyncWaitWakeRelaxCpuContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ TEST() [1/135]

stk::test::TEST ( Basic ,
MinMax  )

Definition at line 25 of file stktest_misc.cpp.

26{
27 static_assert(stk::Min(10, 20) == 10, "Min failed at compile time");
28 static_assert(stk::Max(10, 20) == 20, "Max failed at compile time");
29
30 // basic & symmetry
31 CHECK_EQUAL(1, stk::Min(1, 2));
32 CHECK_EQUAL(1, stk::Min(2, 1));
33
34 // negatives
35 CHECK_EQUAL(-5, stk::Min(-5, -2));
36 CHECK_EQUAL(-2, stk::Max(-5, -2));
37
38 // equality
39 CHECK_EQUAL(42, stk::Max(42, 42));
40
41 // boundaries (assuming 32-bit ints)
42 CHECK_EQUAL(2147483647, stk::Max(0, 2147483647));
43
44 // support const vars
45 {
46 const int32_t a = 10;
47 const int32_t b = 20;
48 CHECK_EQUAL(10, stk::Min(a, b));
49 }
50
51 // no duplicate operation
52 {
53 int32_t x = 1;
54 int32_t y = 5;
55
56 // in a macro-based MIN(x++, y), x would become 3, with STK's template-based stk::Min, x should become 2
57 int32_t result = stk::Min(x++, y);
58
59 CHECK_EQUAL(1, result); // the value before increment
60 CHECK_EQUAL(2, x); // x should only have been incremented once
61 CHECK_EQUAL(5, y); // y remains untouched
62 }
63}
constexpr T Max(T a, T b) noexcept
Compile-time maximum of two values.
Definition stk_defs.h:536
constexpr T Min(T a, T b) noexcept
Compile-time minimum of two values.
Definition stk_defs.h:530

References stk::Max(), and stk::Min().

Here is the call graph for this function:

◆ TEST() [2/135]

stk::test::TEST ( DList ,
Clear  )

Definition at line 291 of file stktest_misc.cpp.

292{
293 ListHead list;
294 ListEntry e1(1), e2(2), e3(3);
295
296 list.LinkBack(e1);
297 list.LinkBack(e2);
298 list.LinkBack(e3);
299
300 list.Clear();
301
302 CHECK_EQUAL_ZERO(list.GetSize());
303 CHECK_TRUE(list.IsEmpty());
304 CHECK_TRUE(NULL == list.GetFirst());
305 CHECK_TRUE(NULL == list.GetLast());
306}

◆ TEST() [3/135]

stk::test::TEST ( DList ,
Empty  )

Definition at line 183 of file stktest_misc.cpp.

184{
185 ListHead list;
186
187 CHECK_EQUAL_ZERO(list.GetSize());
188 CHECK_TRUE(list.IsEmpty());
189 CHECK_TRUE(NULL == list.GetFirst());
190 CHECK_TRUE(NULL == list.GetLast());
191
192 list.Clear();
193}

◆ TEST() [4/135]

stk::test::TEST ( DList ,
Iteration  )

Definition at line 308 of file stktest_misc.cpp.

309{
310 ListHead list;
311 ListEntry e1(1), e2(2), e3(3);
312
313 list.LinkBack(e1);
314 list.LinkBack(e2);
315 list.LinkBack(e3);
316
317 ListHead::DLEntryType *itr = list.GetFirst();
318 CHECK_EQUAL(&e1, itr);
319
320 itr = itr->GetNext();
321 CHECK_EQUAL(&e2, itr);
322
323 itr = itr->GetNext();
324 CHECK_EQUAL(&e3, itr);
325
326 itr = itr->GetNext();
327 CHECK_EQUAL(&e1, itr);
328}

◆ TEST() [5/135]

stk::test::TEST ( DList ,
LinkBack  )

Definition at line 216 of file stktest_misc.cpp.

217{
218 ListHead list;
219 ListEntry e1(1), e2(2), e3(3);
220
221 list.LinkBack(e1);
222 CHECK_EQUAL(&e1, list.GetFirst());
223 CHECK_EQUAL(&e1, list.GetLast());
224 CHECK_EQUAL(&list, e1.GetHead());
225
226 list.LinkBack(e2);
227 CHECK_EQUAL(&e1, list.GetFirst());
228 CHECK_EQUAL(&e2, list.GetLast());
229
230 list.LinkBack(e3);
231 CHECK_EQUAL(&e1, list.GetFirst());
232 CHECK_EQUAL(&e3, list.GetLast());
233
234 CHECK_EQUAL(3, list.GetSize());
235}

◆ TEST() [6/135]

stk::test::TEST ( DList ,
LinkFront  )

Definition at line 195 of file stktest_misc.cpp.

196{
197 ListHead list;
198 ListEntry e1(1), e2(2), e3(3);
199
200 list.LinkFront(e1);
201 CHECK_EQUAL(&e1, list.GetFirst());
202 CHECK_EQUAL(&e1, list.GetLast());
203 CHECK_EQUAL(&list, e1.GetHead());
204
205 list.LinkFront(e2);
206 CHECK_EQUAL(&e2, list.GetFirst());
207 CHECK_EQUAL(&e1, list.GetLast());
208
209 list.LinkFront(e3);
210 CHECK_EQUAL(&e3, list.GetFirst());
211 CHECK_EQUAL(&e1, list.GetLast());
212
213 CHECK_EQUAL(3, list.GetSize());
214}

◆ TEST() [7/135]

stk::test::TEST ( DList ,
PopBack  )

Definition at line 264 of file stktest_misc.cpp.

265{
266 ListHead list;
267 ListEntry e1(1), e2(2), e3(3);
268
269 list.LinkBack(e1);
270 list.LinkBack(e2);
271 list.LinkBack(e3);
272
273 list.PopBack();
274
275 CHECK_EQUAL(&e1, list.GetFirst());
276 CHECK_EQUAL(&e2, list.GetLast());
277
278 list.PopBack();
279
280 CHECK_EQUAL(&e1, list.GetFirst());
281 CHECK_EQUAL(&e1, list.GetLast());
282
283 list.PopBack();
284
285 CHECK_EQUAL_ZERO(list.GetSize());
286 CHECK_TRUE(list.IsEmpty());
287 CHECK_TRUE(NULL == list.GetFirst());
288 CHECK_TRUE(NULL == list.GetLast());
289}

◆ TEST() [8/135]

stk::test::TEST ( DList ,
PopFront  )

Definition at line 237 of file stktest_misc.cpp.

238{
239 ListHead list;
240 ListEntry e1(1), e2(2), e3(3);
241
242 list.LinkBack(e1);
243 list.LinkBack(e2);
244 list.LinkBack(e3);
245
246 list.PopFront();
247
248 CHECK_EQUAL(&e2, list.GetFirst());
249 CHECK_EQUAL(&e3, list.GetLast());
250
251 list.PopFront();
252
253 CHECK_EQUAL(&e3, list.GetFirst());
254 CHECK_EQUAL(&e3, list.GetLast());
255
256 list.PopFront();
257
258 CHECK_EQUAL_ZERO(list.GetSize());
259 CHECK_TRUE(list.IsEmpty());
260 CHECK_TRUE(NULL == list.GetFirst());
261 CHECK_TRUE(NULL == list.GetLast());
262}

◆ TEST() [9/135]

stk::test::TEST ( DList ,
Relink  )

Definition at line 330 of file stktest_misc.cpp.

331{
332 ListHead list;
333 ListEntry e1(1), e2(2), e3(3);
334
335 list.LinkBack(e1);
336 list.LinkBack(e2);
337 list.LinkBack(e3);
338
339 ListHead list2;
340 list.RelinkTo(list2);
341
342 CHECK_EQUAL_ZERO(list.GetSize());
343 CHECK_TRUE(list.IsEmpty());
344 CHECK_TRUE(NULL == list.GetFirst());
345 CHECK_TRUE(NULL == list.GetLast());
346
347 CHECK_EQUAL(3, list2.GetSize());
348 CHECK_EQUAL(&list2, e1.GetHead());
349 CHECK_EQUAL(&list2, e2.GetHead());
350 CHECK_EQUAL(&list2, e3.GetHead());
351}

◆ TEST() [10/135]

stk::test::TEST ( Kernel ,
AddTask  )

Definition at line 126 of file stktest_kernel.cpp.

127{
130 const ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
131
132 kernel.Initialize();
133
134 CHECK_EQUAL_TEXT(0, strategy->GetSize(), "Expecting none kernel tasks");
135
136 kernel.AddTask(&task);
137
138 CHECK_EQUAL_TEXT(1, strategy->GetSize(), "Expecting 1 kernel task");
139
140 IKernelTask *ktask = strategy->GetFirst();
141 CHECK_TRUE_TEXT(ktask != NULL, "Expecting one kernel task");
142
143 CHECK_TRUE_TEXT(ktask->GetUserTask() == &task, "Expecting just added user task");
144}
Concrete implementation of IKernel.
Definition stk.h:83
void Initialize(uint32_t resolution_us=PERIODICITY_DEFAULT)
Prepare kernel for use: reset state, configure the platform, and register the service singleton.
Definition stk.h:805
ITaskSwitchStrategy * GetSwitchStrategy()
Get task-switching strategy instance owned by this kernel.
Definition stk.h:959
void AddTask(ITask *user_task)
Register task for a soft real-time (SRT) scheduling.
Definition stk.h:832
Scheduling-strategy-facing interface for a kernel task slot.
Definition stk_common.h:493
virtual ITask * GetUserTask()=0
Get user task.
Interface for a task switching strategy implementation.
Definition stk_common.h:782
virtual size_t GetSize() const =0
Get number of tasks currently managed by this strategy.
virtual IKernelTask * GetFirst() const =0
Get first task.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [11/135]

stk::test::TEST ( Kernel ,
AddTaskFailHrtStarted  )

Definition at line 280 of file stktest_kernel.cpp.

281{
283 TaskMock<ACCESS_USER> task1, task2;
284
285 kernel.Initialize();
286 kernel.AddTask(&task1, 1, 1, 0);
287 kernel.Start();
288
289 try
290 {
291 g_TestContext.ExpectAssert(true);
292 kernel.AddTask(&task2, 1, 1, 0);
293 CHECK_TEXT(false, "expecting to AddTask to fail when KERNEL_HRT");
294 }
295 catch (TestAssertPassed &pass)
296 {
297 CHECK(true);
299 }
300}
TestContext g_TestContext
Global instance of the TestContext.
Definition stktest.cpp:16
void Start()
Start the scheduler. This call does not return until all tasks have exited (KERNEL_DYNAMIC mode) or i...
Definition stk.h:921
void ExpectAssert(bool expect)
Start expecting assertion for the test case.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [12/135]

stk::test::TEST ( Kernel ,
AddTaskFailMaxOut  )

Definition at line 159 of file stktest_kernel.cpp.

160{
162 TaskMock<ACCESS_USER> task1, task2, task3;
163
164 kernel.Initialize();
165
166 try
167 {
168 g_TestContext.ExpectAssert(true);
169 kernel.AddTask(&task1);
170 kernel.AddTask(&task2);
171 kernel.AddTask(&task3);
172 CHECK_TEXT(false, "expecting to fail adding task because max is 2 but adding 3-rd");
173 }
174 catch (TestAssertPassed &pass)
175 {
176 CHECK(true);
178 }
179}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [13/135]

stk::test::TEST ( Kernel ,
AddTaskFailSameTask  )

Definition at line 181 of file stktest_kernel.cpp.

182{
185
186 kernel.Initialize();
187
188 try
189 {
190 g_TestContext.ExpectAssert(true);
191 kernel.AddTask(&task);
192 kernel.AddTask(&task);
193 CHECK_TEXT(false, "expecting to fail adding the same task");
194 }
195 catch (TestAssertPassed &pass)
196 {
197 CHECK(true);
199 }
200}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [14/135]

stk::test::TEST ( Kernel ,
AddTaskFailStaticStarted  )

Definition at line 258 of file stktest_kernel.cpp.

259{
261 TaskMock<ACCESS_USER> task1, task2;
262
263 kernel.Initialize();
264 kernel.AddTask(&task1);
265 kernel.Start();
266
267 try
268 {
269 g_TestContext.ExpectAssert(true);
270 kernel.AddTask(&task2);
271 CHECK_TEXT(false, "expecting to AddTask to fail when non KERNEL_DYNAMIC");
272 }
273 catch (TestAssertPassed &pass)
274 {
275 CHECK(true);
277 }
278}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [15/135]

stk::test::TEST ( Kernel ,
AddTaskInitStack  )

Definition at line 146 of file stktest_kernel.cpp.

147{
150 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
151
152 kernel.Initialize();
153 kernel.AddTask(&task);
154
155 CHECK_EQUAL(&task, platform->m_stack_info[STACK_USER_TASK].task);
156 CHECK_EQUAL((size_t)task.GetStack(), platform->m_stack_info[STACK_USER_TASK].stack->SP);
157}
@ STACK_USER_TASK
Stack of the user task.
Definition stk_common.h:71
IPlatform * GetPlatform()
Get platform driver instance owned by this kernel.
Definition stk.h:954
Word SP
Stack Pointer (SP) register (note: must be the first entry in this struct).
Definition stk_common.h:182
Word * GetStack() const
Get pointer to the stack memory.
Definition stk_helper.h:54
IPlatform mock.
Definition stktest.h:75
StackInfo m_stack_info[STACK_EXIT_TRAP+1]
Definition stktest.h:250

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_info, stk::Stack::SP, stk::test::PlatformTestMock::StackInfo::stack, stk::STACK_USER_TASK, and stk::test::PlatformTestMock::StackInfo::task.

Here is the call graph for this function:

◆ TEST() [16/135]

stk::test::TEST ( Kernel ,
AddTaskNoInit  )

Definition at line 108 of file stktest_kernel.cpp.

109{
112
113 try
114 {
115 g_TestContext.ExpectAssert(true);
116 kernel.AddTask(&task);
117 CHECK_TEXT(false, "AddTask() did not fail");
118 }
119 catch (TestAssertPassed &pass)
120 {
121 CHECK(true);
123 }
124}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), and g_TestContext.

Here is the call graph for this function:

◆ TEST() [17/135]

stk::test::TEST ( Kernel ,
AddTaskWhenStarted  )

Definition at line 234 of file stktest_kernel.cpp.

235{
237 TaskMock<ACCESS_USER> task1, task2;
238 const ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
239
240 kernel.Initialize();
241 kernel.AddTask(&task1);
242 kernel.Start();
243
244 CHECK_EQUAL_TEXT(1, strategy->GetSize(), "expecting task1 be added at this stage");
245
247 g_AddTaskWhenStartedRelaxCpuContext.strategy = strategy;
249
250 kernel.AddTask(&task2);
251
252 CHECK_EQUAL_TEXT(2, strategy->GetSize(), "task2 must be added");
253
254 // AddTask is calling Yield/SwitchToNext which takes 2 ticks
255 CHECK_EQUAL_TEXT(2, g_AddTaskWhenStartedRelaxCpuContext.counter, "should complete within 2 ticks");
256}
void(* g_RelaxCpuHandler)()
__stk_relax_cpu handler.
Definition stktest.cpp:17
static void AddTaskWhenStartedRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), AddTaskWhenStartedRelaxCpu(), g_AddTaskWhenStartedRelaxCpuContext, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [18/135]

stk::test::TEST ( Kernel ,
ContextSwitchAccessModeChange  )

Definition at line 530 of file stktest_kernel.cpp.

531{
535 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
536
537 kernel.Initialize();
538 kernel.AddTask(&task1);
539 kernel.AddTask(&task2);
540 kernel.Start();
541
542 // 1-st task
543 CHECK_EQUAL(ACCESS_USER, platform->m_stack_active->mode);
544
545 // ISR calls OnSysTick
546 platform->ProcessTick();
547
548 // 2-st task
549 CHECK_EQUAL(ACCESS_PRIVILEGED, platform->m_stack_active->mode);
550}
@ 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
EAccessMode mode
access mode
Definition stk_common.h:183
void ProcessTick()
Process one tick.
Definition stktest.h:180

References stk::ACCESS_PRIVILEGED, stk::ACCESS_USER, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::Stack::mode, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [19/135]

stk::test::TEST ( Kernel ,
ContextSwitchCorruptedFsmMode  )

Definition at line 552 of file stktest_kernel.cpp.

553{
556 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
557
558 kernel.Initialize();
559 kernel.AddTask(&task);
560 kernel.Start();
561
562 // ISR calls OnSysTick
563 platform->ProcessTick();
564
565 g_TestContext.ExpectPanic(true);
566
567 kernel.ForceUpdateInvalidFsmState(true);
568 platform->ProcessTick();
570
572
573 kernel.ForceUpdateInvalidFsmState(false);
574 platform->ProcessTick();
576}
@ KERNEL_PANIC_NONE
Panic is absent (no fault).
Definition stk_common.h:53
@ KERNEL_PANIC_BAD_STATE
Kernel entered unexpected (bad) state.
Definition stk_common.h:61
EKernelPanicId g_PanicValue
Panic value.
Definition stktest.cpp:20
void ForceUpdateInvalidFsmState(bool max_val)

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::KernelMock< TMode, TSize, TStrategy, TPlatform >::ForceUpdateInvalidFsmState(), g_PanicValue, g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::KERNEL_PANIC_BAD_STATE, stk::KERNEL_PANIC_NONE, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [20/135]

stk::test::TEST ( Kernel ,
ContextSwitchOnSysTickISR  )

Definition at line 483 of file stktest_kernel.cpp.

484{
486 TaskMock<ACCESS_USER> task1, task2;
487 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
488 Stack *&idle = platform->m_stack_idle, *&active = platform->m_stack_active;
489
490 kernel.Initialize();
491 kernel.AddTask(&task1);
492 kernel.AddTask(&task2);
493 kernel.Start();
494
495 // ISR calls OnSysTick 1-st time
496 {
497 platform->ProcessTick();
498
499 CHECK_TRUE(idle != NULL);
500 CHECK_TRUE(active != NULL);
501
502 // 1-st task is switched from Active and becomes Idle
503 CHECK_EQUAL(idle->SP, (size_t)task1.GetStack());
504
505 // 2-nd task becomes Active
506 CHECK_EQUAL(active->SP, (size_t)task2.GetStack());
507
508 // context switch requested
509 CHECK_EQUAL(1, platform->m_context_switch_nr);
510 }
511
512 // ISR calls OnSysTick 2-nd time
513 {
514 platform->ProcessTick();
515
516 CHECK_TRUE(idle != NULL);
517 CHECK_TRUE(active != NULL);
518
519 // 2-st task is switched from Active and becomes Idle
520 CHECK_EQUAL(idle->SP, (size_t)task2.GetStack());
521
522 // 1-nd task becomes Active
523 CHECK_EQUAL(active->SP, (size_t)task1.GetStack());
524
525 // context switch requested
526 CHECK_EQUAL(2, platform->m_context_switch_nr);
527 }
528}
Stack descriptor.
Definition stk_common.h:181

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_context_switch_nr, stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_stack_idle, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [21/135]

stk::test::TEST ( Kernel ,
Hrt  )

Definition at line 771 of file stktest_kernel.cpp.

772{
774 TaskMock<ACCESS_USER> task1, task2;
775 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
776
777 kernel.Initialize();
778 kernel.AddTask(&task1, 1, 1, 0);
779 kernel.AddTask(&task2, 2, 1, 0);
780 kernel.Start();
781
782 platform->ProcessTick();
783 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task2.GetStack());
784
785 platform->ProcessTick();
786 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task1.GetStack());
787}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [22/135]

stk::test::TEST ( Kernel ,
HrtAddNonHrt  )

Definition at line 789 of file stktest_kernel.cpp.

790{
793
794 kernel.Initialize();
795
796 try
797 {
798 g_TestContext.ExpectAssert(true);
799 kernel.AddTask(&task);
800 CHECK_TEXT(false, "non-HRT AddTask not supported in HRT mode");
801 }
802 catch (TestAssertPassed &pass)
803 {
804 CHECK(true);
806 }
807}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [23/135]

stk::test::TEST ( Kernel ,
HrtAddNotAllowedForNonHrtMode  )

Definition at line 809 of file stktest_kernel.cpp.

810{
813
814 kernel.Initialize();
815
816 try
817 {
818 g_TestContext.ExpectAssert(true);
819 kernel.AddTask(&task, 1, 1, 0);
820 CHECK_TEXT(false, "HRT-related AddTask not supported in non-HRT mode");
821 }
822 catch (TestAssertPassed &pass)
823 {
824 CHECK(true);
826 }
827}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [24/135]

stk::test::TEST ( Kernel ,
HrtOnlyAPI  )

Definition at line 1057 of file stktest_kernel.cpp.

1058{
1061
1062 kernel.Initialize();
1063 kernel.AddTask(&task);
1064 kernel.Start();
1065
1066 // Obtain kernel task
1067 IKernelTask *ktask = kernel.GetSwitchStrategy()->GetFirst();
1068 CHECK_TRUE_TEXT(ktask != nullptr, "Kernel task must exist");
1069
1070 try
1071 {
1072 g_TestContext.ExpectAssert(true);
1073 ktask->GetHrtRelativeDeadline();
1074 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1075 }
1076 catch (TestAssertPassed &pass)
1077 {
1078 CHECK(true);
1080 }
1081
1082 try
1083 {
1085 ktask->GetHrtPeriodicity();
1086 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1087 }
1088 catch (TestAssertPassed &pass)
1089 {
1090 CHECK(true);
1091 g_TestContext.ExpectAssert(false);
1092 }
1093
1094 try
1095 {
1096 g_TestContext.ExpectAssert(true);
1097 ktask->GetHrtDeadline();
1098 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1099 }
1100 catch (TestAssertPassed &pass)
1101 {
1102 CHECK(true);
1103 g_TestContext.ExpectAssert(false);
1104 }
1105}
virtual Timeout GetHrtRelativeDeadline() const =0
Get HRT task's relative deadline.
virtual Timeout GetHrtDeadline() const =0
Get HRT task deadline (max allowed task execution time).
virtual Timeout GetHrtPeriodicity() const =0
Get HRT task execution periodicity.
Throwable class for catching assertions from STK_ASSERT_HANDLER().
Definition stktest.h:67

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::IKernelTask::GetHrtDeadline(), stk::IKernelTask::GetHrtPeriodicity(), stk::IKernelTask::GetHrtRelativeDeadline(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [25/135]

stk::test::TEST ( Kernel ,
HrtSkipSleepingNextRM  )

Definition at line 960 of file stktest_kernel.cpp.

961{
963 TaskMock<ACCESS_USER> task1, task2;
964 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
965
966 kernel.Initialize();
967 kernel.AddTask(&task1, 2, 2, 3);
968 kernel.AddTask(&task2, 3, 3, 0);
969 kernel.Start();
970
971 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
973
974 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task2.GetStack());
975 platform->ProcessTick();
976 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task2.GetStack());
977 platform->ProcessTick();
978 Yield();
979 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task1.GetStack());
980
981 CHECK_FALSE(platform->m_hard_fault);
982 CHECK_EQUAL(0, task1.m_deadline_missed);
983 CHECK_EQUAL(0, task2.m_deadline_missed);
984}
void Yield()
Notify scheduler to switch to the next runnable task.
Definition stk_helper.h:331
static void HrtTaskDeadlineMissedRelaxCpu()
uint32_t m_deadline_missed
duration of workload if deadline is missed in HRT mode
Definition stktest.h:337

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_HrtTaskDeadlineMissedRelaxCpuContext, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), HrtTaskDeadlineMissedRelaxCpu(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::TaskMock< _AccessMode >::m_deadline_missed, stk::test::PlatformTestMock::m_hard_fault, stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::Yield().

Here is the call graph for this function:

◆ TEST() [26/135]

stk::test::TEST ( Kernel ,
HrtSleepingAwakeningStateChange  )

Definition at line 1037 of file stktest_kernel.cpp.

1038{
1041 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1042
1043 kernel.Initialize();
1044 kernel.AddTask(&task, 1, 1, 1);
1045 kernel.Start();
1046
1047 // due to 1 tick delayed start of the task Kernel enters into a SLEEPING state
1048 CHECK_EQUAL(platform->m_stack_active, platform->m_stack_info[STACK_SLEEP_TRAP].stack);
1049
1050 platform->ProcessTick();
1051
1052 // after a tick task become active and Kernel enters into a AWAKENING state
1053 CHECK_EQUAL(platform->m_stack_idle, platform->m_stack_info[STACK_SLEEP_TRAP].stack);
1054 CHECK_EQUAL(platform->m_stack_active->SP, (size_t)task.GetStack());
1055}
@ STACK_SLEEP_TRAP
Stack of the Sleep trap.
Definition stk_common.h:72

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_stack_idle, stk::test::PlatformTestMock::m_stack_info, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, stk::test::PlatformTestMock::StackInfo::stack, stk::STACK_SLEEP_TRAP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [27/135]

stk::test::TEST ( Kernel ,
HrtSleepNotAllowed  )

Definition at line 829 of file stktest_kernel.cpp.

830{
833
834 kernel.Initialize();
835 kernel.AddTask(&task, 1, 1, 0);
836 kernel.Start();
837
838 try
839 {
840 g_TestContext.ExpectAssert(true);
841 Sleep(1);
842 CHECK_TEXT(false, "IKernelService::Sleep not allowed in HRT mode");
843 }
844 catch (TestAssertPassed &pass)
845 {
846 CHECK(true);
848 }
849
850 try
851 {
853 SleepUntil(GetTicks() + 1);
854 CHECK_TEXT(false, "IKernelService::SleepUntil not allowed in HRT mode");
855 }
856 catch (TestAssertPassed &pass)
857 {
858 CHECK(true);
859 g_TestContext.ExpectAssert(false);
860 }
861}
void Sleep(uint32_t ticks)
Put calling process into a sleep state.
Definition stk_helper.h:298
Ticks GetTicks()
Get number of ticks elapsed since kernel start.
Definition stk_helper.h:248
void SleepUntil(Ticks timestamp)
Put calling process into a sleep state until the specified timestamp.
Definition stk_helper.h:322

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::GetTicks(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Sleep(), stk::SleepUntil(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [28/135]

stk::test::TEST ( Kernel ,
HrtTaskCompleted  )

Definition at line 863 of file stktest_kernel.cpp.

864{
867 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
868 const ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
869
870 kernel.Initialize();
871 kernel.AddTask(&task, 1, 1, 0);
872 kernel.Start();
873
874 CHECK_TRUE(strategy->GetSize() != 0);
875
876 platform->EventTaskExit(platform->m_stack_active);
877 platform->ProcessTick();
878
879 platform->ProcessTick();
880
881 CHECK_EQUAL(0, strategy->GetSize());
882
883 CHECK_EQUAL(IKernel::STATE_READY, kernel.GetState());
884}
EState GetState() const
Get kernel state.
Definition stk.h:963
@ STATE_READY
ready to start, IKernel::Start() must be called
Definition stk_common.h:862
void EventTaskExit(Stack *stack)
Definition stktest.h:208

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetState(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernel::STATE_READY.

Here is the call graph for this function:

◆ TEST() [29/135]

stk::test::TEST ( Kernel ,
HrtTaskDeadlineMissedRR  )

Definition at line 910 of file stktest_kernel.cpp.

911{
914 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
915
916 kernel.Initialize();
917 kernel.AddTask(&task, 2, 1, 0);
918 kernel.Start();
919
920 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
922
923 platform->ProcessTick();
924
925 // task does not Yield() and thus next tick will overcome the deadline
926 g_TestContext.ExpectAssert(true);
927
928 // 2-nd tick goes outside the deadline
929 platform->ProcessTick();
930
931 CHECK_TRUE(platform->m_hard_fault);
932 CHECK_EQUAL(2, task.m_deadline_missed);
933}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_HrtTaskDeadlineMissedRelaxCpuContext, g_RelaxCpuHandler, g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), HrtTaskDeadlineMissedRelaxCpu(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::TaskMock< _AccessMode >::m_deadline_missed, stk::test::PlatformTestMock::m_hard_fault, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [30/135]

stk::test::TEST ( Kernel ,
HrtTaskDeadlineNotMissedRR  )

Definition at line 935 of file stktest_kernel.cpp.

936{
939 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
940
941 kernel.Initialize();
942 kernel.AddTask(&task, 2, 1, 0);
943 kernel.Start();
944
945 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
947
948 platform->ProcessTick();
949
950 // task completes its work and yields to kernel, its workload is 1 ticks now that is within deadline 1
951 Yield();
952
953 // 2-nd tick continues scheduling normally
954 platform->ProcessTick();
955
956 CHECK_FALSE(platform->m_hard_fault);
957 CHECK_EQUAL(0, task.m_deadline_missed);
958}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_HrtTaskDeadlineMissedRelaxCpuContext, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), HrtTaskDeadlineMissedRelaxCpu(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::TaskMock< _AccessMode >::m_deadline_missed, stk::test::PlatformTestMock::m_hard_fault, stk::test::PlatformTestMock::ProcessTick(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::Yield().

Here is the call graph for this function:

◆ TEST() [31/135]

stk::test::TEST ( Kernel ,
HrtTaskExitDuringSleepStateDM  )

Definition at line 1027 of file stktest_kernel.cpp.

1028{
1030}
static void TestHrtTaskExitDuringSleepState()

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [32/135]

stk::test::TEST ( Kernel ,
HrtTaskExitDuringSleepStateEDF  )

Definition at line 1032 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [33/135]

stk::test::TEST ( Kernel ,
HrtTaskExitDuringSleepStateRM  )

Definition at line 1022 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [34/135]

stk::test::TEST ( Kernel ,
HrtTaskExitDuringSleepStateRR  )

Definition at line 1017 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [35/135]

stk::test::TEST ( Kernel ,
InitDoubleFail  )

Definition at line 90 of file stktest_kernel.cpp.

91{
93
94 try
95 {
96 g_TestContext.ExpectAssert(true);
97 kernel.Initialize();
98 kernel.Initialize();
99 CHECK_TEXT(false, "duplicate Kernel::Initialize() did not fail");
100 }
101 catch (TestAssertPassed &pass)
102 {
103 CHECK(true);
105 }
106}

References g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize().

Here is the call graph for this function:

◆ TEST() [36/135]

stk::test::TEST ( Kernel ,
MaxTasks  )

Definition at line 57 of file stktest_kernel.cpp.

58{
59 const int32_t TASKS = 2;
62
63 CHECK_EQUAL(TASKS, result);
64}
@ TASKS_MAX
Maximum number of concurrently registered tasks. Fixed at compile time. Exceeding this limit in AddTa...
Definition stk.h:764

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::TASKS_MAX.

Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

Here is the caller graph for this function:

◆ TEST() [37/135]

stk::test::TEST ( Kernel ,
OnTaskExitFP31  )

Definition at line 647 of file stktest_kernel.cpp.

648{
650}
static void TestTaskExit()

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [38/135]

stk::test::TEST ( Kernel ,
OnTaskExitRR  )

Definition at line 637 of file stktest_kernel.cpp.

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [39/135]

stk::test::TEST ( Kernel ,
OnTaskExitSWRR  )

Definition at line 642 of file stktest_kernel.cpp.

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [40/135]

stk::test::TEST ( Kernel ,
OnTaskExitUnknownOrNull  )

Definition at line 652 of file stktest_kernel.cpp.

653{
656 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
657 Stack unk_stack;
658
659 kernel.Initialize();
660 kernel.AddTask(&task1);
661 kernel.Start();
662
663 // ISR calls OnSysTick (task1 = idle, task2 = active)
664 platform->ProcessTick();
665
666 try
667 {
668 g_TestContext.ExpectAssert(true);
669 platform->EventTaskExit(&unk_stack);
670 CHECK_TEXT(false, "expecting to fail on unknown stack");
671 }
672 catch (TestAssertPassed &pass)
673 {
674 CHECK(true);
676 }
677
678 try
679 {
681 platform->EventTaskExit(NULL);
682 CHECK_TEXT(false, "expecting to fail on NULL");
683 }
684 catch (TestAssertPassed &pass)
685 {
686 CHECK(true);
687 g_TestContext.ExpectAssert(false);
688 }
689}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [41/135]

stk::test::TEST ( Kernel ,
OnTaskExitUnsupported  )

◆ TEST() [42/135]

stk::test::TEST ( Kernel ,
OnTaskNotFoundBySP  )

Definition at line 710 of file stktest_kernel.cpp.

711{
714 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
715
716 kernel.Initialize();
717 kernel.AddTask(&task1);
718 kernel.Start();
719
720 platform->ProcessTick();
721
722 try
723 {
724 g_TestContext.ExpectAssert(true);
725 platform->EventTaskSwitch(0xdeadbeef);
726 CHECK_TEXT(false, "non existent task must not succeed");
727 }
728 catch (TestAssertPassed &pass)
729 {
730 CHECK(true);
732 }
733}
void EventTaskSwitch(size_t caller_SP)
Definition stktest.h:213

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskSwitch(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [43/135]

stk::test::TEST ( Kernel ,
OnTaskSkipFreedTask  )

Definition at line 735 of file stktest_kernel.cpp.

736{
738 TaskMock<ACCESS_PRIVILEGED> task1, task2;
739 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
740 Stack *&active = platform->m_stack_active;
741
742 kernel.Initialize();
743 kernel.AddTask(&task1);
744 kernel.AddTask(&task2);
745 kernel.Start();
746
747 // task1 exited (will schedule its removal)
748 platform->EventTaskExit(active);
749
750 // 2 ticks to remove exited task1 from scheduling (1st switched to task2, 2nd cleans up task1 exit)
751 platform->ProcessTick();
752 platform->ProcessTick();
753
754 try
755 {
756 g_TestContext.ExpectAssert(true);
757
758 // we loop through all tasks in attempt to find non existent SP (0xdeadbeef)
759 // by this FindTaskBySP() is invoked and will loop thorugh the exited task1's
760 // slot
761 platform->EventTaskSwitch(0xdeadbeef);
762 CHECK_TEXT(false, "exited task must be successfully skipped by FindTaskBySP()");
763 }
764 catch (TestAssertPassed &pass)
765 {
766 CHECK(true);
768 }
769}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), stk::test::PlatformTestMock::EventTaskSwitch(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [44/135]

stk::test::TEST ( Kernel ,
RemoveTask  )

Definition at line 302 of file stktest_kernel.cpp.

303{
305 TaskMock<ACCESS_USER> task1, task2;
306 const ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
307
308 kernel.Initialize();
309 kernel.AddTask(&task1);
310 kernel.AddTask(&task2);
311
312 kernel.RemoveTask(&task1);
313 CHECK_EQUAL_TEXT(&task2, strategy->GetFirst()->GetUserTask(), "Expecting task2 as first");
314
315 kernel.RemoveTask(&task1);
316 CHECK_EQUAL_TEXT(&task2, strategy->GetFirst()->GetUserTask(), "Expecting task2 as first (duplicate task1 removal attempt)");
317
318 kernel.RemoveTask(&task2);
319 CHECK_EQUAL_TEXT(0, strategy->GetSize(), "Expecting none tasks");
320}
void RemoveTask(ITask *user_task)
Remove a previously added task from the kernel before Start().
Definition stk.h:895

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [45/135]

stk::test::TEST ( Kernel ,
RemoveTaskFailNull  )

Definition at line 322 of file stktest_kernel.cpp.

323{
325
326 kernel.Initialize();
327
328 try
329 {
330 g_TestContext.ExpectAssert(true);
331 kernel.RemoveTask((ITask *)NULL);
332 CHECK_TEXT(false, "expecting to fail with NULL argument");
333 }
334 catch (TestAssertPassed &pass)
335 {
336 CHECK(true);
338 }
339}
Interface for a user task.
Definition stk_common.h:433

References g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [46/135]

stk::test::TEST ( Kernel ,
RemoveTaskFailStarted  )

Definition at line 362 of file stktest_kernel.cpp.

363{
366
367 kernel.Initialize();
368 kernel.AddTask(&task);
369 kernel.Start();
370
371 try
372 {
373 g_TestContext.ExpectAssert(true);
374 kernel.RemoveTask(&task);
375 CHECK_TEXT(false, "expecting to fail when Kernel has started");
376 }
377 catch (TestAssertPassed &pass)
378 {
379 CHECK(true);
381 }
382}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [47/135]

stk::test::TEST ( Kernel ,
RemoveTaskFailUnsupported  )

Definition at line 341 of file stktest_kernel.cpp.

342{
345
346 kernel.Initialize();
347 kernel.AddTask(&task);
348
349 try
350 {
351 g_TestContext.ExpectAssert(true);
352 kernel.RemoveTask(&task);
353 CHECK_TEXT(false, "expecting to fail in KERNEL_STATIC mode");
354 }
355 catch (TestAssertPassed &pass)
356 {
357 CHECK(true);
359 }
360}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [48/135]

stk::test::TEST ( Kernel ,
SingleTask  )

◆ TEST() [49/135]

stk::test::TEST ( Kernel ,
Start  )

Definition at line 450 of file stktest_kernel.cpp.

451{
454 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
455 const uint32_t periodicity = PERIODICITY_MAX - 1;
456
457 kernel.Initialize(periodicity);
458 kernel.AddTask(&task);
459
460 kernel.Start();
461
462 CHECK_TRUE(platform->m_started);
463 CHECK_TRUE(g_KernelService != NULL);
464 CHECK_TRUE(platform->m_stack_active != NULL);
465 CHECK_EQUAL((size_t)task.GetStack(), platform->m_stack_active->SP);
466 CHECK_EQUAL(periodicity, platform->GetTickResolution());
467}
@ PERIODICITY_MAX
Maximum periodicity (microseconds), 99 milliseconds (note: this value is the highest working on a rea...
Definition stk_common.h:81
IKernelService * g_KernelService
Definition stktest.cpp:18
uint32_t GetTickResolution() const
Get resolution of the system tick timer in microseconds. Resolution means a number of microseconds be...
Definition stktest.h:149

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_KernelService, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::test::PlatformTestMock::GetTickResolution(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_started, stk::PERIODICITY_MAX, stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [50/135]

stk::test::TEST ( Kernel ,
StartBeginISR  )

◆ TEST() [51/135]

stk::test::TEST ( Kernel ,
StartInvalidPeriodicity  )

Definition at line 384 of file stktest_kernel.cpp.

385{
388
389 try
390 {
391 g_TestContext.ExpectAssert(true);
392 kernel.Initialize(0);
393 CHECK_TEXT(false, "expecting to fail with 0 periodicity");
394 }
395 catch (TestAssertPassed &pass)
396 {
397 CHECK(true);
399 }
400
401 try
402 {
404 kernel.Initialize(PERIODICITY_MAX + 1);
405 CHECK_TEXT(false, "expecting to fail with too large periodicity");
406 }
407 catch (TestAssertPassed &pass)
408 {
409 CHECK(true);
410 g_TestContext.ExpectAssert(false);
411 }
412}

References g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::PERIODICITY_MAX.

Here is the call graph for this function:

◆ TEST() [52/135]

stk::test::TEST ( Kernel ,
StartNoTasks  )

Definition at line 431 of file stktest_kernel.cpp.

432{
434
435 kernel.Initialize();
436
437 try
438 {
439 g_TestContext.ExpectAssert(true);
440 kernel.Start();
441 CHECK_TEXT(false, "expecting to fail without tasks");
442 }
443 catch (TestAssertPassed &pass)
444 {
445 CHECK(true);
447 }
448}

References g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [53/135]

stk::test::TEST ( Kernel ,
StartNotIntialized  )

Definition at line 414 of file stktest_kernel.cpp.

415{
417
418 try
419 {
420 g_TestContext.ExpectAssert(true);
421 kernel.Start();
422 CHECK_TEXT(false, "expecting to fail when not initialized");
423 }
424 catch (TestAssertPassed &pass)
425 {
426 CHECK(true);
428 }
429}

References g_TestContext, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [54/135]

stk::test::TEST ( Kernel ,
State  )

Definition at line 66 of file stktest_kernel.cpp.

67{
70
71 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
72
73 CHECK_TRUE(platform != NULL);
74
75 CHECK_TRUE(kernel.GetState() == IKernel::STATE_INACTIVE);
76
77 kernel.Initialize();
78
79 CHECK_TRUE(kernel.GetState() == IKernel::STATE_READY);
80
81 CHECK_TRUE(IKernelService::GetInstance() != NULL);
82 CHECK_TRUE(IKernelService::GetInstance() == platform->m_service);
83
84 kernel.AddTask(&task);
85 kernel.Start();
86
87 CHECK_TRUE(kernel.GetState() == IKernel::STATE_RUNNING);
88}
@ STATE_INACTIVE
not ready, IKernel::Initialize() must be called
Definition stk_common.h:861
@ STATE_RUNNING
initialized and running, IKernel::Start() was called successfully
Definition stk_common.h:863
static IKernelService * GetInstance()
Get CPU-local instance of the kernel service.
Definition stktest.cpp:69
IKernelService * m_service
Definition stktest.h:238

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetState(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_service, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), stk::IKernel::STATE_INACTIVE, stk::IKernel::STATE_READY, and stk::IKernel::STATE_RUNNING.

Here is the call graph for this function:

◆ TEST() [55/135]

stk::test::TEST ( Kernel ,
SyncMutexMustBeLocked  )

Definition at line 1231 of file stktest_kernel.cpp.

1232{
1235
1237 SyncObjectMock sobj;
1238
1239 kernel.Initialize();
1240 kernel.AddTask(&task);
1241 kernel.Start();
1242
1243 try
1244 {
1245 g_TestContext.ExpectAssert(true);
1246 IKernelService::GetInstance()->Wait(&sobj, &mutex, 10);
1247 CHECK_TEXT(false, "mutex must be locked");
1248 }
1249 catch (TestAssertPassed &pass)
1250 {
1251 CHECK(true);
1253 }
1254}
Namespace of Mutex test.
virtual IWaitObject * Wait(ISyncObject *sobj, IMutex *mutex, Timeout timeout)=0
Put calling process into a waiting state until synchronization object is signaled or timeout occurs.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [56/135]

stk::test::TEST ( Kernel ,
SyncNoNullMutex  )

Definition at line 1182 of file stktest_kernel.cpp.

1183{
1186
1187 SyncObjectMock sobj;
1188
1189 kernel.Initialize();
1190 kernel.AddTask(&task);
1191 kernel.Start();
1192
1193 try
1194 {
1195 g_TestContext.ExpectAssert(true);
1196 IKernelService::GetInstance()->Wait(&sobj, nullptr, 10);
1197 CHECK_TEXT(false, "mutex must not be NULL");
1198 }
1199 catch (TestAssertPassed &pass)
1200 {
1201 CHECK(true);
1203 }
1204}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [57/135]

stk::test::TEST ( Kernel ,
SyncNoNullSyncObj  )

Definition at line 1158 of file stktest_kernel.cpp.

1159{
1162
1164
1165 kernel.Initialize();
1166 kernel.AddTask(&task);
1167 kernel.Start();
1168
1169 try
1170 {
1171 g_TestContext.ExpectAssert(true);
1172 IKernelService::GetInstance()->Wait(nullptr, &mutex, 10);
1173 CHECK_TEXT(false, "sync object must not be NULL");
1174 }
1175 catch (TestAssertPassed &pass)
1176 {
1177 CHECK(true);
1179 }
1180}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [58/135]

stk::test::TEST ( Kernel ,
SyncNotEnabledFailsOnWait  )

Definition at line 1107 of file stktest_kernel.cpp.

1108{
1110 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1112
1113 kernel.Initialize();
1114 kernel.AddTask(&task);
1115 kernel.Start();
1116
1117 try
1118 {
1119 g_TestContext.ExpectAssert(true);
1120 IKernelService::GetInstance()->Wait(nullptr, nullptr, 0);
1121 CHECK_TEXT(false, "kernel does not support waiting without KERNEL_SYNC");
1122 }
1123 catch (TestAssertPassed &pass)
1124 {
1125 CHECK(true);
1127 }
1128
1129 // test return NULL
1132 IWaitObject *wo = IKernelService::GetInstance()->Wait(nullptr, nullptr, 0);
1135 CHECK_TRUE_TEXT(wo == nullptr, "expect NULL");
1136
1137 try
1138 {
1140 platform->EventTaskWait(0, nullptr, nullptr, 0);
1141 CHECK_TEXT(false, "kernel does not support waiting without KERNEL_SYNC");
1142 }
1143 catch (TestAssertPassed &pass)
1144 {
1145 CHECK(true);
1146 g_TestContext.ExpectAssert(false);
1147 }
1148
1149 // test return NULL
1150 g_TestContext.ExpectAssert(true);
1151 g_TestContext.RethrowAssertException(false);
1152 wo = platform->EventTaskWait(0, nullptr, nullptr, 0);
1153 g_TestContext.RethrowAssertException(true);
1154 g_TestContext.ExpectAssert(false);
1155 CHECK_TRUE_TEXT(wo == nullptr, "expect NULL");
1156}
IWaitObject * EventTaskWait(size_t caller_SP, ISyncObject *sync_obj, IMutex *mutex, Timeout timeout)
Definition stktest.h:223
void RethrowAssertException(bool rethrow)
Re-throw assert's exception for the test case.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskWait(), g_TestContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [59/135]

stk::test::TEST ( Kernel ,
SyncNoZeroWait  )

Definition at line 1206 of file stktest_kernel.cpp.

1207{
1210
1212 SyncObjectMock sobj;
1213
1214 kernel.Initialize();
1215 kernel.AddTask(&task);
1216 kernel.Start();
1217
1218 try
1219 {
1220 g_TestContext.ExpectAssert(true);
1221 IKernelService::GetInstance()->Wait(&sobj, &mutex, 0);
1222 CHECK_TEXT(false, "must not be zero wait");
1223 }
1224 catch (TestAssertPassed &pass)
1225 {
1226 CHECK(true);
1228 }
1229}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [60/135]

stk::test::TEST ( Kernel ,
SyncTaskExitAfterWait  )

Definition at line 1256 of file stktest_kernel.cpp.

1257{
1259 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1261
1263 SyncObjectMock sobj;
1264
1265 kernel.Initialize();
1266 kernel.AddTask(&task);
1267 kernel.Start();
1268
1269 {
1270 //MutexMock::ScopedLock guard(mutex);
1271
1272 //IKernelService::GetInstance()->Wait(&sobj, &mutex, 10);
1273 }
1274
1275 // task1 exited (will schedule its removal)
1276 platform->EventTaskExit(platform->m_stack_active);
1277
1278 platform->ProcessTick();
1279
1280 // should be still running here, next tick will result in task exit and kernel stop
1281 CHECK_EQUAL(IKernel::STATE_RUNNING, kernel.GetState());
1282
1283 platform->ProcessTick();
1284
1285 // should be stopped here
1286 CHECK_EQUAL(IKernel::STATE_READY, kernel.GetState());
1287}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetState(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), stk::IKernel::STATE_READY, and stk::IKernel::STATE_RUNNING.

Here is the call graph for this function:

◆ TEST() [61/135]

stk::test::TEST ( Kernel ,
SyncWait  )

Definition at line 1355 of file stktest_kernel.cpp.

1356{
1358}

References Test_SyncWait().

Here is the call graph for this function:

◆ TEST() [62/135]

stk::test::TEST ( Kernel ,
SyncWaitTickless  )

Definition at line 1360 of file stktest_kernel.cpp.

1361{
1363}

References Test_SyncWait().

Here is the call graph for this function:

◆ TEST() [63/135]

stk::test::TEST ( Kernel ,
SyncWaitTicklessDuration  )

Definition at line 1365 of file stktest_kernel.cpp.

1366{
1368 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1370
1372 SyncObjectMock sobj;
1373
1375 g_SyncWaitRelaxCpuContext.platform = platform;
1376 g_SyncWaitRelaxCpuContext.check_tickless = 0; // check first tick
1378
1379 kernel.Initialize();
1380 kernel.AddTask(&task);
1381 kernel.Start();
1382
1384
1385 // sleep_ticks should be equal to 2 on first OnTick call
1387
1388 // in total 4 ticks must be elapsed, including sleep ticks
1389 CHECK_EQUAL(4, platform->m_ticks_count);
1390
1391 // at this stage test should pass successfully by validating sleep_ticks in SyncWaitRelaxCpuContext::Process
1392
1393 CHECK_EQUAL(GetTid(), wo->GetTid());
1394 CHECK_TRUE(wo != nullptr);
1395 CHECK_TRUE(wo->IsTimeout());
1396 CHECK_EQUAL(3, g_SyncWaitRelaxCpuContext.counter);
1397 CHECK_EQUAL(true, mutex.m_locked);
1398}
TId GetTid()
Get task/thread Id of the calling task.
Definition stk_helper.h:217
static void SyncWaitRelaxCpu()
Wait object.
Definition stk_common.h:212
virtual TId GetTid() const =0
Get thread Id of this task.
virtual bool IsTimeout() const =0
Check if task woke up due to a timeout.
Locks bound mutex within a scope of execution. Ensures the mutex is always unlocked when leaving the ...
Definition stk_common.h:389

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SyncWaitRelaxCpuContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTid(), stk::IWaitObject::GetTid(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::IWaitObject::IsTimeout(), stk::test::PlatformTestMock::m_ticks_count, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), SyncWaitRelaxCpu(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [64/135]

stk::test::TEST ( KernelService ,
Delay  )

Definition at line 66 of file stktest_kernelservice.cpp.

67{
70
71 kernel.Initialize();
72 kernel.AddTask(&task);
73 kernel.Start();
74
76 g_DelayContext.platform = kernel.GetPlatform();
77
78 Delay(10);
79
80 g_RelaxCpuHandler = NULL;
81
82 CHECK_EQUAL(10, (int32_t)g_KernelService->GetTicks());
83}
void Delay(uint32_t ticks)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:342
static void DelayRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Delay(), DelayRelaxCpu(), g_DelayContext, g_KernelService, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [65/135]

stk::test::TEST ( KernelService ,
DelayMs  )

Definition at line 85 of file stktest_kernelservice.cpp.

86{
89
90 kernel.Initialize(2000); // decrease resolution to 1 tick = 2 ms
91 kernel.AddTask(&task);
92 kernel.Start();
93
95 g_DelayContext.platform = kernel.GetPlatform();
96
97 DelayMs(10);
98
99 g_RelaxCpuHandler = NULL;
100
101 CHECK_EQUAL(5, (int32_t)g_KernelService->GetTicks());
102}
static void DelayMs(uint32_t ms)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:353

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::DelayMs(), DelayRelaxCpu(), g_DelayContext, g_KernelService, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [66/135]

stk::test::TEST ( KernelService ,
GetMsecToTicks  )

Definition at line 28 of file stktest_kernelservice.cpp.

29{
31 mock.m_ticks = 1;
32
33 mock.m_resolution = 1000;
34 CHECK_EQUAL(10, (int32_t)GetMsFromTicks(10, mock.GetTickResolution()));
35
36 mock.m_resolution = 10000;
37 CHECK_EQUAL(100, (int32_t)GetMsFromTicks(10, mock.GetTickResolution()));
38}
int64_t GetMsFromTicks(int64_t ticks, int32_t resolution)
Convert ticks to milliseconds.
Definition stk_helper.h:228
IKernelService mock.
Definition stktest.h:260
int32_t GetTickResolution() const
Get number of microseconds in one tick.
Definition stktest.h:286

References stk::GetMsFromTicks(), stk::test::KernelServiceMock::GetTickResolution(), stk::test::KernelServiceMock::m_resolution, and stk::test::KernelServiceMock::m_ticks.

Here is the call graph for this function:

◆ TEST() [67/135]

stk::test::TEST ( KernelService ,
GetTickResolution  )

Definition at line 142 of file stktest_kernelservice.cpp.

143{
146 const uint32_t periodicity = PERIODICITY_DEFAULT + 1;
147
148 kernel.Initialize(periodicity);
149 kernel.AddTask(&task);
150 kernel.Start();
151
152 CHECK_EQUAL(periodicity, g_KernelService->GetTickResolution());
153 CHECK_EQUAL(periodicity, stk::GetTickResolution());
154}
@ PERIODICITY_DEFAULT
Default periodicity (microseconds), 1 millisecond.
Definition stk_common.h:82
int32_t GetTickResolution()
Get number of microseconds in one tick.
Definition stk_helper.h:258

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_KernelService, stk::GetTickResolution(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::PERIODICITY_DEFAULT, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [68/135]

stk::test::TEST ( KernelService ,
GetTicks  )

Definition at line 156 of file stktest_kernelservice.cpp.

157{
159 TaskMock<ACCESS_USER> task1, task2;
160 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
161
163 kernel.AddTask(&task1);
164 kernel.AddTask(&task2);
165 kernel.Start();
166
167 // ISR calls OnSysTick 1-st time
168 platform->ProcessTick();
169 CHECK_EQUAL(1, (int32_t)g_KernelService->GetTicks());
170 CHECK_EQUAL(1, (int32_t)stk::GetTicks());
171
172 // ISR calls OnSysTick 2-nd time
173 platform->ProcessTick();
174 CHECK_EQUAL(2, (int32_t)g_KernelService->GetTicks());
175 CHECK_EQUAL(2, (int32_t)stk::GetTicks());
176}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_KernelService, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTicks(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::PERIODICITY_DEFAULT, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [69/135]

stk::test::TEST ( KernelService ,
GetTid  )

Definition at line 125 of file stktest_kernelservice.cpp.

126{
129 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
130
131 kernel.Initialize();
132 kernel.AddTask(&task);
133 kernel.Start();
134
135 platform->ProcessTick();
136
137 // task/thread id is a pointer to the user task
138 size_t tid = stk::GetTid();
139 CHECK_EQUAL(tid, (size_t)&task);
140}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTid(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [70/135]

stk::test::TEST ( KernelService ,
GetTimeNowMs  )

Definition at line 178 of file stktest_kernelservice.cpp.

179{
182 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
183
185 kernel.AddTask(&task1);
186 kernel.Start();
187
188 CHECK_EQUAL(0, (int32_t)stk::GetTimeNowMs());
189
190 // make 1000 ticks
191 for (int32_t i = 0; i < 1000; ++i)
192 platform->ProcessTick();
193
194 // 1000 usec * 1000 ticks = 1000 ms
195 CHECK_EQUAL(1000, (int32_t)stk::GetTimeNowMs());
196}
static int64_t GetTimeNowMs()
Get current time in milliseconds since kernel start.
Definition stk_helper.h:281

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTimeNowMs(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::PERIODICITY_DEFAULT, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [71/135]

stk::test::TEST ( KernelService ,
GetTimeNowMsWith10UsecTick  )

Definition at line 198 of file stktest_kernelservice.cpp.

199{
202 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
203
204 // set periodicity to 10 microsecond
205 kernel.Initialize(10);
206 kernel.AddTask(&task1);
207 kernel.Start();
208
209 CHECK_EQUAL(0, (int32_t)stk::GetTimeNowMs());
210
211 // make 1000 ticks
212 for (int32_t i = 0; i < 1000; ++i)
213 platform->ProcessTick();
214
215 // 10 usec * 1000 ticks = 10 ms
216 CHECK_EQUAL(10, (int32_t)stk::GetTimeNowMs());
217}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTimeNowMs(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [72/135]

stk::test::TEST ( KernelService ,
InitStackFailure  )

Definition at line 104 of file stktest_kernelservice.cpp.

105{
108 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
109 platform->m_fail_InitStack = true;
110
111 try
112 {
113 g_TestContext.ExpectAssert(true);
114 kernel.Initialize();
115 kernel.AddTask(&task);
116 CHECK_TEXT(false, "AddTask() did not fail");
117 }
118 catch (TestAssertPassed &pass)
119 {
120 CHECK(true);
122 }
123}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::test::PlatformTestMock::m_fail_InitStack.

Here is the call graph for this function:

◆ TEST() [73/135]

◆ TEST() [74/135]

stk::test::TEST ( KernelService ,
SleepAndWakeTickless  )

Definition at line 640 of file stktest_kernelservice.cpp.

641{
644 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
645
646 kernel.Initialize();
647 kernel.AddTask(&task);
648 kernel.Start();
649
651 g_SleepAndWakeTicklessRelaxCpuContext.platform = platform;
652
653 // task1 calls Sleep
654 Sleep(3);
655
656 // expect 4 ticks (1 + 3 sleep)
657 CHECK_EQUAL(4, platform->m_ticks_count);
658
659 // expect only 2 context switches (1st: Task=Idle, SleepCtx=Active, 2nd: Task=Active, SleepCtx=Idle)
660 CHECK_EQUAL(2, platform->m_context_switch_nr);
661}
static void SleepAndWakeTicklessRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SleepAndWakeTicklessRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_context_switch_nr, stk::test::PlatformTestMock::m_ticks_count, stk::Sleep(), SleepAndWakeTicklessRelaxCpu(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [75/135]

stk::test::TEST ( KernelService ,
SleepFP31  )

Definition at line 452 of file stktest_kernelservice.cpp.

453{
455}
static void TestTaskSleep(bool until)

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [76/135]

stk::test::TEST ( KernelService ,
SleepMsRR  )

Definition at line 472 of file stktest_kernelservice.cpp.

473{
475 TaskMock<ACCESS_USER> task1, task2;
476 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
477 Stack *&active = platform->m_stack_active;
478
479 kernel.Initialize();
480 kernel.AddTask(&task1);
481 kernel.AddTask(&task2);
482 kernel.Start();
483
484 // on start Round-Robin selects the very first task
485 CHECK_EQUAL_TEXT(active->SP, (size_t)task1.GetStack(), "expecting task1");
486
487 // ISR calls OnSysTick (task1 = idle, task2 = active)
488 platform->ProcessTick();
489 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2");
490
493 g_SleepRelaxCpuContext.platform = platform;
494 g_SleepRelaxCpuContext.task1 = &task1;
495 g_SleepRelaxCpuContext.task2 = &task2;
496
497 // task2 calls Sleep to become idle
498 SleepMs(2);
499
500 // task2 slept 2 ticks and became active again when became a tail of previously active task1
501 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2 after sleep");
502
503 // ISR calls OnSysTick (task1 = active, task2 = idle)
504 platform->ProcessTick();
505 CHECK_EQUAL_TEXT(active->SP, (size_t)task1.GetStack(), "expecting task1 after next tick");
506}
static void SleepMs(uint32_t ms)
Put calling process into a sleep state.
Definition stk_helper.h:311
static void SleepRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SleepRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::SleepMs(), SleepRelaxCpu(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [77/135]

stk::test::TEST ( KernelService ,
SleepRR  )

Definition at line 442 of file stktest_kernelservice.cpp.

443{
445}

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [78/135]

stk::test::TEST ( KernelService ,
SleepSWRR  )

Definition at line 447 of file stktest_kernelservice.cpp.

448{
450}

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [79/135]

stk::test::TEST ( KernelService ,
SleepUntilFP31  )

Definition at line 467 of file stktest_kernelservice.cpp.

468{
470}

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [80/135]

stk::test::TEST ( KernelService ,
SleepUntilMissDeadline  )

Definition at line 508 of file stktest_kernelservice.cpp.

509{
511 TaskMock<ACCESS_USER> task1, task2;
512 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
513 Stack *&active = platform->m_stack_active;
514
515 kernel.Initialize();
516 kernel.AddTask(&task1);
517 kernel.AddTask(&task2);
518 kernel.Start();
519
520 // on start Round-Robin selects the very first task
521 CHECK_EQUAL_TEXT(active->SP, (size_t)task1.GetStack(), "expecting task1");
522
523 // ISR calls OnSysTick (task1 = idle, task2 = active)
524 platform->ProcessTick();
525 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2");
526
529 g_SleepRelaxCpuContext.platform = platform;
530 g_SleepRelaxCpuContext.task1 = &task1;
531 g_SleepRelaxCpuContext.task2 = &task2;
532
533 Ticks now = GetTicks();
534
535 // task2 calls Sleep to become idle
536 SleepUntil(now);
537
538 CHECK_EQUAL(now, GetTicks());
539
540 // task2 is still active as it did not sleep
541 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2 after sleep");
542}
int64_t Ticks
Ticks value.
Definition stk_common.h:150

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SleepRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::GetTicks(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), SleepRelaxCpu(), stk::SleepUntil(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [81/135]

stk::test::TEST ( KernelService ,
SleepUntilRR  )

Definition at line 457 of file stktest_kernelservice.cpp.

458{
460}

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [82/135]

stk::test::TEST ( KernelService ,
SleepUntilSWRR  )

Definition at line 462 of file stktest_kernelservice.cpp.

463{
465}

References TestTaskSleep().

Here is the call graph for this function:

◆ TEST() [83/135]

stk::test::TEST ( KernelService ,
SwitchToNext  )

Definition at line 281 of file stktest_kernelservice.cpp.

282{
284 TaskMock<ACCESS_USER> task1, task2;
285 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
286 Stack *&active = platform->m_stack_active;
287
288 kernel.Initialize();
289 kernel.AddTask(&task1);
290 kernel.AddTask(&task2);
291 kernel.Start();
292
293 // task1 is scheduled first by RR
294 CHECK_EQUAL(active->SP, (size_t)task1.GetStack());
295
296 // ISR calls OnSysTick (task1 = idle, task2 = active)
297 platform->ProcessTick();
298 CHECK_EQUAL(active->SP, (size_t)task2.GetStack());
299
302 g_SwitchToNextRelaxCpuContext.platform = platform;
303 g_SwitchToNextRelaxCpuContext.task1 = &task1;
304 g_SwitchToNextRelaxCpuContext.task2 = &task2;
305
306 // task1 calls SwitchToNext (to test path: IKernelService::SwitchToNext -> IPlatform::SwitchToNext -> Kernel::SwitchToNext)
307 Yield();
308 CHECK_EQUAL(1, platform->m_switch_to_next_nr);
309
310 // task2 is active again
311 CHECK_EQUAL(active->SP, (size_t)task2.GetStack());
312
313 // task2 calls SwitchToNext
314 platform->EventTaskSwitch(active->SP);
315
316 // task1 calls SwitchToNext (task1 = active, task2 = idle)
317 platform->EventTaskSwitch(active->SP + 1); // add shift to test IsMemoryOfSP
318
319 // after a switch task 2 is active again
320 CHECK_EQUAL(active->SP, (size_t)task2.GetStack());
321}
static void SwitchToNextRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskSwitch(), g_RelaxCpuHandler, g_SwitchToNextRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_switch_to_next_nr, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), SwitchToNextRelaxCpu(), and stk::Yield().

Here is the call graph for this function:

◆ TEST() [84/135]

stk::test::TEST ( KernelService ,
SwitchToNextInactiveTask  )

Definition at line 323 of file stktest_kernelservice.cpp.

324{
326 TaskMock<ACCESS_USER> task1, task2;
327 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
328 Stack *&active = platform->m_stack_active;
329
330 kernel.Initialize();
331 kernel.AddTask(&task1);
332 kernel.AddTask(&task2);
333 kernel.Start();
334
335 // task1 is scheduled first by RR
336 CHECK_EQUAL(active->SP, (size_t)task1.GetStack());
337
338 // ISR calls OnSysTick (task1 = idle, task2 = active)
339 platform->ProcessTick();
340 CHECK_EQUAL(active->SP, (size_t)task2.GetStack());
341
344 g_SwitchToNextRelaxCpuContext.platform = platform;
345 g_SwitchToNextRelaxCpuContext.task1 = nullptr;
346 g_SwitchToNextRelaxCpuContext.task2 = nullptr;
347
348 platform->EventTaskSwitch(platform->m_stack_idle->SP + 1); // add shift to test IsMemoryOfSP
349}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskSwitch(), g_RelaxCpuHandler, g_SwitchToNextRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_stack_idle, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and SwitchToNextRelaxCpu().

Here is the call graph for this function:

◆ TEST() [85/135]

stk::test::TEST ( KernelServiceIsrSafety ,
Common  )

Definition at line 682 of file stktest_kernelservice.cpp.

683{
686
687 kernel.Initialize();
688 kernel.AddTask(&task);
689 kernel.Start();
690
691 g_DelayContext.platform = kernel.GetPlatform();
692
693 try
694 {
695 g_TestContext.ExpectAssert(true);
696 Sleep(10);
697 CHECK_TEXT(false, "Sleep is not allowed inside ISR");
698 }
699 catch (TestAssertPassed &pass)
700 {
701 CHECK(true);
703 }
704
705 try
706 {
708 SleepUntil(GetTicks() + 10);
709 CHECK_TEXT(false, "SleepUntil is not allowed inside ISR");
710 }
711 catch (TestAssertPassed &pass)
712 {
713 CHECK(true);
714 g_TestContext.ExpectAssert(false);
715 }
716
717 try
718 {
719 g_TestContext.ExpectAssert(true);
720 Delay(10);
721 CHECK_TEXT(false, "Delay is not allowed inside ISR");
722 }
723 catch (TestAssertPassed &pass)
724 {
725 CHECK(true);
726 g_TestContext.ExpectAssert(false);
727 }
728
729 try
730 {
731 g_TestContext.ExpectAssert(true);
732 Yield();
733 CHECK_TEXT(false, "Yield is not allowed inside ISR");
734 }
735 catch (TestAssertPassed &pass)
736 {
737 CHECK(true);
738 g_TestContext.ExpectAssert(false);
739 }
740
741 try
742 {
743 g_TestContext.ExpectAssert(true);
744 GetTid();
745 CHECK_TEXT(false, "GetTid is not allowed inside ISR");
746 }
747 catch (TestAssertPassed &pass)
748 {
749 CHECK(true);
750 g_TestContext.ExpectAssert(false);
751 }
752}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Delay(), g_DelayContext, g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTicks(), stk::GetTid(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Sleep(), stk::SleepUntil(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), and stk::Yield().

Here is the call graph for this function:

◆ TEST() [86/135]

stk::test::TEST ( PeriodicTrigger ,
AccumulatesAcrossMultiplePolls  )

Definition at line 122 of file stktest_time.cpp.

123{
124 time::PeriodicTrigger trigger(PERIOD, true);
125
127 CHECK_FALSE(trigger.Poll());
128
130 CHECK_FALSE(trigger.Poll());
131
133 CHECK_TRUE(trigger.Poll()); // Total 110ms accumulated
134}
void SetTimeNowMsec(int64_t now)
Lightweight periodic trigger: returns true once per configured period when polled.

References stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [87/135]

stk::test::TEST ( PeriodicTrigger ,
DoesNotFireBeforePeriod  )

Definition at line 83 of file stktest_time.cpp.

84{
85 time::PeriodicTrigger trigger(PERIOD, true);
86
88 CHECK_FALSE(trigger.Poll());
89}

References stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [88/135]

stk::test::TEST ( PeriodicTrigger ,
FiresAtExactPeriod  )

Definition at line 91 of file stktest_time.cpp.

92{
93 time::PeriodicTrigger trigger(PERIOD, true);
94
96 CHECK_TRUE(trigger.Poll());
97}

References stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [89/135]

stk::test::TEST ( PeriodicTrigger ,
ManualResetSyncsToCurrentTime  )

Definition at line 136 of file stktest_time.cpp.

137{
138 time::PeriodicTrigger trigger(PERIOD, true);
139
141 CHECK_FALSE(trigger.Poll()); // Accumulated 80ms
142
143 // Re-constructing or manually resetting m_prev/m_elapsed
144 // allows a "hard reset" to the current mock time.
145 trigger = time::PeriodicTrigger(PERIOD, true);
146
148 // Delta is only 70ms (150 - 80) since m_prev was set to 80 during reset/re-init.
149 CHECK_FALSE(trigger.Poll());
150}

References stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [90/135]

stk::test::TEST ( PeriodicTrigger ,
MustBeArmed  )

Definition at line 64 of file stktest_time.cpp.

65{
66 time::PeriodicTrigger trigger(PERIOD, false);
67
69
70 try
71 {
72 g_TestContext.ExpectAssert(true);
73 CHECK_FALSE(trigger.Poll());
74 CHECK_TRUE(false); // Poll() must fail
75 }
76 catch (TestAssertPassed &pass)
77 {
78 CHECK(true);
80 }
81}

References g_TestContext, stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [91/135]

stk::test::TEST ( PeriodicTrigger ,
PreservesRemainderAfterFire  )

Definition at line 99 of file stktest_time.cpp.

100{
101 time::PeriodicTrigger trigger(PERIOD, true);
102
103 // 1. Move to 150ms.
104 // m_elapsed becomes 150. Poll() returns true.
105 // m_elapsed becomes 150 - 100 = 50ms (the remainder).
107 CHECK_TRUE(trigger.Poll());
108
109 // 2. Move to 190ms.
110 // Time delta is 40ms (190 - 150).
111 // m_elapsed = 50 (remainder) + 40 (delta) = 90ms.
113 CHECK_FALSE(trigger.Poll());
114
115 // 3. Move to 205ms.
116 // Time delta is 15ms (205 - 190).
117 // m_elapsed = 90 + 15 = 105ms. Fires!
119 CHECK_TRUE(trigger.Poll());
120}

References stk::time::PeriodicTrigger::Poll(), stk::test::stk::SetTimeNowMsec(), and TEST().

Here is the call graph for this function:

◆ TEST() [92/135]

stk::test::TEST ( StackMemoryWrapper ,
GetStack  )

Definition at line 142 of file stktest_misc.cpp.

143{
145 StackMemoryWrapper<STACK_SIZE_MIN> wrapper(&memory);
146
147 CHECK_TRUE(NULL != wrapper.GetStack());
148 CHECK_EQUAL((size_t *)&memory, wrapper.GetStack());
149}
Adapts an externally-owned stack memory array to the IStackMemory interface.
Definition stk_helper.h:174
StackMemoryDef< _StackSize >::Type MemoryType
The concrete array type that this wrapper accepts, equivalent to StackMemoryDef<_StackSize>::Type.
Definition stk_helper.h:179

References stk::StackMemoryWrapper< _StackSize >::GetStack().

Here is the call graph for this function:

◆ TEST() [93/135]

stk::test::TEST ( StackMemoryWrapper ,
GetStackSize  )

Definition at line 151 of file stktest_misc.cpp.

152{
154 StackMemoryWrapper<STACK_SIZE_MIN> wrapper(&memory);
155
156 CHECK_EQUAL(STACK_SIZE_MIN, wrapper.GetStackSize());
157 CHECK_EQUAL(sizeof(memory) / sizeof(size_t), wrapper.GetStackSize());
158}
@ 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

References stk::StackMemoryWrapper< _StackSize >::GetStackSize(), and stk::STACK_SIZE_MIN.

Here is the call graph for this function:

◆ TEST() [94/135]

stk::test::TEST ( StackMemoryWrapper ,
GetStackSizeBytes  )

Definition at line 160 of file stktest_misc.cpp.

161{
163 StackMemoryWrapper<STACK_SIZE_MIN> wrapper(&memory);
164
165 CHECK_EQUAL(STACK_SIZE_MIN * sizeof(size_t), wrapper.GetStackSizeBytes());
166 CHECK_EQUAL(sizeof(memory), wrapper.GetStackSizeBytes());
167}

References stk::StackMemoryWrapper< _StackSize >::GetStackSizeBytes(), and stk::STACK_SIZE_MIN.

Here is the call graph for this function:

◆ TEST() [95/135]

stk::test::TEST ( SwitchStrategyEDF ,
Algorithm  )

Definition at line 124 of file stktest_switchstrategyedf.cpp.

125{
127 TaskMock<ACCESS_USER> task1, task2, task3;
128 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
129
130 kernel.Initialize();
131
132 // --- Stage 1: Add first task -----------------------------------------
133
134 kernel.AddTask(&task1, 300, 300, 0);
135
136 IKernelTask *next = strategy->GetFirst();
137
138 // Single task -> always returned
139 for (int32_t i = 0; i < 5; i++)
140 {
141 next = strategy->GetNext();
142 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "single task must always be selected");
143 }
144
145 // --- Stage 2: Add second task ----------------------------------------
146
147 kernel.AddTask(&task2, 200, 200, 0); // earlier deadline than task1
148
149 // EDF must pick the task with earliest relative deadline
150 next = strategy->GetNext();
151 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 with earlier deadline should preempt task1");
152
153 // Still highest-priority task keeps running until removed or asleep
154 next = strategy->GetNext();
155 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 remains earliest-deadline task");
156
157 // --- Stage 3: Add third task -----------------------------------------
158
159 kernel.AddTask(&task3, 100, 100, 0); // earliest deadline
160
161 next = strategy->GetNext();
162 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "task3 with earliest deadline should run first");
163
164 next = strategy->GetNext();
165 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "task3 continues to run as earliest-deadline task");
166
167 // --- Stage 4: Remove tasks -------------------------------------------
168
169 kernel.RemoveTask(&task3);
170
171 next = strategy->GetNext();
172 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 becomes earliest-deadline after task3 removal");
173
174 next = strategy->GetNext();
175 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 continues as earliest-deadline task");
176
177 kernel.RemoveTask(&task2);
178
179 next = strategy->GetNext();
180 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "task1 remains as only task");
181}
virtual IKernelTask * GetNext()=0
Advance the internal iterator and return the next runnable task.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [96/135]

stk::test::TEST ( SwitchStrategyEDF ,
DynamicScheduling  )

Definition at line 285 of file stktest_switchstrategyedf.cpp.

286{
288 TaskMock<ACCESS_USER> task1, task2, task3;
289 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
290
291 kernel.Initialize();
292
293 // Add periodic tasks: (periodicity, deadline, start_delay)
294 kernel.AddTask(&task1, 4, 4, 0); // task1: period 5
295 kernel.AddTask(&task2, 3, 3, 0); // task2: period 3
296 kernel.AddTask(&task3, 2, 2, 0); // task3: period 2
297
298 kernel.Start();
299
300 g_EDFDynamicSchedulingContext.platform = platform;
301 g_EDFDynamicSchedulingContext.task1 = &task1;
302 g_EDFDynamicSchedulingContext.task2 = &task2;
303 g_EDFDynamicSchedulingContext.task3 = &task3;
305
306 // simulate ticks
308
309 CHECK_EQUAL_TEXT(3, g_EDFDynamicSchedulingContext.checked, "all 3 tasks must be switched");
310 CHECK_FALSE(platform->m_hard_fault);
311 CHECK_EQUAL(0, task1.m_deadline_missed);
312 CHECK_EQUAL(0, task2.m_deadline_missed);
313 CHECK_EQUAL(0, task3.m_deadline_missed);
314}
static void g_EDFDynamicSchedulingContextProcess()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_EDFDynamicSchedulingContext, g_EDFDynamicSchedulingContextProcess(), g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::TaskMock< _AccessMode >::m_deadline_missed, stk::test::PlatformTestMock::m_hard_fault, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [97/135]

stk::test::TEST ( SwitchStrategyEDF ,
GetFirstEmpty  )

Definition at line 29 of file stktest_switchstrategyedf.cpp.

30{
32
33 try
34 {
35 g_TestContext.ExpectAssert(true);
36 rr.GetFirst();
37 CHECK_TEXT(false, "expecting assertion when empty");
38 }
39 catch (TestAssertPassed &pass)
40 {
41 CHECK(true);
43 }
44}
Earliest Deadline First (EDF) scheduling strategy: always selects the runnable task with the least ti...
IKernelTask * GetFirst() const
Get first task in the managed set (used by the kernel for initial scheduling).

References g_TestContext, and stk::SwitchStrategyEDF::GetFirst().

Here is the call graph for this function:

◆ TEST() [98/135]

stk::test::TEST ( SwitchStrategyEDF ,
GetNextEmpty  )

Definition at line 46 of file stktest_switchstrategyedf.cpp.

47{
50 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
51
52 kernel.Initialize();
53
54 kernel.AddTask(&task1);
55 kernel.RemoveTask(&task1);
56 CHECK_EQUAL(0, strategy->GetSize());
57
58 // expect to return NULL which puts core into a sleep mode, current is ignored by this strategy
59 CHECK_EQUAL(0, strategy->GetNext());
60}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetNext(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [99/135]

stk::test::TEST ( SwitchStrategyEDF ,
OnTaskDeadlineMissedNotSupported  )

Definition at line 62 of file stktest_switchstrategyedf.cpp.

63{
66 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
67
68 kernel.Initialize();
69 kernel.AddTask(&task1);
70
71 try
72 {
73 g_TestContext.ExpectAssert(true);
74 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
75 CHECK_TEXT(false, "expecting assertion - OnTaskDeadlineMissed not supported");
76 }
77 catch (TestAssertPassed &pass)
78 {
79 CHECK(true);
81 }
82
83 // we need this workaround to pass 100% coverage test by blocking the exception
86 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
87}
virtual bool OnTaskDeadlineMissed(IKernelTask *task)=0
Notification that a task has exceeded its HRT deadline; returns whether the strategy can recover with...

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::ITaskSwitchStrategy::OnTaskDeadlineMissed().

Here is the call graph for this function:

◆ TEST() [100/135]

stk::test::TEST ( SwitchStrategyEDF ,
PriorityNext  )

Definition at line 89 of file stktest_switchstrategyedf.cpp.

90{
92 TaskMock<ACCESS_USER> task1, task2, task3;
93 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
94
95 kernel.Initialize();
96
97 // periodicity, deadline, start_delay
98 kernel.AddTask(&task1, 300, 300, 0); // latest deadline
99 kernel.AddTask(&task2, 200, 200, 0);
100 kernel.AddTask(&task3, 100, 100, 0); // earliest deadline
101
102 // EDF must select the task with the earliest relative deadline
103 IKernelTask *next = strategy->GetNext();
104
105 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "EDF must select task with earliest relative deadline");
106
107 // Repeated GetNext must still select the same task
108 next = strategy->GetNext();
109 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "EDF must continue selecting earliest-deadline task");
110
111 // Remove earliest-deadline task
112 kernel.RemoveTask(&task3);
113
114 next = strategy->GetNext();
115 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "after removal, task2 has earliest relative deadline");
116
117 // Remove next earliest
118 kernel.RemoveTask(&task2);
119
120 next = strategy->GetNext();
121 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "only remaining task must be selected");
122}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [101/135]

stk::test::TEST ( SwitchStrategyEDF ,
RelativeDeadlineEvolution  )

Definition at line 183 of file stktest_switchstrategyedf.cpp.

184{
187 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
188
189 kernel.Initialize();
190
191 // period = 10, deadline = 5, start_delay = 0
192 kernel.AddTask(&task, 10, 5, 0);
193
194 kernel.Start();
195
196 // Obtain kernel task
197 IKernelTask *ktask = kernel.GetSwitchStrategy()->GetFirst();
198 CHECK_TRUE_TEXT(ktask != nullptr, "Kernel task must exist");
199
200 // --- At release -------------------------------------------------------
201
202 // duration = 0
203 // relative_deadline = deadline
204 CHECK_EQUAL_TEXT(5, ktask->GetHrtRelativeDeadline(), "at release: relative deadline must equal deadline");
205
206 // --- Tick 1 -----------------------------------------------------------
207
208 platform->ProcessTick(); // duration = 1
209 CHECK_EQUAL_TEXT(4, ktask->GetHrtRelativeDeadline(), "after 1 tick: relative deadline must decrease by 1");
210
211 // --- Tick 2 -----------------------------------------------------------
212
213 platform->ProcessTick(); // duration = 2
214 CHECK_EQUAL_TEXT(3, ktask->GetHrtRelativeDeadline(), "after 2 ticks: relative deadline must decrease by 2");
215
216 // --- Tick 3 -----------------------------------------------------------
217
218 platform->ProcessTick(); // duration = 3
219 CHECK_EQUAL_TEXT(2, ktask->GetHrtRelativeDeadline(), "after 3 ticks: relative deadline must decrease by 3");
220
221 // --- Tick 4 -----------------------------------------------------------
222
223 platform->ProcessTick(); // duration = 4
224 CHECK_EQUAL_TEXT(1, ktask->GetHrtRelativeDeadline(), "after 4 ticks: relative deadline must be 1");
225
226 // --- Tick 5 (deadline boundary) --------------------------------------
227
228 platform->ProcessTick(); // duration = 5
229 CHECK_EQUAL_TEXT(0, ktask->GetHrtRelativeDeadline(), "at deadline: relative deadline must be zero");
230}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::IKernelTask::GetHrtRelativeDeadline(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [102/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
Algorithm  )

Definition at line 127 of file stktest_switchstrategyfpriority.cpp.

128{
129 // Create kernel with 3 tasks
131 TaskMock<ACCESS_USER> task1, task2, task3;
132
133 kernel.Initialize();
134
135 // Add tasks
136 kernel.AddTask(&task1);
137
138 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
139
140 IKernelTask *next = strategy->GetFirst();
141
142 // --- Stage 1: 1 task only ---------------------------------------------
143
144 // Always returns the same task
145 for (int32_t i = 0; i < 5; i++)
146 {
147 next = strategy->GetNext();
148 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Single task must always be selected");
149 }
150
151 // --- Stage 2: add second task -----------------------------------------
152
153 kernel.AddTask(&task2);
154
155 next = strategy->GetNext(); // should still return task1 as task2 will be scheduled after this call
156 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should be task1");
157 next = strategy->GetNext(); // should return task2
158 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Next task should be task2");
159 next = strategy->GetNext(); // should wrap around to task1
160 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should wrap to task1");
161
162 // --- Stage 3: add third task ------------------------------------------
163
164 kernel.AddTask(&task3);
165
166 // Expected sequence: task1 -> task2 -> task3 -> task1 ...
167 next = strategy->GetNext(); // task2
168 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Next task should be task2");
169 next = strategy->GetNext(); // task3
170 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should be task3");
171 next = strategy->GetNext(); // task1
172 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should wrap to task1");
173
174 // --- Stage 4: remove a task -------------------------------------------
175
176 kernel.RemoveTask(&task2);
177
178 // Expected sequence: task1 -> task3 -> task1 -> task3 ...
179 next = strategy->GetNext(); // task3
180 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should be task3 after removal");
181 next = strategy->GetNext(); // task1
182 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should be task1 after removal");
183 next = strategy->GetNext(); // task3
184 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should wrap to task3");
185}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [103/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
EndlessNext  )

Definition at line 89 of file stktest_switchstrategyfpriority.cpp.

90{
92 TaskMock<ACCESS_USER> task1, task2, task3;
93 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
94
95 kernel.Initialize();
96 kernel.AddTask(&task1);
97 kernel.AddTask(&task2);
98 kernel.AddTask(&task3);
99
100 IKernelTask *first = strategy->GetFirst();
101 CHECK_EQUAL_TEXT(&task1, first->GetUserTask(), "expecting first task1");
102
103 IKernelTask *next = strategy->GetNext();
104 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1");
105
106 next = strategy->GetNext();
107 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "expecting next task2");
108
109 next = strategy->GetNext();
110 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "expecting next task3");
111
112 next = strategy->GetNext();
113 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1 again (endless looping)");
114
115 next = strategy->GetNext();
116 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "expecting next task2 again (endless looping)");
117
118 kernel.RemoveTask(&task2);
119
120 next = strategy->GetNext();
121 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "expecting next task3 again (endless looping)");
122
123 next = strategy->GetNext();
124 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1 again (endless looping)");
125}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [104/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
GetFirstEmpty  )

Definition at line 29 of file stktest_switchstrategyfpriority.cpp.

30{
32
33 try
34 {
35 g_TestContext.ExpectAssert(true);
36 rr.GetFirst();
37 CHECK_TEXT(false, "expecting assertion when empty");
38 }
39 catch (TestAssertPassed &pass)
40 {
41 CHECK(true);
43 }
44}
SwitchStrategyFixedPriority< 32 > SwitchStrategyFP32
Shorthand alias for SwitchStrategyFixedPriority<32>: 32 priority levels (0..31), using a single 32-bi...
IKernelTask * GetFirst() const
Get the first task in the managed set (used by the kernel for initial scheduling).

References g_TestContext, and stk::SwitchStrategyFixedPriority< MAX_PRIORITIES >::GetFirst().

Here is the call graph for this function:

◆ TEST() [105/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
GetNextEmpty  )

Definition at line 46 of file stktest_switchstrategyfpriority.cpp.

47{
50 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
51
52 kernel.Initialize();
53
54 kernel.AddTask(&task1);
55 kernel.RemoveTask(&task1);
56 CHECK_EQUAL(0, strategy->GetSize());
57
58 // expect to return NULL which puts core into a sleep mode, current is ignored by this strategy
59 CHECK_EQUAL(0, strategy->GetNext());
60}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetNext(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [106/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
OnTaskDeadlineMissedNotSupported  )

Definition at line 62 of file stktest_switchstrategyfpriority.cpp.

63{
66 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
67
68 kernel.Initialize();
69 kernel.AddTask(&task1);
70
71 try
72 {
73 g_TestContext.ExpectAssert(true);
74 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
75 CHECK_TEXT(false, "expecting assertion - OnTaskDeadlineMissed not supported");
76 }
77 catch (TestAssertPassed &pass)
78 {
79 CHECK(true);
81 }
82
83 // we need this workaround to pass 100% coverage test by blocking the exception
86 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
87}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::ITaskSwitchStrategy::OnTaskDeadlineMissed().

Here is the call graph for this function:

◆ TEST() [107/135]

stk::test::TEST ( SwitchStrategyFixedPriority ,
Priority  )

Definition at line 234 of file stktest_switchstrategyfpriority.cpp.

235{
237 TaskMockW<1, ACCESS_USER> task1; // low priority
238 TaskMockW<2, ACCESS_USER> task2; // high priority
239 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
240 Stack *&active = platform->m_stack_active;
241
242 kernel.Initialize();
243 kernel.AddTask(&task1);
244 kernel.AddTask(&task2);
245 kernel.Start();
246
247 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting high-priority task2 on start");
248
249 platform->ProcessTick();
250 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2");
251
254 g_PrioritySleepRelaxCpuContext.platform = platform;
255 g_PrioritySleepRelaxCpuContext.task1 = &task1;
256 g_PrioritySleepRelaxCpuContext.task2 = &task2;
257
258 // task2 calls Sleep to become idle
259 Sleep(2);
260
261 // task2 is active again
262 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting high-priority task2 again after it slept");
263
264 // ISR calls OnSysTick, higher priority task2 is scheduled
265 platform->ProcessTick();
266 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting high-priority task2 again");
267
268 g_RelaxCpuHandler = NULL;
269}
Task mock for SwitchStrategySmoothWeightedRoundRobin and similar algorithms.
Definition stktest.h:357

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_PrioritySleepRelaxCpuContext, g_RelaxCpuHandler, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, PrioritySleepRelaxCpu(), stk::test::PlatformTestMock::ProcessTick(), stk::Sleep(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [108/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
AlgorithmDM  )

Definition at line 245 of file stktest_switchstrategymonotonic.cpp.

References TestAlgorithm().

Here is the call graph for this function:

◆ TEST() [109/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
AlgorithmRM  )

Definition at line 240 of file stktest_switchstrategymonotonic.cpp.

References TestAlgorithm().

Here is the call graph for this function:

◆ TEST() [110/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
FailedWCRT  )

Definition at line 250 of file stktest_switchstrategymonotonic.cpp.

251{
253 TaskMock<ACCESS_USER> task1, task2;
254 const SwitchStrategyRM *strategy = static_cast<const SwitchStrategyRM *>(kernel.GetSwitchStrategy());
255
256 kernel.Initialize();
257
258 // Overload CPU: C/T > RMUB
259 kernel.AddTask(&task1, 50, 50, 0); // 100% CPU
260 kernel.AddTask(&task2, 60, 30, 0); // additional load
261
262 auto result = SchedulabilityCheck::IsSchedulableWCRT<2>(strategy);
263
264 CHECK_EQUAL(100, result.info[0].cpu_load.total);
265 CHECK_EQUAL(150, result.info[1].cpu_load.total);
266
267 CHECK_FALSE_TEXT(result, "Task set should be unschedulable according to WCRT");
268}
SwitchStrategyMonotonic< MSS_TYPE_RATE > SwitchStrategyRM
Shorthand alias for SwitchStrategyMonotonic<MSS_TYPE_RATE>: Rate-Monotonic scheduling (shorter schedu...
static SchedulabilityCheckResult< _TaskCount > IsSchedulableWCRT(const ITaskSwitchStrategy *strategy)
Perform WCRT schedulability analysis on the task set registered with strategy.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::SchedulabilityCheck::IsSchedulableWCRT().

Here is the call graph for this function:

◆ TEST() [111/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
GetFirstEmpty  )

Definition at line 29 of file stktest_switchstrategymonotonic.cpp.

30{
32
33 try
34 {
35 g_TestContext.ExpectAssert(true);
36 rr.GetFirst();
37 CHECK_TEXT(false, "expecting assertion when empty");
38 }
39 catch (TestAssertPassed &pass)
40 {
41 CHECK(true);
43 }
44}
IKernelTask * GetFirst() const
Get the first task in the managed set (used by the kernel for initial scheduling).

References g_TestContext, and stk::SwitchStrategyMonotonic< _Type >::GetFirst().

Here is the call graph for this function:

◆ TEST() [112/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
GetNextEmpty  )

Definition at line 113 of file stktest_switchstrategymonotonic.cpp.

114{
117 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
118
119 kernel.Initialize();
120
121 kernel.AddTask(&task1);
122 kernel.RemoveTask(&task1);
123 CHECK_EQUAL(0, strategy->GetSize());
124
125 try
126 {
127 g_TestContext.ExpectAssert(true);
128 strategy->GetNext();
129 CHECK_TEXT(false, "expecting assertion when empty");
130 }
131 catch (TestAssertPassed &pass)
132 {
133 CHECK(true);
135 }
136}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetNext(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [113/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
OnTaskDeadlineMissedNotSupported  )

Definition at line 86 of file stktest_switchstrategymonotonic.cpp.

87{
90 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
91
92 kernel.Initialize();
93 kernel.AddTask(&task1);
94
95 try
96 {
97 g_TestContext.ExpectAssert(true);
98 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
99 CHECK_TEXT(false, "expecting assertion - OnTaskDeadlineMissed not supported");
100 }
101 catch (TestAssertPassed &pass)
102 {
103 CHECK(true);
105 }
106
107 // we need this workaround to pass 100% coverage test by blocking the exception
110 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
111}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::ITaskSwitchStrategy::OnTaskDeadlineMissed().

Here is the call graph for this function:

◆ TEST() [114/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
PriorityNextDM  )

Definition at line 177 of file stktest_switchstrategymonotonic.cpp.

References TestPriorityNext().

Here is the call graph for this function:

◆ TEST() [115/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
PriorityNextRM  )

Definition at line 172 of file stktest_switchstrategymonotonic.cpp.

References TestPriorityNext().

Here is the call graph for this function:

◆ TEST() [116/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
SchedulableWCRT  )

Definition at line 270 of file stktest_switchstrategymonotonic.cpp.

271{
273 TaskMock<ACCESS_USER> task1, task2, task3, task4;
274 const SwitchStrategyRM *strategy = static_cast<const SwitchStrategyRM *>(kernel.GetSwitchStrategy());
275
276 kernel.Initialize();
277
278 // --- Stage 1: Schedulable tasks ---------------------------------------
279
280 // Task parameters: T = task period, C = execution time
281 kernel.AddTask(&task1, 40, 20, 0); // task1: C=20, T=40
282 kernel.AddTask(&task2, 100, 30, 0); // task2: C=30, T=100
283 kernel.AddTask(&task3, 200, 10, 0); // task3: C=10, T=200
284
285 auto result = SchedulabilityCheck::IsSchedulableWCRT<3>(strategy);
286 CHECK_TEXT(result, "Task set should be schedulable according to WCRT");
287
288 CHECK_EQUAL(50, result.info[0].cpu_load.total);
289 CHECK_EQUAL(80, result.info[1].cpu_load.total);
290 CHECK_EQUAL(85, result.info[2].cpu_load.total);
291}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::SchedulabilityCheck::IsSchedulableWCRT().

Here is the call graph for this function:

◆ TEST() [117/135]

stk::test::TEST ( SwitchStrategyMonotonic ,
SleepNotSupported  )

Definition at line 46 of file stktest_switchstrategymonotonic.cpp.

47{
50 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
51
52 kernel.Initialize();
53 kernel.AddTask(&task1);
54
55 try
56 {
57 g_TestContext.ExpectAssert(true);
58 strategy->OnTaskSleep(strategy->GetFirst());
59 CHECK_TEXT(false, "expecting assertion - OnTaskSleep not supported");
60 }
61 catch (TestAssertPassed &pass)
62 {
63 CHECK(true);
65 }
66
67 try
68 {
70 strategy->OnTaskWake(strategy->GetFirst());
71 CHECK_TEXT(false, "expecting assertion - OnTaskWake not supported");
72 }
73 catch (TestAssertPassed &pass)
74 {
75 CHECK(true);
76 g_TestContext.ExpectAssert(false);
77 }
78
79 // we need this workaround to pass 100% coverage test by blocking the exception
80 g_TestContext.ExpectAssert(true);
81 g_TestContext.RethrowAssertException(false);
82 strategy->OnTaskSleep(strategy->GetFirst());
83 strategy->OnTaskWake(strategy->GetFirst());
84}
virtual void OnTaskSleep(IKernelTask *task)=0
Notification that a task has entered sleep/blocked state.
virtual void OnTaskWake(IKernelTask *task)=0
Notification that a task is becoming runnable again.

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::ITaskSwitchStrategy::OnTaskSleep(), and stk::ITaskSwitchStrategy::OnTaskWake().

Here is the call graph for this function:

◆ TEST() [118/135]

stk::test::TEST ( SwitchStrategyRoundRobin ,
Algorithm  )

Definition at line 127 of file stktest_switchstrategyroundrobin.cpp.

128{
129 // Create kernel with 3 tasks
131 TaskMock<ACCESS_USER> task1, task2, task3;
132
133 kernel.Initialize();
134
135 // Add tasks
136 kernel.AddTask(&task1);
137
138 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
139
140 IKernelTask *next = strategy->GetFirst();
141
142 // --- Stage 1: 1 task only ---------------------------------------------
143
144 // Always returns the same task
145 for (int32_t i = 0; i < 5; i++)
146 {
147 next = strategy->GetNext();
148 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Single task must always be selected");
149 }
150
151 // --- Stage 2: add second task -----------------------------------------
152
153 kernel.AddTask(&task2);
154
155 next = strategy->GetNext(); // should still return task1 as task2 will be scheduled after this call
156 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should be task1");
157 next = strategy->GetNext(); // should return task2
158 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Next task should be task2");
159 next = strategy->GetNext(); // should wrap around to task1
160 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should wrap to task1");
161
162 // --- Stage 3: add third task ------------------------------------------
163
164 kernel.AddTask(&task3);
165
166 // Expected sequence: task1 -> task2 -> task3 -> task1 ...
167 next = strategy->GetNext(); // task2
168 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Next task should be task2");
169 next = strategy->GetNext(); // task3
170 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should be task3");
171 next = strategy->GetNext(); // task1
172 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should wrap to task1");
173
174 // --- Stage 4: remove a task -------------------------------------------
175
176 kernel.RemoveTask(&task2);
177
178 // Expected sequence: task1 -> task3 -> task1 -> task3 ...
179 next = strategy->GetNext(); // task3
180 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should be task3 after removal");
181 next = strategy->GetNext(); // task1
182 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Next task should be task1 after removal");
183 next = strategy->GetNext(); // task3
184 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Next task should wrap to task3");
185}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [119/135]

stk::test::TEST ( SwitchStrategyRoundRobin ,
EndlessNext  )

Definition at line 89 of file stktest_switchstrategyroundrobin.cpp.

90{
92 TaskMock<ACCESS_USER> task1, task2, task3;
93 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
94
95 kernel.Initialize();
96 kernel.AddTask(&task1);
97 kernel.AddTask(&task2);
98 kernel.AddTask(&task3);
99
100 IKernelTask *first = strategy->GetFirst();
101 CHECK_EQUAL_TEXT(&task1, first->GetUserTask(), "expecting first task1");
102
103 IKernelTask *next = strategy->GetNext();
104 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1");
105
106 next = strategy->GetNext();
107 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "expecting next task2");
108
109 next = strategy->GetNext();
110 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "expecting next task3");
111
112 next = strategy->GetNext();
113 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1 again (endless looping)");
114
115 next = strategy->GetNext();
116 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "expecting next task2 again (endless looping)");
117
118 kernel.RemoveTask(&task2);
119
120 next = strategy->GetNext();
121 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "expecting next task3 again (endless looping)");
122
123 next = strategy->GetNext();
124 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "expecting next task1 again (endless looping)");
125}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [120/135]

stk::test::TEST ( SwitchStrategyRoundRobin ,
GetFirstEmpty  )

Definition at line 29 of file stktest_switchstrategyroundrobin.cpp.

30{
32
33 try
34 {
35 g_TestContext.ExpectAssert(true);
36 rr.GetFirst();
37 CHECK_TEXT(false, "expecting assertion when empty");
38 }
39 catch (TestAssertPassed &pass)
40 {
41 CHECK(true);
43 }
44}
SwitchStrategyRoundRobin SwitchStrategyRR
Shorthand alias for SwitchStrategyRoundRobin.
IKernelTask * GetFirst() const
Get first task in the managed set (used by the kernel for initial scheduling).

References g_TestContext, and stk::SwitchStrategyRoundRobin::GetFirst().

Here is the call graph for this function:

◆ TEST() [121/135]

stk::test::TEST ( SwitchStrategyRoundRobin ,
GetNextEmpty  )

Definition at line 46 of file stktest_switchstrategyroundrobin.cpp.

47{
50 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
51
52 kernel.Initialize();
53
54 kernel.AddTask(&task1);
55 kernel.RemoveTask(&task1);
56 CHECK_EQUAL(0, strategy->GetSize());
57
58 // expect to return NULL which puts core into a sleep mode, current is ignored by this strategy
59 CHECK_EQUAL(0, strategy->GetNext());
60}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetNext(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [122/135]

stk::test::TEST ( SwitchStrategyRoundRobin ,
OnTaskDeadlineMissedNotSupported  )

Definition at line 62 of file stktest_switchstrategyroundrobin.cpp.

63{
66 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
67
68 kernel.Initialize();
69 kernel.AddTask(&task1);
70
71 try
72 {
73 g_TestContext.ExpectAssert(true);
74 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
75 CHECK_TEXT(false, "expecting assertion - OnTaskDeadlineMissed not supported");
76 }
77 catch (TestAssertPassed &pass)
78 {
79 CHECK(true);
81 }
82
83 // we need this workaround to pass 100% coverage test by blocking the exception
86 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
87}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::ITaskSwitchStrategy::OnTaskDeadlineMissed().

Here is the call graph for this function:

◆ TEST() [123/135]

stk::test::TEST ( SwitchStrategySWRoundRobin ,
Algorithm  )

Definition at line 160 of file stktest_switchstrategyswroundrobin.cpp.

161{
163 TaskMockW<1, ACCESS_USER> task1; // weight 1
164 TaskMockW<2, ACCESS_USER> task2; // weight 2
165 TaskMockW<3, ACCESS_USER> task3; // weight 3
166
167 kernel.Initialize();
168 kernel.AddTask(&task1);
169 kernel.AddTask(&task2);
170 kernel.AddTask(&task3);
171
172 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
173 IKernelTask *next = strategy->GetFirst();
174
175 // scheduling stats
176 int32_t count1 = 0, count2 = 0, count3 = 0;
177
178 // Run enough steps to reach stable proportions
179 const int32_t steps = 120; // increased steps for better statistical stability
180 for (int32_t i = 0; i < steps; i++)
181 {
182 next = strategy->GetNext();
183
184 if (next->GetUserTask() == &task1) ++count1;
185 else if (next->GetUserTask() == &task2) ++count2;
186 else if (next->GetUserTask() == &task3) ++count3;
187 else CHECK_TEXT(false, "Unknown task selected");
188 }
189
190 const int32_t w1 = 1, w2 = 2, w3 = 3;
191 const int32_t total_w = w1 + w2 + w3;
192
193 const int32_t exp1 = (steps * w1) / total_w; // integer expected counts
194 const int32_t exp2 = (steps * w2) / total_w;
195 const int32_t exp3 = steps - exp1 - exp2; // ensure sum == steps
196
197 // Relative tolerance (fraction). 25% is conservative for small sample sizes.
198 const float tol_frac = 0.25f;
199
200 auto within_tol = [&](int expected, int actual, float frac) -> bool
201 {
202 int tol = (int)(expected * frac) + 1; // +1 to avoid zero tolerance for small expected
203 int diff = expected > actual ? expected - actual : actual - expected;
204 return diff <= tol;
205 };
206
207 CHECK_TRUE_TEXT(within_tol(exp1, count1, tol_frac), "Task1 proportion off (weight 1)");
208 CHECK_TRUE_TEXT(within_tol(exp2, count2, tol_frac), "Task2 proportion off (weight 2)");
209 CHECK_TRUE_TEXT(within_tol(exp3, count3, tol_frac), "Task3 proportion off (weight 3)");
210
211 // Validate non-starvation: each must get at least one selection
212 CHECK_TEXT(count1 > 0, "Task1 must run at least once");
213 CHECK_TEXT(count2 > 0, "Task2 must run at least once");
214 CHECK_TEXT(count3 > 0, "Task3 must run at least once");
215
216 // Remove highest-weight task, check proportions adjust to 1:2
217 kernel.RemoveTask(&task3);
218
219 // reset counters and sample again
220 count1 = count2 = 0;
221
222 // advance next once to avoid stuck reference (optional)
223 next = strategy->GetNext();
224
225 for (int32_t i = 0; i < steps; i++)
226 {
227 next = strategy->GetNext();
228
229 if (next->GetUserTask() == &task1) ++count1;
230 else if (next->GetUserTask() == &task2) ++count2;
231 else CHECK_TEXT(false, "Unknown task selected after removal");
232 }
233
234 const int32_t nw1 = 1, nw2 = 2;
235 const int32_t ntotal = nw1 + nw2;
236 const int32_t nexp1 = (steps * nw1) / ntotal;
237 const int32_t nexp2 = steps - nexp1;
238
239 CHECK_TRUE_TEXT(within_tol(nexp1, count1, tol_frac), "Task1 proportion off after removal");
240 CHECK_TRUE_TEXT(within_tol(nexp2, count2, tol_frac), "Task2 proportion off after removal");
241
242 CHECK_TEXT(count1 > 0, "Task1 must run after removal");
243 CHECK_TEXT(count2 > 0, "Task2 must run after removal");
244}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [124/135]

stk::test::TEST ( SwitchStrategySWRoundRobin ,
EndlessNext  )

Definition at line 89 of file stktest_switchstrategyswroundrobin.cpp.

90{
92 TaskMockW<1, ACCESS_USER> task1, task2, task3;
93
94 kernel.Initialize();
95 kernel.AddTask(&task1);
96
97 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
98
99 IKernelTask *next = strategy->GetFirst();
100
101 // --- Stage 1: 1 task only ---------------------------------------------
102
103 // The scheduler must ALWAYS return task1
104 for (int32_t i = 0; i < 10; i++)
105 {
106 next = strategy->GetNext();
107 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Single task must always be selected");
108 }
109
110 // --- Stage 2: add second task -----------------------------------------
111
112 kernel.AddTask(&task2);
113
114 // Both tasks must appear, and none should be starved
115 bool seen1 = false;
116 bool seen2 = false;
117 for (int i = 0; i < 10; i++)
118 {
119 next = strategy->GetNext();
120 if (next->GetUserTask() == &task1) seen1 = true;
121 if (next->GetUserTask() == &task2) seen2 = true;
122 }
123 CHECK_TEXT(seen1, "Task1 must be selected after adding Task2");
124 CHECK_TEXT(seen2, "Task2 must be selected after adding Task2");
125
126 // --- Stage 3: add third task ------------------------------------------
127
128 kernel.AddTask(&task3);
129
130 seen1 = seen2 = false;
131 bool seen3 = false;
132 for (int32_t i = 0; i < 20; i++)
133 {
134 next = strategy->GetNext();
135 if (next->GetUserTask() == &task1) seen1 = true;
136 if (next->GetUserTask() == &task2) seen2 = true;
137 if (next->GetUserTask() == &task3) seen3 = true;
138 }
139
140 CHECK_TEXT(seen1, "Task1 must run after adding Task3");
141 CHECK_TEXT(seen2, "Task2 must run after adding Task3");
142 CHECK_TEXT(seen3, "Task3 must run after adding Task3");
143
144 // --- Stage 4: remove task1 --------------------------------------------
145
146 kernel.RemoveTask(&task1);
147
148 seen2 = seen3 = false;
149 for (int32_t i = 0; i < 10; i++)
150 {
151 next = strategy->GetNext();
152 if (next->GetUserTask() == &task2) seen2 = true;
153 if (next->GetUserTask() == &task3) seen3 = true;
154 CHECK_TEXT(next->GetUserTask() != &task1, "Task1 must not be selected after removal");
155 }
156 CHECK_TEXT(seen2, "Task2 must run after removing Task1");
157 CHECK_TEXT(seen3, "Task3 must run after removing Task1");
158}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [125/135]

stk::test::TEST ( SwitchStrategySWRoundRobin ,
GetFirstEmpty  )

Definition at line 29 of file stktest_switchstrategyswroundrobin.cpp.

30{
32
33 try
34 {
35 g_TestContext.ExpectAssert(true);
36 rr.GetFirst();
37 CHECK_TEXT(false, "expecting assertion when empty");
38 }
39 catch (TestAssertPassed &pass)
40 {
41 CHECK(true);
43 }
44}
SwitchStrategySmoothWeightedRoundRobin SwitchStrategySWRR
Shorthand alias for SwitchStrategySmoothWeightedRoundRobin.
IKernelTask * GetFirst() const
Get first task in the managed set (used by the kernel for initial scheduling).

References g_TestContext, and stk::SwitchStrategySmoothWeightedRoundRobin::GetFirst().

Here is the call graph for this function:

◆ TEST() [126/135]

stk::test::TEST ( SwitchStrategySWRoundRobin ,
GetNextEmpty  )

Definition at line 46 of file stktest_switchstrategyswroundrobin.cpp.

47{
50 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
51
52 kernel.Initialize();
53
54 kernel.AddTask(&task1);
55 kernel.RemoveTask(&task1);
56 CHECK_EQUAL(0, strategy->GetSize());
57
58 // expect to return NULL which puts core into a sleep mode, current is ignored by this strategy
59 CHECK_EQUAL(0, strategy->GetNext());
60}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetNext(), stk::ITaskSwitchStrategy::GetSize(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Here is the call graph for this function:

◆ TEST() [127/135]

stk::test::TEST ( SwitchStrategySWRoundRobin ,
OnTaskDeadlineMissedNotSupported  )

Definition at line 62 of file stktest_switchstrategyswroundrobin.cpp.

63{
66 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
67
68 kernel.Initialize();
69 kernel.AddTask(&task1);
70
71 try
72 {
73 g_TestContext.ExpectAssert(true);
74 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
75 CHECK_TEXT(false, "expecting assertion - OnTaskDeadlineMissed not supported");
76 }
77 catch (TestAssertPassed &pass)
78 {
79 CHECK(true);
81 }
82
83 // we need this workaround to pass 100% coverage test by blocking the exception
86 strategy->OnTaskDeadlineMissed(strategy->GetFirst());
87}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_TestContext, stk::ITaskSwitchStrategy::GetFirst(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::ITaskSwitchStrategy::OnTaskDeadlineMissed().

Here is the call graph for this function:

◆ TEST() [128/135]

stk::test::TEST ( Sync ,
CriticalSection  )

Definition at line 25 of file stktest_sync.cpp.

26{
27 CHECK_EQUAL(0, test::g_CriticalSectionState);
28 {
30 CHECK_EQUAL(1, test::g_CriticalSectionState);
31 }
32 CHECK_EQUAL(0, test::g_CriticalSectionState);
33}
int32_t g_CriticalSectionState
Critical section state.
Definition stktest.cpp:19
RAII-style low-level synchronization primitive for atomic code execution. Used as building brick for ...
Definition stk_sync_cs.h:54

References g_CriticalSectionState.

◆ TEST() [129/135]

stk::test::TEST ( Sync ,
IMutex_ScopedLock  )

Definition at line 35 of file stktest_sync.cpp.

36{
38 {
40 CHECK_TRUE(mutex.m_locked);
41 }
42 CHECK_FALSE(mutex.m_locked);
43}

◆ TEST() [130/135]

stk::test::TEST ( Sync ,
SyncWait_Wake  )

Definition at line 79 of file stktest_sync.cpp.

80{
82 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
84
86 SyncObjectMock sobj;
87
88 g_SyncWaitWakeRelaxCpuContext.platform = platform;
91
92 kernel.Initialize();
93 kernel.AddTask(&task);
94 kernel.Start();
95
97
98 // short wait in order to get wait object for a Wake testing
100 CHECK_TRUE(wo != nullptr); // expect wait object in return after timeout
101
102 // woken by WakeOne() on 5th tick, became active on 6th (see SyncWaitWakeRelaxCpuContext::Process)
103 CHECK_EQUAL(6, g_SyncWaitWakeRelaxCpuContext.counter);
104 CHECK_FALSE(wo->IsTimeout()); // expect no timeout
105 CHECK_EQUAL(true, mutex.m_locked); // expect locked mutex after Wait return
106
108 g_SyncWaitWakeRelaxCpuContext.wake_all = true;
109
110 // repeat for WakeAll()
111 wo = IKernelService::GetInstance()->Wait(&sobj, &mutex, 10);
112 CHECK_TRUE(wo != nullptr); // expect wait object in return after timeout
113
114 // woken by WakeAll() on 7th tick, became active on 8th (see SyncWaitWakeRelaxCpuContext::Process)
115 CHECK_EQUAL(8, g_SyncWaitWakeRelaxCpuContext.counter);
116 CHECK_FALSE(wo->IsTimeout()); // expect no timeout
117 CHECK_EQUAL(true, mutex.m_locked); // expect locked mutex after Wait return
118}
static void SyncWaitWakeRelaxCpu()

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SyncWaitWakeRelaxCpuContext, stk::IKernelService::GetInstance(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::IWaitObject::IsTimeout(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), SyncWaitWakeRelaxCpu(), and stk::IKernelService::Wait().

Here is the call graph for this function:

◆ TEST() [131/135]

stk::test::TEST ( UserTask ,
GetIdAndName  )

Definition at line 105 of file stktest_misc.cpp.

106{
109
110 CHECK_EQUAL((size_t)&task, task.GetId());
111 CHECK_EQUAL((size_t)&taskw, taskw.GetId());
112
113 // expect NULL name by default
114 CHECK_EQUAL((const char *)NULL, task.GetTraceName());
115 CHECK_EQUAL((const char *)NULL, taskw.GetTraceName());
116}
virtual const char * GetTraceName() const
Override in subclass to supply a name for SEGGER SystemView tracing. Returns NULL by default.
Definition stk_helper.h:76
virtual const char * GetTraceName() const
Override in subclass to supply a name for SEGGER SystemView tracing. Returns NULL by default.
Definition stk_helper.h:141

References stk::Task< _StackSize, _AccessMode >::GetId(), stk::TaskW< _Weight, _StackSize, _AccessMode >::GetId(), stk::Task< _StackSize, _AccessMode >::GetTraceName(), and stk::TaskW< _Weight, _StackSize, _AccessMode >::GetTraceName().

Here is the call graph for this function:

◆ TEST() [132/135]

stk::test::TEST ( UserTask ,
GetStackSize  )

Definition at line 75 of file stktest_misc.cpp.

76{
79
82}
size_t GetStackSize() const
Get number of elements of the stack memory array.
Definition stk_helper.h:55
size_t GetStackSize() const
Get number of elements of the stack memory array.
Definition stk_helper.h:122

References stk::Task< _StackSize, _AccessMode >::GetStackSize(), stk::TaskW< _Weight, _StackSize, _AccessMode >::GetStackSize(), and stk::Task< STACK_SIZE_MIN, _AccessMode >::STACK_SIZE.

Here is the call graph for this function:

◆ TEST() [133/135]

stk::test::TEST ( UserTask ,
GetStackSizeBytes  )

Definition at line 84 of file stktest_misc.cpp.

85{
88
89 CHECK_EQUAL(TaskMock<ACCESS_USER>::STACK_SIZE * sizeof(size_t), task.GetStackSizeBytes());
90 CHECK_EQUAL(TaskMock<ACCESS_USER>::STACK_SIZE * sizeof(size_t), taskw.GetStackSizeBytes());
91}
size_t GetStackSizeBytes() const
Get size of the memory in bytes.
Definition stk_helper.h:56
size_t GetStackSizeBytes() const
Get size of the memory in bytes.
Definition stk_helper.h:123

References stk::Task< _StackSize, _AccessMode >::GetStackSizeBytes(), stk::TaskW< _Weight, _StackSize, _AccessMode >::GetStackSizeBytes(), and stk::Task< STACK_SIZE_MIN, _AccessMode >::STACK_SIZE.

Here is the call graph for this function:

◆ TEST() [134/135]

stk::test::TEST ( UserTask ,
GetWeight  )

Definition at line 93 of file stktest_misc.cpp.

94{
97
98 // TaskMock inherits Task and Task does not support weights (1)
99 CHECK_EQUAL(1, task.GetWeight());
100
101 // TaskMockW supports weights as it inherits TaskW
102 CHECK_EQUAL(10, taskw.GetWeight());
103}
virtual int32_t GetWeight() const
Default weight of 1. Override in subclass if custom scheduling weight is needed.
Definition stk_helper.h:68
virtual int32_t GetWeight() const
Returns the compile-time weight _Weight.
Definition stk_helper.h:133

References stk::Task< _StackSize, _AccessMode >::GetWeight(), and stk::TaskW< _Weight, _StackSize, _AccessMode >::GetWeight().

Here is the call graph for this function:

◆ TEST() [135/135]

stk::test::TEST ( UserTask ,
TaskWUnsupportedHrt  )

Definition at line 118 of file stktest_misc.cpp.

119{
121
122 try
123 {
124 g_TestContext.ExpectAssert(true);
125 // on next tick kernel will attempt to remove pending task and will check its deadline
126 taskw.OnDeadlineMissed(0);
127 CHECK_TEXT(false, "expecting assertion - task with weights do not support HRT");
128 }
129 catch (TestAssertPassed &pass)
130 {
131 CHECK(true);
133 }
134}
virtual void OnDeadlineMissed(uint32_t duration)
Hard Real-Time mode is unsupported for weighted tasks. Triggers an assertion if called.
Definition stk_helper.h:129

References g_TestContext, and stk::TaskW< _Weight, _StackSize, _AccessMode >::OnDeadlineMissed().

Here is the call graph for this function:

◆ TEST_GROUP() [1/14]

stk::test::TEST_GROUP ( Basic )

Definition at line 19 of file stktest_misc.cpp.

20{
21 void setup() {}
22 void teardown() {}
23};

◆ TEST_GROUP() [2/14]

stk::test::TEST_GROUP ( DList )

Definition at line 169 of file stktest_misc.cpp.

170{
171 void setup() {}
172 void teardown() {}
173
174 struct ListEntry : public stk::util::DListEntry<ListEntry, true>
175 {
176 int32_t m_id;
177 ListEntry(int32_t id) : m_id(id) {}
178 };
179
180 typedef stk::util::DListHead<ListEntry, true> ListHead;
181};
Intrusive doubly-linked list node. Embed this as a base class in any object (T) that needs to partici...

◆ TEST_GROUP() [3/14]

stk::test::TEST_GROUP ( Kernel )

Definition at line 45 of file stktest_kernel.cpp.

46{
47 void setup() {}
48 void teardown()
49 {
54 }
55};
void ExpectPanic(bool expect)
Start expecting kernel panic for the test case.

References g_PanicValue, g_TestContext, and stk::KERNEL_PANIC_NONE.

Referenced by TEST_GROUP().

Here is the caller graph for this function:

◆ TEST_GROUP() [4/14]

stk::test::TEST_GROUP ( KernelService )

Definition at line 19 of file stktest_kernelservice.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
24 g_RelaxCpuHandler = NULL;
25 }
26};

References g_RelaxCpuHandler.

◆ TEST_GROUP() [5/14]

stk::test::TEST_GROUP ( KernelServiceIsrSafety )

Definition at line 667 of file stktest_kernelservice.cpp.

668{
669 void setup()
670 {
672 g_InsideISR = true;
673 }
674 void teardown()
675 {
676 g_InsideISR = false;
678 g_RelaxCpuHandler = NULL;
679 }
680};
bool g_InsideISR
ISR state.
Definition stktest.cpp:21

References DelayRelaxCpu(), g_DelayContext, g_InsideISR, and g_RelaxCpuHandler.

Here is the call graph for this function:

◆ TEST_GROUP() [6/14]

stk::test::TEST_GROUP ( PeriodicTrigger )

Definition at line 54 of file stktest_time.cpp.

55{
56 enum { PERIOD = 100 };
57
58 void setup()
59 {
61 }
62};

References stk::test::stk::SetTimeNowMsec(), and TEST_GROUP().

Here is the call graph for this function:

◆ TEST_GROUP() [7/14]

stk::test::TEST_GROUP ( StackMemoryWrapper )

Definition at line 136 of file stktest_misc.cpp.

137{
138 void setup() {}
139 void teardown() {}
140};

◆ TEST_GROUP() [8/14]

stk::test::TEST_GROUP ( SwitchStrategyEDF )

Definition at line 19 of file stktest_switchstrategyedf.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
26 }
27};

References g_TestContext.

◆ TEST_GROUP() [9/14]

stk::test::TEST_GROUP ( SwitchStrategyFixedPriority )

Definition at line 19 of file stktest_switchstrategyfpriority.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
26 }
27};

References g_TestContext.

◆ TEST_GROUP() [10/14]

stk::test::TEST_GROUP ( SwitchStrategyMonotonic )

Definition at line 19 of file stktest_switchstrategymonotonic.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
26 }
27};

References g_TestContext.

◆ TEST_GROUP() [11/14]

stk::test::TEST_GROUP ( SwitchStrategyRoundRobin )

Definition at line 19 of file stktest_switchstrategyroundrobin.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
26 }
27};

References g_TestContext.

◆ TEST_GROUP() [12/14]

stk::test::TEST_GROUP ( SwitchStrategySWRoundRobin )

Definition at line 19 of file stktest_switchstrategyswroundrobin.cpp.

20{
21 void setup() {}
22 void teardown()
23 {
26 }
27};

References g_TestContext.

◆ TEST_GROUP() [13/14]

stk::test::TEST_GROUP ( Sync )

Definition at line 19 of file stktest_sync.cpp.

20{
21 void setup() {}
22 void teardown() {}
23};

◆ TEST_GROUP() [14/14]

stk::test::TEST_GROUP ( UserTask )

Definition at line 69 of file stktest_misc.cpp.

70{
71 void setup() {}
72 void teardown() {}
73};

◆ Test_SyncWait()

template<bool TTickless>
void stk::test::Test_SyncWait ( )

Definition at line 1327 of file stktest_kernel.cpp.

1328{
1330 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1332
1334 SyncObjectMock sobj;
1335
1337 g_SyncWaitRelaxCpuContext.platform = platform;
1339
1340 kernel.Initialize();
1341 kernel.AddTask(&task);
1342 kernel.Start();
1343
1345
1347
1348 CHECK_EQUAL(GetTid(), wo->GetTid()); // expect the same thread id as WaitObject belongs to the caller's task
1349 CHECK_TRUE(wo != nullptr); // expect wait object in return after timeout
1350 CHECK_TRUE(wo->IsTimeout()); // expect timeout
1351 CHECK_EQUAL(2, g_SyncWaitRelaxCpuContext.counter); // expect 2 ticks after timeout
1352 CHECK_EQUAL(true, mutex.m_locked); // expect locked mutex after Wait return
1353}
@ 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_STATIC
All tasks are static and can not exit.
Definition stk_common.h:41

References g_RelaxCpuHandler, g_SyncWaitRelaxCpuContext, stk::IKernelService::GetInstance(), stk::GetTid(), stk::IWaitObject::GetTid(), stk::IWaitObject::IsTimeout(), stk::KERNEL_STATIC, stk::KERNEL_SYNC, stk::KERNEL_TICKLESS, SyncWaitRelaxCpu(), and stk::IKernelService::Wait().

Referenced by TEST(), and TEST().

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

◆ TestAlgorithm()

template<class _SwitchStrategy>
void stk::test::TestAlgorithm ( )
static

Definition at line 183 of file stktest_switchstrategymonotonic.cpp.

184{
186 TaskMock<ACCESS_USER> task1, task2, task3;
187 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
188
189 kernel.Initialize();
190
191 // --- Stage 1: Add first task -----------------------------------------
192
193 kernel.AddTask(&task1, 300, 300, 0);
194
195 IKernelTask *next = strategy->GetFirst();
196
197 // Single task -> always returned
198 for (int32_t i = 0; i < 5; i++)
199 {
200 next = strategy->GetNext();
201 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "Single task must always be selected");
202 }
203
204 // --- Stage 2: Add second task ----------------------------------------
205
206 kernel.AddTask(&task2, 200, 200, 0); // higher priority than task1
207
208 next = strategy->GetNext();
209 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Higher priority task2 should preempt task1");
210
211 next = strategy->GetNext();
212 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "Highest priority task always runs");
213
214 // --- Stage 3: Add third task -----------------------------------------
215
216 kernel.AddTask(&task3, 100, 100, 0); // highest priority
217
218 next = strategy->GetNext();
219 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Highest priority task3 should run first");
220
221 next = strategy->GetNext();
222 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Highest priority task always runs");
223
224 // --- Stage 4: Remove a task ------------------------------------------
225
226 kernel.RemoveTask(&task3);
227
228 next = strategy->GetNext();
229 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 becomes highest priority after task3 removal");
230
231 next = strategy->GetNext();
232 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 remains highest priority");
233
234 kernel.RemoveTask(&task2);
235
236 next = strategy->GetNext();
237 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "task1 remains as only task");
238}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Referenced by TEST(), and TEST().

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

◆ TestHrtTaskExitDuringSleepState()

template<class _SwitchStrategy>
void stk::test::TestHrtTaskExitDuringSleepState ( )
static

Definition at line 987 of file stktest_kernel.cpp.

988{
990 TaskMock<ACCESS_USER> task1, task2;
991 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
992 const _SwitchStrategy *strategy = static_cast<const _SwitchStrategy *>(kernel.GetSwitchStrategy());
993
994 kernel.Initialize();
995 kernel.AddTask(&task1, 1, 2, 0);
996 kernel.AddTask(&task2, 1, 2, 2);
997 kernel.Start();
998
999 // task1 is the first
1000 CHECK_EQUAL((size_t)task1.GetStack(), platform->m_stack_active->SP);
1001
1002 // task returns (exiting) without calling SwitchToNext
1003 platform->EventTaskExit(platform->m_stack_active);
1004
1005 platform->ProcessTick(); // schedules task removal but task2 is still sleeping
1006
1007 // here scheduler is sleeping because task1 was sent to infinite sleep until removal and task2 is still pending
1008
1009 platform->ProcessTick(); // task2 is still sleeping
1010 platform->ProcessTick(); // switched to task2
1011
1012 CHECK_EQUAL((size_t)task2.GetStack(), platform->m_stack_active->SP);
1013
1014 CHECK_EQUAL(1, strategy->GetSize());
1015}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Referenced by TEST(), TEST(), TEST(), and TEST().

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

◆ TestPriorityNext()

template<class _SwitchStrategy>
void stk::test::TestPriorityNext ( )
static

Definition at line 139 of file stktest_switchstrategymonotonic.cpp.

140{
142 TaskMock<ACCESS_USER> task1, task2, task3;
143 ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
144
145 kernel.Initialize();
146
147 kernel.AddTask(&task1, 300, 300, 0);
148 kernel.AddTask(&task3, 100, 100, 0);
149 kernel.AddTask(&task2, 200, 200, 0);
150
151 // Highest priority task must be selected first
152 IKernelTask *next = strategy->GetFirst();
153 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "task3 must be selected as highest priority");
154
155 // GetNext must always return highest-priority READY task
156 next = strategy->GetNext();
157 CHECK_EQUAL_TEXT(&task3, next->GetUserTask(), "Highest priority task must repeat (no round-robin)");
158
159 // Remove highest priority
160 kernel.RemoveTask(&task3);
161
162 next = strategy->GetNext();
163 CHECK_EQUAL_TEXT(&task2, next->GetUserTask(), "task2 becomes highest priority after task3 removal");
164
165 // Remove next highest
166 kernel.RemoveTask(&task2);
167
168 next = strategy->GetNext();
169 CHECK_EQUAL_TEXT(&task1, next->GetUserTask(), "task1 remains as only task");
170}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::ITaskSwitchStrategy::GetFirst(), stk::ITaskSwitchStrategy::GetNext(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetSwitchStrategy(), stk::IKernelTask::GetUserTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::RemoveTask().

Referenced by TEST(), and TEST().

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

◆ TestTaskExit()

template<class _SwitchStrategy>
void stk::test::TestTaskExit ( )
static

Definition at line 598 of file stktest_kernel.cpp.

599{
601 TaskMock<ACCESS_PRIVILEGED> task1, task2;
602 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
603 Stack *&idle = platform->m_stack_idle, *&active = platform->m_stack_active;
604
605 kernel.Initialize();
606 kernel.AddTask(&task1);
607 kernel.AddTask(&task2);
608 kernel.Start();
609
610 // ISR calls OnSysTick (task1 = idle, task2 = active)
611 platform->ProcessTick();
612
613 // task2 exited (will schedule its removal)
614 platform->EventTaskExit(active);
615
616 // ISR calls OnSysTick (task2 = idle, task1 = active)
617 platform->ProcessTick();
618
619 // task1 exited (will schedule its removal)
620 platform->EventTaskExit(active);
621
622 // ISR calls OnSysTick
623 platform->ProcessTick();
624
625 // last task is removed
626 platform->ProcessTick();
627
628 platform->ProcessTick();
629
630 // no Idle tasks left
631 CHECK_EQUAL((Stack *)NULL, idle);
632
633 // Exit trap stack is provided for a long jump to the end of Kernel::Start()
634 CHECK_EQUAL(platform->m_exit_trap, active);
635}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::test::PlatformTestMock::EventTaskExit(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_exit_trap, stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::m_stack_idle, stk::test::PlatformTestMock::ProcessTick(), and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Referenced by TEST(), TEST(), and TEST().

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

◆ TestTaskSleep()

template<class _SwitchStrategy>
void stk::test::TestTaskSleep ( bool until)
static

Definition at line 399 of file stktest_kernelservice.cpp.

400{
402 TaskMock<ACCESS_USER> task1, task2;
403 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
404 Stack *&active = platform->m_stack_active;
405
406 kernel.Initialize();
407 kernel.AddTask(&task1);
408 kernel.AddTask(&task2);
409 kernel.Start();
410
411 // on start Round-Robin selects the very first task
412 CHECK_EQUAL_TEXT(active->SP, (size_t)task1.GetStack(), "expecting task1");
413
414 // ISR calls OnSysTick (task1 = idle, task2 = active)
415 platform->ProcessTick();
416 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2");
417
420 g_SleepRelaxCpuContext.platform = platform;
421 g_SleepRelaxCpuContext.task1 = &task1;
422 g_SleepRelaxCpuContext.task2 = &task2;
423
424 // task2 calls Sleep to become idle
425 if (until)
426 {
427 SleepUntil(GetTicks() + 2);
428 }
429 else
430 {
431 Sleep(2);
432 }
433
434 // task2 slept 2 ticks and became active again when became a tail of previously active task1
435 CHECK_EQUAL_TEXT(active->SP, (size_t)task2.GetStack(), "expecting task2 after sleep");
436
437 // ISR calls OnSysTick (task1 = active, task2 = idle)
438 platform->ProcessTick();
439 CHECK_EQUAL_TEXT(active->SP, (size_t)task1.GetStack(), "expecting task1 after next tick");
440}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_SleepRelaxCpuContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::GetTicks(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_stack_active, stk::test::PlatformTestMock::ProcessTick(), stk::Sleep(), SleepRelaxCpu(), stk::SleepUntil(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

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

Variable Documentation

◆ g_AddTaskWhenStartedRelaxCpuContext

struct stk::test::AddTaskWhenStartedRelaxCpuContext stk::test::g_AddTaskWhenStartedRelaxCpuContext
static

Referenced by AddTaskWhenStartedRelaxCpu(), and TEST().

◆ g_CriticalSectionState

int32_t stk::test::g_CriticalSectionState = false
extern

Critical section state.

Definition at line 19 of file stktest.cpp.

Referenced by stk::hw::CriticalSection::Enter(), stk::hw::CriticalSection::Exit(), and TEST().

◆ g_DelayContext

struct stk::test::DelayContext stk::test::g_DelayContext
static

◆ g_EDFDynamicSchedulingContext

struct stk::test::EDFDynamicSchedulingContext stk::test::g_EDFDynamicSchedulingContext
static

◆ g_HrtTaskDeadlineMissedRelaxCpuContext

struct stk::test::HrtTaskDeadlineMissedRelaxCpuContext stk::test::g_HrtTaskDeadlineMissedRelaxCpuContext
static

◆ g_InsideISR

bool stk::test::g_InsideISR = false
extern

ISR state.

Definition at line 21 of file stktest.cpp.

Referenced by stk::hw::IsInsideISR(), and TEST_GROUP().

◆ g_KernelService

◆ g_PanicValue

EKernelPanicId stk::test::g_PanicValue = KERNEL_PANIC_NONE
extern

Panic value.

Definition at line 20 of file stktest.cpp.

Referenced by STK_PANIC_HANDLER_DEFAULT(), TEST(), TEST(), and TEST_GROUP().

◆ g_PrioritySleepRelaxCpuContext

struct stk::test::PrioritySleepRelaxCpuContext stk::test::g_PrioritySleepRelaxCpuContext
static

Referenced by PrioritySleepRelaxCpu(), and TEST().

◆ g_SleepAllAndWakeRelaxCpuContext

struct stk::test::SleepAllAndWakeRelaxCpuContext stk::test::g_SleepAllAndWakeRelaxCpuContext
static

Referenced by SleepAllAndWakeRelaxCpu(), and TEST().

◆ g_SleepAndWakeTicklessRelaxCpuContext

struct stk::test::SleepAndWakeTicklessRelaxCpuContext stk::test::g_SleepAndWakeTicklessRelaxCpuContext
static

◆ g_SleepRelaxCpuContext

struct stk::test::SleepRelaxCpuContext stk::test::g_SleepRelaxCpuContext
static

◆ g_SwitchToNextRelaxCpuContext

struct stk::test::SwitchToNextRelaxCpuContext stk::test::g_SwitchToNextRelaxCpuContext
static

Referenced by SwitchToNextRelaxCpu(), TEST(), and TEST().

◆ g_SyncWaitRelaxCpuContext

struct stk::test::SyncWaitRelaxCpuContext stk::test::g_SyncWaitRelaxCpuContext
static

◆ g_SyncWaitWakeRelaxCpuContext

struct stk::test::SyncWaitWakeRelaxCpuContext stk::test::g_SyncWaitWakeRelaxCpuContext
static

Referenced by SyncWaitWakeRelaxCpu(), and TEST().

◆ g_TestContext