37 CHECK_TEXT(
false,
"expecting assertion when empty");
56 CHECK_EQUAL(0, strategy->
GetSize());
59 CHECK_EQUAL(0, strategy->
GetNext());
75 CHECK_TEXT(
false,
"expecting assertion - OnTaskDeadlineMissed not supported");
98 kernel.
AddTask(&task1, 300, 300, 0);
99 kernel.
AddTask(&task2, 200, 200, 0);
100 kernel.
AddTask(&task3, 100, 100, 0);
105 CHECK_EQUAL_TEXT(&task3, next->
GetUserTask(),
"EDF must select task with earliest relative deadline");
109 CHECK_EQUAL_TEXT(&task3, next->
GetUserTask(),
"EDF must continue selecting earliest-deadline task");
115 CHECK_EQUAL_TEXT(&task2, next->
GetUserTask(),
"after removal, task2 has earliest relative deadline");
121 CHECK_EQUAL_TEXT(&task1, next->
GetUserTask(),
"only remaining task must be selected");
134 kernel.
AddTask(&task1, 300, 300, 0);
139 for (int32_t i = 0; i < 5; i++)
142 CHECK_EQUAL_TEXT(&task1, next->
GetUserTask(),
"single task must always be selected");
147 kernel.
AddTask(&task2, 200, 200, 0);
151 CHECK_EQUAL_TEXT(&task2, next->
GetUserTask(),
"task2 with earlier deadline should preempt task1");
155 CHECK_EQUAL_TEXT(&task2, next->
GetUserTask(),
"task2 remains earliest-deadline task");
159 kernel.
AddTask(&task3, 100, 100, 0);
162 CHECK_EQUAL_TEXT(&task3, next->
GetUserTask(),
"task3 with earliest deadline should run first");
165 CHECK_EQUAL_TEXT(&task3, next->
GetUserTask(),
"task3 continues to run as earliest-deadline task");
172 CHECK_EQUAL_TEXT(&task2, next->
GetUserTask(),
"task2 becomes earliest-deadline after task3 removal");
175 CHECK_EQUAL_TEXT(&task2, next->
GetUserTask(),
"task2 continues as earliest-deadline task");
180 CHECK_EQUAL_TEXT(&task1, next->
GetUserTask(),
"task1 remains as only task");
192 kernel.
AddTask(&task, 10, 5, 0);
198 CHECK_TRUE_TEXT(ktask !=
nullptr,
"Kernel task must exist");
204 CHECK_EQUAL_TEXT(5, ktask->
GetHrtRelativeDeadline(),
"at release: relative deadline must equal deadline");
209 CHECK_EQUAL_TEXT(4, ktask->
GetHrtRelativeDeadline(),
"after 1 tick: relative deadline must decrease by 1");
214 CHECK_EQUAL_TEXT(3, ktask->
GetHrtRelativeDeadline(),
"after 2 ticks: relative deadline must decrease by 2");
219 CHECK_EQUAL_TEXT(2, ktask->
GetHrtRelativeDeadline(),
"after 3 ticks: relative deadline must decrease by 3");
258 CHECK_EQUAL_TEXT((
size_t)
task3->GetStack(), active->
SP,
"tick 0: task3 earliest deadline");
265 CHECK_EQUAL_TEXT((
size_t)
task2->GetStack(), active->
SP,
"tick 1: task2 earliest deadline");
272 CHECK_EQUAL_TEXT((
size_t)
task1->GetStack(), active->
SP,
"tick 3+: task1 earliest deadline");
294 kernel.
AddTask(&task1, 4, 4, 0);
295 kernel.
AddTask(&task2, 3, 3, 0);
296 kernel.
AddTask(&task3, 2, 2, 0);
312 CHECK_EQUAL(0, task2.m_deadline_missed);
313 CHECK_EQUAL(0, task3.m_deadline_missed);
void(* g_RelaxCpuHandler)()
__stk_relax_cpu handler.
Namespace of STK package.
void Yield()
Notify scheduler to switch to the next runnable task.
Namespace of the test inventory.
TestContext g_TestContext
Global instance of the TestContext.
static void g_EDFDynamicSchedulingContextProcess()
static struct stk::test::EDFDynamicSchedulingContext g_EDFDynamicSchedulingContext
Concrete implementation of IKernel.
void Initialize(uint32_t resolution_us=PERIODICITY_DEFAULT)
Prepare kernel for use: reset state, configure the platform, and register the service singleton.
ITaskSwitchStrategy * GetSwitchStrategy()
Get task-switching strategy instance owned by this kernel.
void Start()
Start the scheduler. This call does not return until all tasks have exited (KERNEL_DYNAMIC mode) or i...
void RemoveTask(ITask *user_task)
Remove a previously added task from the kernel before Start().
IPlatform * GetPlatform()
Get platform driver instance owned by this kernel.
void AddTask(ITask *user_task)
Register task for a soft real-time (SRT) scheduling.
Word SP
Stack Pointer (SP) register (note: must be the first entry in this struct).
Scheduling-strategy-facing interface for a kernel task slot.
virtual Timeout GetHrtRelativeDeadline() const =0
Get HRT task's relative deadline.
virtual ITask * GetUserTask()=0
Get user task.
Interface for a task switching strategy implementation.
virtual size_t GetSize() const =0
Get number of tasks currently managed by this strategy.
virtual IKernelTask * GetNext()=0
Advance the internal iterator and return the next runnable task.
virtual IKernelTask * GetFirst() const =0
Get first task.
virtual bool OnTaskDeadlineMissed(IKernelTask *task)=0
Notification that a task has exceeded its HRT deadline; returns whether the strategy can recover with...
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).
TaskMock< ACCESS_USER > * task1
TaskMock< ACCESS_USER > * task3
TaskMock< ACCESS_USER > * task2
EDFDynamicSchedulingContext()
PlatformTestMock * platform
Throwable class for catching assertions from STK_ASSERT_HANDLER().
void ProcessTick()
Process one tick.
uint32_t m_deadline_missed
duration of workload if deadline is missed in HRT mode