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  blockpool
 Namespace of BlockMemoryPool test.
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  msgqueue
 Namespace of sync::MessageQueue / MessageQueueT 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  TaskSuspendContext
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, OnTaskExitScheduleDynamicOnly)
 TEST (Kernel, OnTaskExitSchedule)
 TEST (Kernel, OnTaskNotFoundBySP)
 TEST (Kernel, OnTaskSkipFreedTask)
static void TaskSuspendRelaxCpu ()
 TEST (Kernel, TaskSuspend)
 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 (Kernel, EnumTasks)
 TEST (Kernel, SuspendResumeTicklessOnly)
 TEST (Kernel, SuspendResume)
 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 (KernelService, SysTimer)
 TEST_GROUP (Basic)
 TEST (Basic, MinMax)
 TEST_GROUP (UserTask)
 TEST (UserTask, GetStackSize)
 TEST (UserTask, GetStackSizeBytes)
 TEST (UserTask, GetStackSpace)
 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::TaskSuspendContext g_TaskSuspendContext
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 1053 of file stktest_kernel.cpp.

1054{
1056}
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 1469 of file stktest_kernel.cpp.

1470{
1471 g_SyncWaitRelaxCpuContext.Process();
1472}
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:

◆ TaskSuspendRelaxCpu()

void stk::test::TaskSuspendRelaxCpu ( )
static

Definition at line 864 of file stktest_kernel.cpp.

865{
866 g_TaskSuspendContext.Process();
867}
static struct stk::test::TaskSuspendContext g_TaskSuspendContext

References g_TaskSuspendContext.

Referenced by TEST().

Here is the caller graph for this function:

◆ TEST() [1/143]

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}
static constexpr T Max(T a, T b)
Compile-time maximum of two values.
Definition stk_defs.h:541
static constexpr T Min(T a, T b)
Compile-time minimum of two values.
Definition stk_defs.h:535

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

Here is the call graph for this function:

◆ TEST() [2/143]

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

Definition at line 318 of file stktest_misc.cpp.

319{
320 ListHead list;
321 ListEntry e1(1), e2(2), e3(3);
322
323 list.LinkBack(e1);
324 list.LinkBack(e2);
325 list.LinkBack(e3);
326
327 list.Clear();
328
329 CHECK_EQUAL_ZERO(list.GetSize());
330 CHECK_TRUE(list.IsEmpty());
331 CHECK_TRUE(NULL == list.GetFirst());
332 CHECK_TRUE(NULL == list.GetLast());
333}

◆ TEST() [3/143]

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

Definition at line 210 of file stktest_misc.cpp.

211{
212 ListHead list;
213
214 CHECK_EQUAL_ZERO(list.GetSize());
215 CHECK_TRUE(list.IsEmpty());
216 CHECK_TRUE(NULL == list.GetFirst());
217 CHECK_TRUE(NULL == list.GetLast());
218
219 list.Clear();
220}

◆ TEST() [4/143]

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

Definition at line 335 of file stktest_misc.cpp.

336{
337 ListHead list;
338 ListEntry e1(1), e2(2), e3(3);
339
340 list.LinkBack(e1);
341 list.LinkBack(e2);
342 list.LinkBack(e3);
343
344 ListHead::DLEntryType *itr = list.GetFirst();
345 CHECK_EQUAL(&e1, itr);
346
347 itr = itr->GetNext();
348 CHECK_EQUAL(&e2, itr);
349
350 itr = itr->GetNext();
351 CHECK_EQUAL(&e3, itr);
352
353 itr = itr->GetNext();
354 CHECK_EQUAL(&e1, itr);
355}

◆ TEST() [5/143]

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

Definition at line 243 of file stktest_misc.cpp.

244{
245 ListHead list;
246 ListEntry e1(1), e2(2), e3(3);
247
248 list.LinkBack(e1);
249 CHECK_EQUAL(&e1, list.GetFirst());
250 CHECK_EQUAL(&e1, list.GetLast());
251 CHECK_EQUAL(&list, e1.GetHead());
252
253 list.LinkBack(e2);
254 CHECK_EQUAL(&e1, list.GetFirst());
255 CHECK_EQUAL(&e2, list.GetLast());
256
257 list.LinkBack(e3);
258 CHECK_EQUAL(&e1, list.GetFirst());
259 CHECK_EQUAL(&e3, list.GetLast());
260
261 CHECK_EQUAL(3, list.GetSize());
262}

◆ TEST() [6/143]

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

Definition at line 222 of file stktest_misc.cpp.

223{
224 ListHead list;
225 ListEntry e1(1), e2(2), e3(3);
226
227 list.LinkFront(e1);
228 CHECK_EQUAL(&e1, list.GetFirst());
229 CHECK_EQUAL(&e1, list.GetLast());
230 CHECK_EQUAL(&list, e1.GetHead());
231
232 list.LinkFront(e2);
233 CHECK_EQUAL(&e2, list.GetFirst());
234 CHECK_EQUAL(&e1, list.GetLast());
235
236 list.LinkFront(e3);
237 CHECK_EQUAL(&e3, list.GetFirst());
238 CHECK_EQUAL(&e1, list.GetLast());
239
240 CHECK_EQUAL(3, list.GetSize());
241}

◆ TEST() [7/143]

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

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.PopBack();
301
302 CHECK_EQUAL(&e1, list.GetFirst());
303 CHECK_EQUAL(&e2, list.GetLast());
304
305 list.PopBack();
306
307 CHECK_EQUAL(&e1, list.GetFirst());
308 CHECK_EQUAL(&e1, list.GetLast());
309
310 list.PopBack();
311
312 CHECK_EQUAL_ZERO(list.GetSize());
313 CHECK_TRUE(list.IsEmpty());
314 CHECK_TRUE(NULL == list.GetFirst());
315 CHECK_TRUE(NULL == list.GetLast());
316}

◆ TEST() [8/143]

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

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.PopFront();
274
275 CHECK_EQUAL(&e2, list.GetFirst());
276 CHECK_EQUAL(&e3, list.GetLast());
277
278 list.PopFront();
279
280 CHECK_EQUAL(&e3, list.GetFirst());
281 CHECK_EQUAL(&e3, list.GetLast());
282
283 list.PopFront();
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() [9/143]

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

Definition at line 357 of file stktest_misc.cpp.

358{
359 ListHead list;
360 ListEntry e1(1), e2(2), e3(3);
361
362 list.LinkBack(e1);
363 list.LinkBack(e2);
364 list.LinkBack(e3);
365
366 ListHead list2;
367 list.RelinkTo(list2);
368
369 CHECK_EQUAL_ZERO(list.GetSize());
370 CHECK_TRUE(list.IsEmpty());
371 CHECK_TRUE(NULL == list.GetFirst());
372 CHECK_TRUE(NULL == list.GetLast());
373
374 CHECK_EQUAL(3, list2.GetSize());
375 CHECK_EQUAL(&list2, e1.GetHead());
376 CHECK_EQUAL(&list2, e2.GetHead());
377 CHECK_EQUAL(&list2, e3.GetHead());
378}

◆ TEST() [10/143]

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:81
void Initialize(uint32_t resolution_us=PERIODICITY_DEFAULT)
Initialize kernel.
Definition stk.h:832
ITaskSwitchStrategy * GetSwitchStrategy()
Get task-switching strategy instance owned by this kernel.
Definition stk.h:1088
void AddTask(ITask *user_task)
Register task for a soft real-time (SRT) scheduling.
Definition stk.h:859
Scheduling-strategy-facing interface for a kernel task slot.
Definition stk_common.h:562
virtual ITask * GetUserTask()=0
Get user task.
Interface for a task switching strategy implementation.
Definition stk_common.h:889
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/143]

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:1050
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/143]

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/143]

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/143]

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/143]

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((Word)task.GetStack(), platform->m_stack_info[STACK_USER_TASK].stack->SP);
157}
uintptr_t Word
Native processor word type.
Definition stk_common.h:113
@ 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:1083
Word SP
Stack Pointer (SP) register (note: must be the first entry in this struct).
Definition stk_common.h:220
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:274

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/143]

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/143]

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/143]

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
Hardware access mode of the owning task (see EAccessMode).
Definition stk_common.h:221
void ProcessTick()
Process one tick.
Definition stktest.h:193

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/143]

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/143]

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, (Word)task1.GetStack());
504
505 // 2-nd task becomes Active
506 CHECK_EQUAL(active->SP, (Word)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, (Word)task2.GetStack());
521
522 // 1-nd task becomes Active
523 CHECK_EQUAL(active->SP, (Word)task1.GetStack());
524
525 // context switch requested
526 CHECK_EQUAL(2, platform->m_context_switch_nr);
527 }
528}
Stack descriptor.
Definition stk_common.h:219

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/143]

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

Definition at line 1548 of file stktest_kernel.cpp.

1549{
1551 TaskMock<ACCESS_USER> task1, task2;
1552
1553 kernel.Initialize();
1554 kernel.AddTask(&task1);
1555 kernel.AddTask(&task2);
1556 kernel.Start();
1557
1558 ITask *tasks[2] = {};
1559 uint32_t i = 0;
1560
1561 size_t count = kernel.EnumerateTasksT<2>([&](ITask *t) {
1562 CHECK_COMPARE(i, <, 2);
1563 tasks[i++] = t;
1564 return true; // continue
1565 });
1566
1567 // must enumerate all
1568 CHECK_EQUAL(2, count);
1569
1570 // check ordering
1571 CHECK_EQUAL(tasks[0], &task1);
1572 CHECK_EQUAL(tasks[1], &task2);
1573
1574 // expect break of enumeration
1575 count = kernel.EnumerateTasksT<2>([&](ITask */*t*/) {
1576 return false; // break on first entry
1577 });
1578 CHECK_EQUAL(1, count);
1579
1580 // expect only 1 iteration
1581 count = kernel.EnumerateTasksT<1>([&](ITask */*t*/) {
1582 return true;
1583 });
1584 CHECK_EQUAL(1, count);
1585}
Interface for a user task.
Definition stk_common.h:491
size_t EnumerateTasksT(TCallback &&callback)
Enumerate tasks, invoking a callback for each active task.

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

Here is the call graph for this function:

◆ TEST() [22/143]

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

◆ TEST() [23/143]

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

Definition at line 937 of file stktest_kernel.cpp.

938{
941
942 kernel.Initialize();
943
944 try
945 {
946 g_TestContext.ExpectAssert(true);
947 kernel.AddTask(&task);
948 CHECK(false); // non-HRT AddTask not supported in HRT mode"
949 }
950 catch (TestAssertPassed &pass)
951 {
952 CHECK(true);
954 }
955}

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/143]

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

Definition at line 957 of file stktest_kernel.cpp.

958{
961
962 kernel.Initialize();
963
964 try
965 {
966 g_TestContext.ExpectAssert(true);
967 kernel.AddTask(&task, 1, 1, 0);
968 CHECK(false); // HRT-related AddTask not supported in non-HRT mode
969 }
970 catch (TestAssertPassed &pass)
971 {
972 CHECK(true);
974 }
975}

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() [25/143]

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

Definition at line 1205 of file stktest_kernel.cpp.

1206{
1209
1210 kernel.Initialize();
1211 kernel.AddTask(&task);
1212 kernel.Start();
1213
1214 // Obtain kernel task
1215 IKernelTask *ktask = kernel.GetSwitchStrategy()->GetFirst();
1216 CHECK_TRUE_TEXT(ktask != nullptr, "Kernel task must exist");
1217
1218 try
1219 {
1220 g_TestContext.ExpectAssert(true);
1221 ktask->GetHrtRelativeDeadline();
1222 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1223 }
1224 catch (TestAssertPassed &pass)
1225 {
1226 CHECK(true);
1228 }
1229
1230 try
1231 {
1233 ktask->GetHrtPeriodicity();
1234 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1235 }
1236 catch (TestAssertPassed &pass)
1237 {
1238 CHECK(true);
1239 g_TestContext.ExpectAssert(false);
1240 }
1241
1242 try
1243 {
1244 g_TestContext.ExpectAssert(true);
1245 ktask->GetHrtDeadline();
1246 CHECK_TEXT(false, "HRT API can't be called in non-HRT mode");
1247 }
1248 catch (TestAssertPassed &pass)
1249 {
1250 CHECK(true);
1251 g_TestContext.ExpectAssert(false);
1252 }
1253}
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() [26/143]

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

Definition at line 1108 of file stktest_kernel.cpp.

1109{
1111 TaskMock<ACCESS_USER> task1, task2;
1112 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1113
1114 kernel.Initialize();
1115 kernel.AddTask(&task1, 2, 2, 3);
1116 kernel.AddTask(&task2, 3, 3, 0);
1117 kernel.Start();
1118
1119 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
1121
1122 CHECK_EQUAL(platform->m_stack_active->SP, (Word)task2.GetStack());
1123 platform->ProcessTick();
1124 CHECK_EQUAL(platform->m_stack_active->SP, (Word)task2.GetStack());
1125 platform->ProcessTick();
1126 Yield();
1127 CHECK_EQUAL(platform->m_stack_active->SP, (Word)task1.GetStack());
1128
1129 CHECK_FALSE(platform->m_hard_fault);
1130 CHECK_EQUAL(0, task1.m_deadline_missed);
1131 CHECK_EQUAL(0, task2.m_deadline_missed);
1132}
void Yield()
Notify scheduler to switch to the next runnable task.
Definition stk_helper.h:359
static void HrtTaskDeadlineMissedRelaxCpu()
uint32_t m_deadline_missed
duration of workload if deadline is missed in HRT mode
Definition stktest.h:388

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() [27/143]

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

Definition at line 1185 of file stktest_kernel.cpp.

1186{
1189 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1190
1191 kernel.Initialize();
1192 kernel.AddTask(&task, 1, 1, 1);
1193 kernel.Start();
1194
1195 // due to 1 tick delayed start of the task Kernel enters into a SLEEPING state
1196 CHECK_EQUAL(platform->m_stack_active, platform->m_stack_info[STACK_SLEEP_TRAP].stack);
1197
1198 platform->ProcessTick();
1199
1200 // after a tick task become active and Kernel enters into a AWAKENING state
1201 CHECK_EQUAL(platform->m_stack_idle, platform->m_stack_info[STACK_SLEEP_TRAP].stack);
1202 CHECK_EQUAL(platform->m_stack_active->SP, (Word)task.GetStack());
1203}
@ 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() [28/143]

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

Definition at line 977 of file stktest_kernel.cpp.

978{
981
982 kernel.Initialize();
983 kernel.AddTask(&task, 1, 1, 0);
984 kernel.Start();
985
986 try
987 {
988 g_TestContext.ExpectAssert(true);
989 Sleep(1);
990 CHECK(false); // IKernelService::Sleep not allowed in HRT mode
991 }
992 catch (TestAssertPassed &pass)
993 {
994 CHECK(true);
996 }
997
998 try
999 {
1001 SleepUntil(GetTicks() + 1);
1002 CHECK(false); // IKernelService::SleepUntil not allowed in HRT mode
1003 }
1004 catch (TestAssertPassed &pass)
1005 {
1006 CHECK(true);
1007 g_TestContext.ExpectAssert(false);
1008 }
1009}
void Sleep(Timeout ticks)
Put calling process into a sleep state.
Definition stk_helper.h:326
Ticks GetTicks()
Get number of ticks elapsed since kernel start.
Definition stk_helper.h:258
void SleepUntil(Ticks timestamp)
Put calling process into a sleep state until the specified timestamp.
Definition stk_helper.h:350

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() [29/143]

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

Definition at line 1011 of file stktest_kernel.cpp.

1012{
1015 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1016 const ITaskSwitchStrategy *strategy = kernel.GetSwitchStrategy();
1017
1018 kernel.Initialize();
1019 kernel.AddTask(&task, 1, 1, 0);
1020 kernel.Start();
1021
1022 CHECK_TRUE(strategy->GetSize() != 0);
1023
1024 platform->EventTaskExit(platform->m_stack_active);
1025 platform->ProcessTick();
1026
1027 platform->ProcessTick();
1028
1029 CHECK_EQUAL(0, strategy->GetSize());
1030
1031 CHECK_EQUAL(IKernel::STATE_READY, kernel.GetState());
1032}
EState GetState() const
Get kernel state.
Definition stk.h:1092
@ STATE_READY
Ready to start, IKernel::Start() must be called.
Definition stk_common.h:969
void EventTaskExit(Stack *stack)
Definition stktest.h:221

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() [30/143]

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

Definition at line 1058 of file stktest_kernel.cpp.

1059{
1062 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1063
1064 kernel.Initialize();
1065 kernel.AddTask(&task, 2, 1, 0);
1066 kernel.Start();
1067
1068 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
1070
1071 platform->ProcessTick();
1072
1073 // task does not Yield() and thus next tick will overcome the deadline
1074 g_TestContext.ExpectAssert(true);
1075
1076 // 2-nd tick goes outside the deadline
1077 platform->ProcessTick();
1078
1079 CHECK_TRUE(platform->m_hard_fault);
1080 CHECK_EQUAL(2, task.m_deadline_missed);
1081}

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() [31/143]

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

Definition at line 1083 of file stktest_kernel.cpp.

1084{
1087 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1088
1089 kernel.Initialize();
1090 kernel.AddTask(&task, 2, 1, 0);
1091 kernel.Start();
1092
1093 g_HrtTaskDeadlineMissedRelaxCpuContext.platform = platform;
1095
1096 platform->ProcessTick();
1097
1098 // task completes its work and yields to kernel, its workload is 1 ticks now that is within deadline 1
1099 Yield();
1100
1101 // 2-nd tick continues scheduling normally
1102 platform->ProcessTick();
1103
1104 CHECK_FALSE(platform->m_hard_fault);
1105 CHECK_EQUAL(0, task.m_deadline_missed);
1106}

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() [32/143]

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

Definition at line 1175 of file stktest_kernel.cpp.

1176{
1178}
static void TestHrtTaskExitDuringSleepState()

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [33/143]

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

Definition at line 1180 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [34/143]

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

Definition at line 1170 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [35/143]

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

Definition at line 1165 of file stktest_kernel.cpp.

References TestHrtTaskExitDuringSleepState().

Here is the call graph for this function:

◆ TEST() [36/143]

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() [37/143]

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}
static constexpr uint32_t TASKS_MAX
Maximum number of concurrently registered tasks. Fixed at compile time. Exceeding this limit in AddTa...
Definition stk.h:789

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() [38/143]

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

Definition at line 646 of file stktest_kernel.cpp.

647{
649}
static void TestTaskExit()

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [39/143]

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

Definition at line 636 of file stktest_kernel.cpp.

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [40/143]

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

Definition at line 731 of file stktest_kernel.cpp.

732{
734 TaskMock<ACCESS_PRIVILEGED> task1, task2;
735 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
736 Stack *&active = platform->m_stack_active;
737
738 kernel.Initialize();
739 kernel.AddTask(&task1);
740 kernel.AddTask(&task2);
741 kernel.Start();
742
743 // task1 is active after Start
744 CHECK_EQUAL(active->SP, (Word)task1.GetStack());
745
746 kernel.ScheduleTaskRemoval(&task1);
747
748 // ScheduleTaskRemoval does not change anything, just schedules removal on the next tick
749 CHECK_EQUAL(active->SP, (Word)task1.GetStack());
750
751 // task2 will become active now but kernel could not remove task1 because it was current one,
752 // it will be removed on a next tick
753 platform->ProcessTick();
754
755 // task2 became the active
756 CHECK_EQUAL(2, kernel.GetSwitchStrategy()->GetSize());
757 CHECK_EQUAL(active->SP, (Word)task2.GetStack());
758
759 platform->ProcessTick();
760
761 // task1 was removed by the tick, task2 is the only active
762 CHECK_EQUAL(1, kernel.GetSwitchStrategy()->GetSize());
763 CHECK_EQUAL(active->SP, (Word)task2.GetStack());
764}
void ScheduleTaskRemoval(ITask *user_task)
Schedule task removal from scheduling (exit).
Definition stk.h:945

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::ITaskSwitchStrategy::GetSize(), 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::Kernel< TMode, TSize, TStrategy, TPlatform >::ScheduleTaskRemoval(), stk::Stack::SP, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [41/143]

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

Definition at line 709 of file stktest_kernel.cpp.

710{
713
714 kernel.Initialize();
715 kernel.AddTask(&task1);
716 kernel.Start();
717
718 try
719 {
720 g_TestContext.ExpectAssert(true);
721 kernel.ScheduleTaskRemoval(&task1);
722 CHECK(false); // dynamic only
723 }
724 catch (TestAssertPassed &pass)
725 {
726 CHECK(true);
728 }
729}

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

Here is the call graph for this function:

◆ TEST() [42/143]

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

Definition at line 641 of file stktest_kernel.cpp.

References TestTaskExit().

Here is the call graph for this function:

◆ TEST() [43/143]

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

Definition at line 651 of file stktest_kernel.cpp.

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

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() [44/143]

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

◆ TEST() [45/143]

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

Definition at line 766 of file stktest_kernel.cpp.

767{
770 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
771
772 kernel.Initialize();
773 kernel.AddTask(&task1);
774 kernel.Start();
775
776 platform->ProcessTick();
777
778 try
779 {
780 g_TestContext.ExpectAssert(true);
781 platform->EventTaskSwitch(0xdeadbeef);
782 CHECK(false); // non existent task must not succeed
783 }
784 catch (TestAssertPassed &pass)
785 {
786 CHECK(true);
788 }
789}
void EventTaskSwitch(size_t caller_SP)
Definition stktest.h:226

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() [46/143]

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

Definition at line 791 of file stktest_kernel.cpp.

792{
794 TaskMock<ACCESS_PRIVILEGED> task1, task2;
795 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
796 Stack *&active = platform->m_stack_active;
797
798 kernel.Initialize();
799 kernel.AddTask(&task1);
800 kernel.AddTask(&task2);
801 kernel.Start();
802
803 // task1 exited (will schedule its removal)
804 platform->EventTaskExit(active);
805
806 // 2 ticks to remove exited task1 from scheduling (1st switched to task2, 2nd cleans up task1 exit)
807 platform->ProcessTick();
808 platform->ProcessTick();
809
810 try
811 {
812 g_TestContext.ExpectAssert(true);
813
814 // we loop through all tasks in attempt to find non existent SP (0xdeadbeef)
815 // by this FindTaskBySP() is invoked and will loop thorugh the exited task1's
816 // slot
817 platform->EventTaskSwitch(0xdeadbeef);
818 CHECK(false); // exited task must be successfully skipped by FindTaskBySP()
819 }
820 catch (TestAssertPassed &pass)
821 {
822 CHECK(true);
824 }
825}

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() [47/143]

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:922

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() [48/143]

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}

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() [49/143]

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() [50/143]

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() [51/143]

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

◆ TEST() [52/143]

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((Word)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:152

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() [53/143]

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

◆ TEST() [54/143]

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() [55/143]

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() [56/143]

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() [57/143]

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:968
@ STATE_RUNNING
Initialized and running, IKernel::Start() was called successfully.
Definition stk_common.h:970
static IKernelService * GetInstance()
Get CPU-local instance of the kernel service.
Definition stktest.cpp:69
IKernelService * m_service
Definition stktest.h:262

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() [58/143]

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

Definition at line 1628 of file stktest_kernel.cpp.

1629{
1631 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1633
1634 kernel.Initialize();
1635 kernel.AddTask(&task1);
1636 kernel.Start();
1637
1638 platform->m_sleep_ticks = 9;
1639
1641 CHECK_EQUAL(9, ticks);
1642
1643 CHECK_EQUAL(IKernel::STATE_SUSPENDED, kernel.GetState());
1644
1646}
int32_t Timeout
Timeout time (ticks).
Definition stk_common.h:123
@ STATE_SUSPENDED
Scheduling is suspended with IKernelService::Suspend().
Definition stk_common.h:971
virtual void Resume(Timeout elapsed_ticks)=0
Resume scheduling after a prior Suspend() call.
virtual Timeout Suspend()=0
Suspend scheduling.

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_sleep_ticks, stk::IKernelService::Resume(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), stk::IKernel::STATE_SUSPENDED, and stk::IKernelService::Suspend().

Here is the call graph for this function:

◆ TEST() [59/143]

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

Definition at line 1587 of file stktest_kernel.cpp.

1588{
1591
1592 kernel.Initialize();
1593 kernel.AddTask(&task1);
1594 kernel.Start();
1595
1596 try
1597 {
1598 g_TestContext.ExpectAssert(true);
1600 CHECK_TEXT(false, "tickless only");
1601 }
1602 catch (TestAssertPassed &pass)
1603 {
1604 CHECK(true);
1606 }
1607
1608 // shall return 0 in release build
1611 CHECK_EQUAL(0, stk::IKernelService::GetInstance()->Suspend());
1614
1615 try
1616 {
1619 CHECK_TEXT(false, "tickless only");
1620 }
1621 catch (TestAssertPassed &pass)
1622 {
1623 CHECK(true);
1624 g_TestContext.ExpectAssert(false);
1625 }
1626}
void RethrowAssertException(bool rethrow)
Re-throw assert's exception for the test case.

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

Here is the call graph for this function:

◆ TEST() [60/143]

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

Definition at line 1379 of file stktest_kernel.cpp.

1380{
1383
1385 SyncObjectMock sobj;
1386
1387 kernel.Initialize();
1388 kernel.AddTask(&task);
1389 kernel.Start();
1390
1391 try
1392 {
1393 g_TestContext.ExpectAssert(true);
1394 IKernelService::GetInstance()->Wait(&sobj, &mutex, 10);
1395 CHECK_TEXT(false, "mutex must be locked");
1396 }
1397 catch (TestAssertPassed &pass)
1398 {
1399 CHECK(true);
1401 }
1402}
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() [61/143]

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

Definition at line 1330 of file stktest_kernel.cpp.

1331{
1334
1335 SyncObjectMock sobj;
1336
1337 kernel.Initialize();
1338 kernel.AddTask(&task);
1339 kernel.Start();
1340
1341 try
1342 {
1343 g_TestContext.ExpectAssert(true);
1344 IKernelService::GetInstance()->Wait(&sobj, nullptr, 10);
1345 CHECK_TEXT(false, "mutex must not be NULL");
1346 }
1347 catch (TestAssertPassed &pass)
1348 {
1349 CHECK(true);
1351 }
1352}

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() [62/143]

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

Definition at line 1306 of file stktest_kernel.cpp.

1307{
1310
1312
1313 kernel.Initialize();
1314 kernel.AddTask(&task);
1315 kernel.Start();
1316
1317 try
1318 {
1319 g_TestContext.ExpectAssert(true);
1320 IKernelService::GetInstance()->Wait(nullptr, &mutex, 10);
1321 CHECK_TEXT(false, "sync object must not be NULL");
1322 }
1323 catch (TestAssertPassed &pass)
1324 {
1325 CHECK(true);
1327 }
1328}

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() [63/143]

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

Definition at line 1255 of file stktest_kernel.cpp.

1256{
1258 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1260
1261 kernel.Initialize();
1262 kernel.AddTask(&task);
1263 kernel.Start();
1264
1265 try
1266 {
1267 g_TestContext.ExpectAssert(true);
1268 IKernelService::GetInstance()->Wait(nullptr, nullptr, 0);
1269 CHECK_TEXT(false, "kernel does not support waiting without KERNEL_SYNC");
1270 }
1271 catch (TestAssertPassed &pass)
1272 {
1273 CHECK(true);
1275 }
1276
1277 // test return NULL
1280 IWaitObject *wo = IKernelService::GetInstance()->Wait(nullptr, nullptr, 0);
1283 CHECK_TRUE_TEXT(wo == nullptr, "expect NULL");
1284
1285 try
1286 {
1288 platform->EventTaskWait(0, nullptr, nullptr, 0);
1289 CHECK_TEXT(false, "kernel does not support waiting without KERNEL_SYNC");
1290 }
1291 catch (TestAssertPassed &pass)
1292 {
1293 CHECK(true);
1294 g_TestContext.ExpectAssert(false);
1295 }
1296
1297 // test return NULL
1298 g_TestContext.ExpectAssert(true);
1299 g_TestContext.RethrowAssertException(false);
1300 wo = platform->EventTaskWait(0, nullptr, nullptr, 0);
1301 g_TestContext.RethrowAssertException(true);
1302 g_TestContext.ExpectAssert(false);
1303 CHECK_TRUE_TEXT(wo == nullptr, "expect NULL");
1304}
IWaitObject * EventTaskWait(size_t caller_SP, ISyncObject *sync_obj, IMutex *mutex, Timeout timeout)
Definition stktest.h:236

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() [64/143]

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

Definition at line 1354 of file stktest_kernel.cpp.

1355{
1358
1360 SyncObjectMock sobj;
1361
1362 kernel.Initialize();
1363 kernel.AddTask(&task);
1364 kernel.Start();
1365
1366 try
1367 {
1368 g_TestContext.ExpectAssert(true);
1369 IKernelService::GetInstance()->Wait(&sobj, &mutex, 0);
1370 CHECK_TEXT(false, "must not be zero wait");
1371 }
1372 catch (TestAssertPassed &pass)
1373 {
1374 CHECK(true);
1376 }
1377}

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() [65/143]

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

Definition at line 1404 of file stktest_kernel.cpp.

1405{
1407 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1409
1411 SyncObjectMock sobj;
1412
1413 kernel.Initialize();
1414 kernel.AddTask(&task);
1415 kernel.Start();
1416
1417 {
1418 //MutexMock::ScopedLock guard(mutex);
1419
1420 //IKernelService::GetInstance()->Wait(&sobj, &mutex, 10);
1421 }
1422
1423 // task1 exited (will schedule its removal)
1424 platform->EventTaskExit(platform->m_stack_active);
1425
1426 platform->ProcessTick();
1427
1428 // should be still running here, next tick will result in task exit and kernel stop
1429 CHECK_EQUAL(IKernel::STATE_RUNNING, kernel.GetState());
1430
1431 platform->ProcessTick();
1432
1433 // should be stopped here
1434 CHECK_EQUAL(IKernel::STATE_READY, kernel.GetState());
1435}

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() [66/143]

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

Definition at line 1503 of file stktest_kernel.cpp.

1504{
1506}

References Test_SyncWait().

Here is the call graph for this function:

◆ TEST() [67/143]

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

Definition at line 1508 of file stktest_kernel.cpp.

1509{
1511}

References Test_SyncWait().

Here is the call graph for this function:

◆ TEST() [68/143]

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

Definition at line 1513 of file stktest_kernel.cpp.

1514{
1516 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1518
1520 SyncObjectMock sobj;
1521
1523 g_SyncWaitRelaxCpuContext.platform = platform;
1524 g_SyncWaitRelaxCpuContext.check_tickless = 0; // check first tick
1526
1527 kernel.Initialize();
1528 kernel.AddTask(&task);
1529 kernel.Start();
1530
1532
1533 // sleep_ticks should be equal to 2 on first OnTick call
1535
1536 // in total 4 ticks must be elapsed, including sleep ticks
1537 CHECK_EQUAL(4, platform->m_ticks_count);
1538
1539 // at this stage test should pass successfully by validating sleep_ticks in SyncWaitRelaxCpuContext::Process
1540
1541 CHECK_EQUAL(GetTid(), wo->GetTid());
1542 CHECK_TRUE(wo != nullptr);
1543 CHECK_TRUE(wo->IsTimeout());
1544 CHECK_EQUAL(3, g_SyncWaitRelaxCpuContext.counter);
1545 CHECK_EQUAL(true, mutex.m_locked);
1546}
TId GetTid()
Get task/thread Id of the calling task.
Definition stk_helper.h:227
static void SyncWaitRelaxCpu()
Wait object.
Definition stk_common.h:270
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:447

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() [69/143]

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

Definition at line 869 of file stktest_kernel.cpp.

870{
872 TaskMock<ACCESS_USER> task1, task2;
873 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
874 Stack *&idle = platform->m_stack_idle, *&active = platform->m_stack_active;
875 bool suspended = false;
876
877 g_TaskSuspendContext.Clear();
878 g_TaskSuspendContext.platform = platform;
879 g_TaskSuspendContext.kernel = &kernel;
880 g_TaskSuspendContext.task1 = &task1;
881 g_TaskSuspendContext.task2 = &task2;
883
884 kernel.Initialize();
885 kernel.AddTask(&task1);
886 kernel.AddTask(&task2);
887 kernel.Start();
888
889 // task1 is active after Start
890 CHECK_EQUAL(active->SP, (Word)task1.GetStack());
891
892 // task1 is calling SuspendTask to suspend self
893 kernel.SuspendTask(&task1, suspended);
894 CHECK_TRUE(suspended);
895
896 // task1 became active after we resumed it TaskSuspendContext::Process
897 CHECK_EQUAL(active->SP, (Word)task1.GetStack());
898
899 // task1 is calling SuspendTask for task2
900 kernel.SuspendTask(&task2, suspended);
901 CHECK_TRUE(suspended);
902
903 // task2 is suspended
904 platform->ProcessTick();
905 CHECK_EQUAL(idle->SP, (Word)task2.GetStack());
906
907 // task2 is suspended
908 platform->ProcessTick();
909 CHECK_EQUAL(idle->SP, (Word)task2.GetStack());
910
911 // task1 is calling ResumeTask for task2
912 kernel.ResumeTask(&task2);
913
914 // task2 becomes active
915 platform->ProcessTick();
916 CHECK_EQUAL(active->SP, (Word)task2.GetStack());
917}
static void TaskSuspendRelaxCpu()
void ResumeTask(ITask *user_task)
Resume task.
Definition stk.h:1006
void SuspendTask(ITask *user_task, bool &suspended)
Suspend task.
Definition stk.h:971

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), g_RelaxCpuHandler, g_TaskSuspendContext, 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::Kernel< TMode, TSize, TStrategy, TPlatform >::ResumeTask(), stk::Stack::SP, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::SuspendTask(), and TaskSuspendRelaxCpu().

Here is the call graph for this function:

◆ TEST() [70/143]

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(Timeout ticks)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:370
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() [71/143]

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(Timeout ms)
Delay calling process by busy-waiting until the deadline expires.
Definition stk_helper.h:381

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() [72/143]

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:238
IKernelService mock.
Definition stktest.h:287
uint32_t GetTickResolution() const
Get number of microseconds in one tick.
Definition stktest.h:315

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() [73/143]

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:268

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() [74/143]

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() [75/143]

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() [76/143]

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:291

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() [77/143]

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() [78/143]

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() [79/143]

◆ TEST() [80/143]

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() [81/143]

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() [82/143]

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(Timeout ms)
Put calling process into a sleep state.
Definition stk_helper.h:339
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() [83/143]

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() [84/143]

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() [85/143]

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() [86/143]

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:128

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() [87/143]

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() [88/143]

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() [89/143]

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() [90/143]

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() [91/143]

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

Definition at line 742 of file stktest_kernelservice.cpp.

743{
746
747 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
748
749 platform->m_systimer_count = 99;
750 platform->m_systimer_freq = 1000;
751
752 kernel.Initialize();
753 kernel.AddTask(&task);
754 kernel.Start();
755
756 uint32_t freq = stk::GetSysTimerFrequency();
757 uint64_t count = stk::GetSysTimerCount();
758
759 CHECK_EQUAL(1000, freq);
760 CHECK_EQUAL(99, count);
761}
uint32_t GetSysTimerFrequency()
Get system timer frequency.
Definition stk_helper.h:315
Cycles GetSysTimerCount()
Get system timer count value.
Definition stk_helper.h:306

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetSysTimerCount(), stk::GetSysTimerFrequency(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::test::PlatformTestMock::m_systimer_count, stk::test::PlatformTestMock::m_systimer_freq, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [92/143]

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}

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Delay(), g_DelayContext, g_TestContext, stk::Kernel< TMode, TSize, TStrategy, TPlatform >::GetPlatform(), stk::GetTicks(), 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() [93/143]

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

Definition at line 126 of file stktest_time.cpp.

127{
128 time::PeriodicTrigger trigger(PERIOD, true);
129
131 CHECK_FALSE(trigger.Poll());
132
134 CHECK_FALSE(trigger.Poll());
135
137 CHECK_TRUE(trigger.Poll()); // Total 110ms accumulated
138}
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() [94/143]

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

Definition at line 87 of file stktest_time.cpp.

88{
89 time::PeriodicTrigger trigger(PERIOD, true);
90
92 CHECK_FALSE(trigger.Poll());
93}

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

Here is the call graph for this function:

◆ TEST() [95/143]

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

Definition at line 95 of file stktest_time.cpp.

96{
97 time::PeriodicTrigger trigger(PERIOD, true);
98
100 CHECK_TRUE(trigger.Poll());
101}

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

Here is the call graph for this function:

◆ TEST() [96/143]

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

Definition at line 140 of file stktest_time.cpp.

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

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

Here is the call graph for this function:

◆ TEST() [97/143]

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

Definition at line 68 of file stktest_time.cpp.

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

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

Here is the call graph for this function:

◆ TEST() [98/143]

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

Definition at line 103 of file stktest_time.cpp.

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

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

Here is the call graph for this function:

◆ TEST() [99/143]

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

Definition at line 169 of file stktest_misc.cpp.

170{
173
174 CHECK_TRUE(NULL != wrapper.GetStack());
175 CHECK_EQUAL((Word *)&memory, wrapper.GetStack());
176}
Memory-related primitives.
Adapts an externally-owned stack memory array to the IStackMemory interface.
Definition stk_helper.h:184
StackMemoryDef< _StackSize >::Type MemoryType
The concrete array type that this wrapper accepts, equivalent to StackMemoryDef<_StackSize>::Type.
Definition stk_helper.h:189

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

Here is the call graph for this function:

◆ TEST() [100/143]

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

Definition at line 178 of file stktest_misc.cpp.

179{
182
183 CHECK_EQUAL(STACK_SIZE_MIN, wrapper.GetStackSize());
184 CHECK_EQUAL(sizeof(memory) / sizeof(Word), wrapper.GetStackSize());
185}
@ 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() [101/143]

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

Definition at line 187 of file stktest_misc.cpp.

188{
191
192 CHECK_EQUAL(STACK_SIZE_MIN * sizeof(Word), wrapper.GetStackSizeBytes());
193 CHECK_EQUAL(sizeof(memory), wrapper.GetStackSizeBytes());
194}

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

Here is the call graph for this function:

◆ TEST() [102/143]

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() [103/143]

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() [104/143]

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() [105/143]

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() [106/143]

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() [107/143]

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() [108/143]

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() [109/143]

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() [110/143]

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() [111/143]

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() [112/143]

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() [113/143]

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() [114/143]

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:408

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() [115/143]

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() [116/143]

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() [117/143]

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() [118/143]

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() [119/143]

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() [120/143]

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() [121/143]

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() [122/143]

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() [123/143]

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() [124/143]

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() [125/143]

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() [126/143]

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() [127/143]

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() [128/143]

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() [129/143]

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() [130/143]

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() [131/143]

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() [132/143]

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() [133/143]

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() [134/143]

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() [135/143]

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() [136/143]

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() [137/143]

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() [138/143]

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

Definition at line 132 of file stktest_misc.cpp.

133{
136
137 CHECK_EQUAL((Word)&task, task.GetId());
138 CHECK_EQUAL((Word)&taskw, taskw.GetId());
139
140 // expect NULL name by default
141 CHECK_EQUAL((const char *)NULL, task.GetTraceName());
142 CHECK_EQUAL((const char *)NULL, taskw.GetTraceName());
143}
virtual const char * GetTraceName() const
Override in subclass to supply a name for SEGGER SystemView tracing. Returns NULL by default.
Definition stk_helper.h:81
virtual const char * GetTraceName() const
Override in subclass to supply a name for SEGGER SystemView tracing. Returns NULL by default.
Definition stk_helper.h:151

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() [139/143]

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:127

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() [140/143]

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(Word), task.GetStackSizeBytes());
90 CHECK_EQUAL(TaskMock<ACCESS_USER>::STACK_SIZE * sizeof(Word), 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:128

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() [141/143]

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

Definition at line 93 of file stktest_misc.cpp.

94{
97
98 // not initialized with STK_STACK_MEMORY_FILLER
99 CHECK_EQUAL(0, task.GetStackSpace());
100
101 kernel.Initialize();
102 kernel.AddTask(&task);
103 kernel.Start();
104
105 size_t space = task.GetStackSpace();
106
107 // initialized with STK_STACK_MEMORY_FILLER, all free
108 CHECK_EQUAL(TaskMock<ACCESS_USER>::STACK_SIZE, space);
109
110 // write something to bottom
111 task.GetStack()[task.GetStackSize() - 1] = 0x12345678;
112 task.GetStack()[task.GetStackSize() - 2] = 0x12345678;
113
114 space = task.GetStackSpace();
115
116 // consumed 1 Word
117 CHECK_EQUAL(TaskMock<ACCESS_USER>::STACK_SIZE - 2, space);
118}
virtual size_t GetStackSpace()
Get available stack space.
Definition stk_common.h:252

References stk::Kernel< TMode, TSize, TStrategy, TPlatform >::AddTask(), stk::Task< _StackSize, _AccessMode >::GetStack(), stk::Task< _StackSize, _AccessMode >::GetStackSize(), stk::IStackMemory::GetStackSpace(), stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Initialize(), stk::Task< STACK_SIZE_MIN, _AccessMode >::STACK_SIZE, and stk::Kernel< TMode, TSize, TStrategy, TPlatform >::Start().

Here is the call graph for this function:

◆ TEST() [142/143]

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

Definition at line 120 of file stktest_misc.cpp.

121{
124
125 // TaskMock inherits Task and Task does not support weights (1)
126 CHECK_EQUAL(1, task.GetWeight());
127
128 // TaskMockW supports weights as it inherits TaskW
129 CHECK_EQUAL(10, taskw.GetWeight());
130}
virtual int32_t GetWeight() const
Default weight of 1. Override in subclass if custom scheduling weight is needed.
Definition stk_helper.h:73
virtual int32_t GetWeight() const
Returns the compile-time weight _Weight.
Definition stk_helper.h:143

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

Here is the call graph for this function:

◆ TEST() [143/143]

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

Definition at line 145 of file stktest_misc.cpp.

146{
148
149 try
150 {
151 g_TestContext.ExpectAssert(true);
152 // on next tick kernel will attempt to remove pending task and will check its deadline
153 taskw.OnDeadlineMissed(0);
154 CHECK_TEXT(false, "expecting assertion - task with weights do not support HRT");
155 }
156 catch (TestAssertPassed &pass)
157 {
158 CHECK(true);
160 }
161}
virtual void OnDeadlineMissed(uint32_t duration)
Hard Real-Time mode is unsupported for weighted tasks. Triggers an assertion if called.
Definition stk_helper.h:134

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 196 of file stktest_misc.cpp.

197{
198 void setup() {}
199 void teardown() {}
200
201 struct ListEntry : public stk::util::DListEntry<ListEntry, true>
202 {
203 int32_t m_id;
204 ListEntry(int32_t id) : m_id(id) {}
205 };
206
207 typedef stk::util::DListHead<ListEntry, true> ListHead;
208};
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 58 of file stktest_time.cpp.

59{
60 enum { PERIOD = 100 };
61
62 void setup()
63 {
65 }
66};

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 163 of file stktest_misc.cpp.

164{
165 void setup() {}
166 void teardown() {}
167};

◆ 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 1475 of file stktest_kernel.cpp.

1476{
1478 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1480
1482 SyncObjectMock sobj;
1483
1485 g_SyncWaitRelaxCpuContext.platform = platform;
1487
1488 kernel.Initialize();
1489 kernel.AddTask(&task);
1490 kernel.Start();
1491
1493
1495
1496 CHECK_EQUAL(GetTid(), wo->GetTid()); // expect the same thread id as WaitObject belongs to the caller's task
1497 CHECK_TRUE(wo != nullptr); // expect wait object in return after timeout
1498 CHECK_TRUE(wo->IsTimeout()); // expect timeout
1499 CHECK_EQUAL(2, g_SyncWaitRelaxCpuContext.counter); // expect 2 ticks after timeout
1500 CHECK_EQUAL(true, mutex.m_locked); // expect locked mutex after Wait return
1501}
@ 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 1135 of file stktest_kernel.cpp.

1136{
1138 TaskMock<ACCESS_USER> task1, task2;
1139 PlatformTestMock *platform = static_cast<PlatformTestMock *>(kernel.GetPlatform());
1140 const _SwitchStrategy *strategy = static_cast<const _SwitchStrategy *>(kernel.GetSwitchStrategy());
1141
1142 kernel.Initialize();
1143 kernel.AddTask(&task1, 1, 2, 0);
1144 kernel.AddTask(&task2, 1, 2, 2);
1145 kernel.Start();
1146
1147 // task1 is the first
1148 CHECK_EQUAL((Word)task1.GetStack(), platform->m_stack_active->SP);
1149
1150 // task returns (exiting) without calling SwitchToNext
1151 platform->EventTaskExit(platform->m_stack_active);
1152
1153 platform->ProcessTick(); // schedules task removal but task2 is still sleeping
1154
1155 // here scheduler is sleeping because task1 was sent to infinite sleep until removal and task2 is still pending
1156
1157 platform->ProcessTick(); // task2 is still sleeping
1158 platform->ProcessTick(); // switched to task2
1159
1160 CHECK_EQUAL((Word)task2.GetStack(), platform->m_stack_active->SP);
1161
1162 CHECK_EQUAL(1, strategy->GetSize());
1163}

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 platform->ProcessTick();
628
629 // no Idle tasks left
630 CHECK_EQUAL((Stack *)NULL, idle);
631
632 // Exit trap stack is provided for a long jump to the end of Kernel::Start()
633 CHECK_EQUAL(platform->m_exit_trap, active);
634}

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_TaskSuspendContext

struct stk::test::TaskSuspendContext stk::test::g_TaskSuspendContext
static

Referenced by TaskSuspendRelaxCpu(), and TEST().

◆ g_TestContext