Práctico 9 - Ejercicio 4

Práctico 9 - Ejercicio 4

de Franco Pelua Camacho -
Número de respuestas: 2
Hola, buenas tardes:

Las especificaciones del ejercicio 4 son: 
  • CPU con tres dispositivos de E/S (con tres direcciones ESTADO_1, ..._2 y ..._3) conectados a una misma línea INT.
  • La CPU atiende por nivel.
  • Cuando un dispositivo solicita interrumpir, se puede leer un 1 en la entrada de E/S correspondiente en el bit menos significativo.
  • Para atender al n-ésimo dispositivo, disponemos de la rutina atencionDispositivoN(), donde  N \in {1, 2, 3} .

Para la parte A del ejercicio, se pide implementar una rutina de interrupción en alto nivel capaz de atender a los tres dispositivos, considerando un esquema de prioridades fijas  prio(1) > prio(2) > prio(3) .

Se me ocurren dos posibles soluciones, que adjunto a continuación: 


Si bien las diferencias son sutiles, me surge una duda importante. 

En la solución rosada, entiendo que si los tres dispositivos solicitan atención, entonces en una única "invocación" de la rutina, se atiende a los tres. Además, por como está estructurado, primero se atiende al 1, luego al 2, luego al 3. A priori, esto cumple con lo solicitado en la parte A. 

No obstante, ¿Qué comportamiento debería tener una rutina de este estilo en caso de que tras atender al dispositivo 1, en seguida vuelva a solicitar atención? ¿Debería continuar atendiendo al resto y luego atender al 1, o debería atender nuevamente al 1? 

En este último caso, entiendo que la mejor solución es la solución azul, porque por cada llamada a la rutina de atención, siempre atiende a uno y solo a uno de los dispositivos, siempre preguntando primero por el que más prioridad tiene.

Me gustaría conocer que opinan respecto a esto. Muchas gracias de antemano. Saludos.

En respuesta a Franco Pelua Camacho

Re: Práctico 9 - Ejercicio 4

de Gustavo Brown -
Hola,
 La prioridad indica a quien debés atender primero cuando hay más de 1 dispositivo a la vez que quiera interrumpir.
La solución rosada no cumple esto por ejemplo si mientras se está atendiendo al dispositivo 2 tanto el dispositivo 1 como el 3 quieren interrumpir.
La solución azul sí cumple ese requisito. 

Igualmente deberías comparar con el bit menos significativo (&1) incluso para el tercer caso.

El estilo pensado en la solución rosa (poder atender más de 1 dispositivo en la misma invocación a la rutina de atención se puede acomodar de la siguiente manera):
void interrupt handleInt()

  while(true)
  { 
    if(in(ESTADO_1) & 1)
      atencion_dispositivo1();
    else if(in(ESTADO_2) & 1)
      atencion_dispositivo2();
    else if(in(ESTADO_3) & 1)
      atencion_dispositivo3();
    else break;
   }
}
Saludos,
  Gustavo