/* * 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; }
/* * 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(); }