Пример #1
0
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;
}
Пример #2
0
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();
	}
}