static inline struct task *select_best_task(void) { unsigned long maxprio; int i; struct task *f, *best; maxprio = MAXUINT; /* Init to the least priority */ best = NULL; for (i=0, f=taskset; i<active_tasks; ++f) { /* If f exceded taskset[MAX_NUM_TASKS] means that active_tasks * had a value greater than the real number of active tasks */ if (f - taskset >= MAX_NUM_TASKS) panic0(); if (!f->valid) continue; ++i; /* This task is active */ /* There are no job released at this time for this task */ if (f->released == 0) continue; /* Check the priority */ if (f->priority < maxprio) { maxprio = f->priority; best = f; } } return best; }
void task_entry_point(struct task *t) { for (;;) { if (t->valid == 0 || t->released == 0) panic0(); irq_enable(); t->job(t->arg); irq_disable(); --t->released; if (t->deadline != 0) { if (time_after(ticks, t->priority)) { puts("EDF task '"); puts(t->name); puts("' deadline miss!\n"); } t->priority += t->period; } _sys_schedule(); } }