|
@@ -121,6 +121,9 @@ typedef struct TaskControlBlock {
|
|
|
|
|
|
TaskContext mTaskContext ;
|
|
|
|
|
|
+
|
|
|
+ uint32_t mDeadline ;
|
|
|
+
|
|
|
|
|
|
uint8_t mTaskIndex ;
|
|
|
} TaskControlBlock ;
|
|
@@ -148,6 +151,8 @@ TaskControlBlock * gRunningTaskControlBlockPtr asm ("var.running.task.control.bl
|
|
|
|
|
|
static TaskList gReadyTaskList ;
|
|
|
|
|
|
+static TaskList gDeadlineWaitingTaskList ;
|
|
|
+
|
|
|
|
|
|
static void kernel_makeTaskReady (IRQ_MODE_ TaskControlBlock * inTaskPtr) {
|
|
|
XTR_ASSERT_NON_NULL_POINTER (inTaskPtr) ;
|
|
@@ -200,7 +205,27 @@ static void kernel_makeNoTaskRunning(KERNEL_MODE) {
|
|
|
gRunningTaskControlBlockPtr = nullptr;
|
|
|
}
|
|
|
|
|
|
+void kernel_blockOnDeadline (KERNEL_MODE_ const uint32_t inDeadline) {
|
|
|
+ XTR_ASSERT_NON_NULL_POINTER (gRunningTaskControlBlockPtr) ;
|
|
|
+ gRunningTaskControlBlockPtr->mDeadline = inDeadline ;
|
|
|
+ gDeadlineWaitingTaskList.enterTask (MODE_ gRunningTaskControlBlockPtr) ;
|
|
|
+ kernel_makeNoTaskRunning (MODE) ;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
void service_taskSelfTerminates(KERNEL_MODE) {
|
|
|
kernel_makeNoTaskRunning(MODE);
|
|
|
}
|
|
|
+
|
|
|
+static void irq_makeTasksReadyFromCurrentDate (IRQ_MODE_ const uint32_t inCurrentDate) {
|
|
|
+ TaskList::Iterator iterator (MODE_ gDeadlineWaitingTaskList) ;
|
|
|
+ TaskControlBlock * task ;
|
|
|
+ while ((task = iterator.nextTask (MODE))) {
|
|
|
+ if (inCurrentDate >= task->mDeadline) {
|
|
|
+ gDeadlineWaitingTaskList.removeTask (MODE_ task) ;
|
|
|
+ kernel_makeTaskReady (MODE_ task) ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+MACRO_REAL_TIME_ISR (irq_makeTasksReadyFromCurrentDate) ;
|