예제 #1
0
/*
	* Esta funcion actualiza las estructuras del scheduler.
	* Resuelve si tiene que saltar o no a alguna tarea.
	* Si no tiene que saltar a una tarea (de usr o idle), devuelve 0.
	* Si tiene que saltar a una tarea asd(de usr o idle), devuelve el selector. 
 */
unsigned short sched_master(){
	
	// Si hay pausa y no esta corriendo la idle, que corra la idle.
	if (hayPausa && tarea_actual != IDLE) return saltar_idle();
	
	// Si hay pausa y ya esta corriendo la idle, que siga corriendo.
	if (hayPausa) return 0;

	// Si hubo syscall tengo que saltar a la idle.
	if (huboSyscall) {
		huboSyscall = FALSE;
		return saltar_idle();
	}
	
	// Esto significa que vengo de una interrupcion.
	if (huboDesalojo) {
		huboDesalojo = FALSE;
		return saltar_idle();
	}
	
	// En este punto, no hubo desalojo, no hubo syscall y no hay pausa.
	if (cant_validas > 0) return sched_cambio_task();
	
	// cant_validas == 0
	if (tarea_actual == IDLE) return 0;
	

	return 0;
	
}
void desalojar_tarea(){
	unsigned int _tarea_actual = sched.TAREA_ACTUAL;
	saltar_idle(); // Antes de borrarlo salto a la tarea IDLE.

	// Desalojo Tarea y bandera, es decir los borro de sus respectivos arrays.
	indices_tareas[_tarea_actual].estado = 0;
}
예제 #3
0
/*
	* Esta funcion actualiza las estructuras del scheduler.
	* Resuelve si tiene que saltar o no a alguna tarea.
	* Si no tiene que saltar a una tarea (de usr o idle), devuelve 0.
	* Si tiene que saltar a una tarea (de usr o idle), devuelve el selector. 
 */
unsigned short sched_master(){
	
	// Si hay pausa y no esta corriendo la idle, que corra la idle.
	if (hayPausa && tarea_actual != IDLE) return saltar_idle();
	
	// Si hay pausa y ya esta corriendo la idle, que siga corriendo.
	if (hayPausa) return 0;

	if (cant_validas > 0) return sched_cambio_task();
	
	// cant_validas == 0
	if (tarea_actual == IDLE) return 0;
	
	// 	Si llegue hasta aca, significa que estoy llamando a esta funcion
	// desde una interrupcion que desalojo la ultima tarea valida
	return saltar_idle();
	
}