Ejercicio 5

Ejercicio 5

de Diego Pereira Barneche -
Número de respuestas: 2

Hola, para resolver este ejercicio se me ocurrio algo así y me surguió unas dudas:

pongo como me quedo:

 

unsigned char dato;
unsigned char dispositivo;
unsigned char salida;
bool imprimir_dato_entrada;
bool imprimir_dato;

int concentrador(){

salida= 0x0FF;
imprimir_dato_entrada = false;
imprimir_dato = false;
habilitar_interrupciones();

while(true){
    out(0x20,salida);
}

}

int int_entrada(){
imprimir_dato_entrada=true;
if( in(0x10) % 2){
    dato = in(0x11);
    dispositivo = 0;
}
else ..... // Igual para cada uno de los dispositivos que siguen.. cambiando solo la dirección y el valor de la variable dispositivo;

}

int int_salida(){
if(imprimir_dato_entrada){
    if(imprimir_dato){
         salida = dato;
         imprimir_dato_entrada = false;
         imprimir_dato = false;
    }
    else{
         salida = dispositivo;
         imprimir_dato = true;
    }

else {
     salida = 0x0FF;
}

Esto esta correcto?

Y luego las dudas que me surguen son las siguientes, que pasaria si dos dispositivos mandan interrupción al mismo tiempo? o de forma tal que solo llegue una interrupción? si es por nivel ta, pero si es por flanco?
Puedo desactivar las interrupciones dentro de un procedimiento de interrupción? Por ejemplo si quisiera que no se pueda interrumpir hasta que se halla transmitido el dispositivo y el dato? dejando el procedimiento int_salida de esta forma:

 

int int_salida(){
if(imprimir_dato_entrada){
    if(imprimir_dato){
         salida = dato;
         imprimir_dato_entrada = false;
         imprimir_dato = false;
    }
    else{

         salida = dispositivo;
         imprimir_dato = true;
         deshabilitar_interrupciones();
    }

else {
     salida = 0x0FF;
     habilitar_interrupciones();
}

En respuesta a Diego Pereira Barneche

Re: Ejercicio 5

de Anthony Martin Cabrera Gonzalez -

Capaz que no responde a tu duda planteada, pero por lo menos para corroborar te dejo la solución oficial. Si te fijas, ellos no hacen "else if" en INT_ENTRADA, capaz que tenga algo que ver?. Yo lo hice similar a la sol solo que en vez de usando una cola, use un arreglo viejo y peludo, aunque eso complica más porque tenes que manejar los dos indíces pero ta me base en el ejercicio que hicieron en teórico. 

Lo que me llama la atención en tu solución es que no utilizas un buffer (por ej: arreglo o cola), suponete esta situación: estas transimitiendo un dato por la salida que demora 30 segundos y cada 5 segundos recibiste un dato por la linea 1, al usar solo una variable "dato" estas sobrescribiendo cosas que en realidad tenes que transmitir.

Saludos

En respuesta a Anthony Martin Cabrera Gonzalez

Re: Ejercicio 5

de Manuela Viola Pastori -

Yo lo que hice fue esto:

 

#Define EST0 as 10H
#Define EST1 as 12H
#Define EST2 as 14H
#Define EST3 as 16H
#Define DATO0 as 11H
#Define DATO1 as 13H
#Define DATO2 as 15H
#Define DATO3 as 17H
#Define DATOS as 20H
#Define salDef as 0FFH

bool salidaOcupada;

void main(){
  salidaOcupada = false;
  while(true){
    if(!salidaOcupada){
       OUT(DATOS,salDef);
    }
  }
}

void interrupt INT_ENTRADA(){
  if(IN(EST0)%2){
    while(salidaOcupada);
      salidaOcupada = false;
      OUT(DATOS,0);
      while(salidaOcupada);
      salidaOcupada = false;
      OUT(DATOS,IN(DATO0));
    } else if(){
         .
         . lo mismo para los otros casos
         .
         .
    }

}

void interrupt INT_SALIDA(){
    salidaOcupada = false;
}

 

Aca no pierdo ningun dato creo pero esta mal que lo deje esperando todo el tiempo a que espere la salida, no? ademas si el primero interrumpe muy seguido los otros nunca se llegan a atender.