practico 7 ej 6

practico 7 ej 6

de Bruno Stefano Lombardo Palleiro -
Número de respuestas: 5

Buenas, quería saber si está solución es correcta.

saludos

En respuesta a Bruno Stefano Lombardo Palleiro

Re: practico 7 ej 6

de Federico Rivero -
Estimado,

Sí, es correcto :). Solo aclarar que en tu solución se asume que la máquina es dedicada y que el registro de E/S es de lectura y escritura. La letra no aclara ninguna de las dos cosas y por lo tanto el ejercicio es correcto, pero no quería dejar de mencionarlo.

Saludos,
Federico
En respuesta a Federico Rivero

Re: practico 7 ej 6

de Valentina Pereira Ciaffone -
Hola profe, yo hice una solución un poco diferente, pero me surgio una duda.
Cuando se que rutinas de interrupción debo de escribir? Porque yo cuando lei la letra interprete que el timer lo teníamos, luego en la rutina de la interrupción Botón lo que hacía era un while que contara el pasaje de los 45 segundos y luego apagara las luces, eso esta bien?

De ser así qué sucede cuando se aprietan reiteradas veces el botón, puedo asumir que no se haga nada por ejemplo?

Para que se entienda mejor dejo por aca lo que hice:
void main(){
   enable();
   while (true){};
}

void boton(){
   if (!(IN(0x20) & 0x01)){
        OUT(0x20, IN(0x20) l 0x01);
    }
    int i = 0;
    while (i<= 45){
       i++; }
    OUT( 0x20, IN(0x20) & 0xFE);
}
En respuesta a Valentina Pereira Ciaffone

Re: practico 7 ej 6

de Gustavo Brown -

Valentina,

  La letra te dice qué interrupciones tenes que implementar. En este caso son la interrupción del botón y la interrupción del tiempo.

Tu solución no resuelve el problema porque al presionar un botón al ejecutar la rutina asociada entras en un bucle que cuenta 45 iteraciones a velocidad de máquina, es decir casi instantáneamente va a recorrer las 45 iteraciones y luego ya apagas las luces.

Para contar tiempo tenés que usar la interrupción del temporizador, que en este ejercicio se dispara 1 vez por segundo.

En general sobre qué ocurre si se genera un pedido de interrupción mientras que la CPU tiene las interrupciones deshabilitadas (por ejemplo por estar ejecutando dentro de una rutina de atención a interrupción) la interrupción queda "marcada" para dispararse una vez que las interrupciones vuelvan a habilitarse. Esta marca es "booleana" o sea si hay N pedidos pendientes para alguna interrupción solamente se va a disparar 1 al habilitarse las interrupciones. Por ejemplo si estás dentro de la rutina del tiempo y apretas 2 veces seguidas el botón antes de que termine la rutina de tiempo va a quedar marcado para dispararse la interrupción del botón una única vez.

Saludos,
  Gustavo