Practico 8, ejercicio 3

Practico 8, ejercicio 3

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 8

Buenas, comparto mi solucion a ver si esta mal ya que tenia dudas...

#define TECLA

void interrupt RUTINA1 () {

   while (in (TECLA) != "ESC") { }

   jmp (padr ());

} //Este codigo es el mismo para RUTINA2 y RUTINA3

void main () {

   //Instalo rutinas de interrupciones

   enable ();

   while (TRUE){

      if ( (in (TECLA) == "ESC1") | (in (TECLA) == "ESC2") | (in (TECLA) == "ESC3") )

         jmp (radr (in (TECLA)));

   }

}

Agradezco aportes y correcciones!

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 8, ejercicio 3

de Noelia Magali Lencina Alfonso -
Hola, 

Aún estoy luchando con este ejercicio, pero me atrevo a hacer algún comentario.

En el main, cada vez que estás llamando a in(TECLA) y estás comparando con ESCX, estás tomando como el byte que lees de la dirección TECLA contiene la cadena ESCX, pero por lo que entendí en la letra, vos tendrías que leer TECLA, ver si viene el caracter ESC (yo lo compararía según su código ASCII en lugar que por ESC, o definiría una constante ESC, pero no sé qué tan correcto es eso), y luego si vino y el control lo tiene el programa padre, ves si viene el 1, el 2 o el 3 y ahí recién le pasas el control a la rutina que corresponda. Además, TECLA es una dirección pero no es la dirección de una rutina en particular. Si en TECLA viene la secuencia <ESC><1>, tendrías que hacer algo así como tmp = radr(RUTINA1) para obtener la dirección de la RUTINA1 y luego jmp(tmp).

Si le estoy errando a algo, por favor corregir. Espero haber sido clara.

En respuesta a Noelia Magali Lencina Alfonso

Re: Practico 8, ejercicio 3

de Hugo Sebastian Rodriguez Reyes -
Vos decis que para leer la secuencia de teclas <ESC><1> por ejemplo, primero tendrias que hacer algo asi:


while (TRUE){

   if (in (TECLA) == "ESC"){

      if (in (TECLA) == "1")

         jmp (radr (RUTINA1));

      else if (in (TECLA) == "2")

         jmp (radr (RUTINA2));

      else if (in (TECLA) == "3")

         jmp (radr (RUTINA3));

   }

}

O sea, primero in (TECLA) para leer si lo que se presiono fue ESC y luego otro in (TECLA) para ver si lo siguiente que se presiono fue 1, 2 o 3?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 8, ejercicio 3

de Noelia Magali Lencina Alfonso -

Sí, eso, pero en lugar de usar if tendrías que esperar el primer ESC, después quedarte leyendo hasta que aparezca algo distinto de ESC y ahí fijarte si es 1,2 o 3. Si es algo de eso, ejecutas la rutina, sino, todo vuelve a empezar.

En respuesta a Noelia Magali Lencina Alfonso

Re: Practico 8, ejercicio 3

de Noelia Magali Lencina Alfonso -

Escribo lo que hice por si alguien puede leerlo y ver si hay algo raro:

#define ESC

void interrumpir_rutina(){

   unsigned chat tmp = in(TECLA);

   while(tmp!=ESC)

      tmp=in(TECLA);

   jmp(padr());

}

void main(){

   //instalar interrupciones

   unsigned char tmp;

   while (true){

      tmp = in(TECLA);

     if (tmp==ESC){

      while(tmp == ESC)

         tmp = in(TECLA);

      switch(tmp){

         case 1: tmp = radr(RUTINA1);

                     jmp(tmp);

         case 2: tmp = radr(RUTINA2);

                     jmp(tmp);

         case 3: tmp = radr(RUTINA3);

                     jmp(tmp);

     }

   }

}

}

En respuesta a Noelia Magali Lencina Alfonso

Re: Practico 8, ejercicio 3

de Hugo Sebastian Rodriguez Reyes -

Me convence tu codigo, unos detalles, cuando haces:

 unsigned chat tmp = in(TECLA);

   while(tmp!=ESC)

      tmp=in(TECLA);

Es necesaria definirte esa variable tmp? Porque in es una funcion, o sea que te devuelve lo que venga del dispositivo de E/S, yo lo pondria directo en el while asi:

while (in (TECLA) != ESC)

Lo mismo en el main, xq pones:

    tmp = in(TECLA);

     if (tmp==ESC){

      while(tmp == ESC)

Estas chequeando con un if y con un while lo mismo, no es mejor usar un while solo con el detalle anterior?

Lo otro es una sutileza, pero en el switch tendrias que poner case "1", ya que la variable tmp la definiste como un caracter y no como un numero, no?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 8, ejercicio 3

de Noelia Magali Lencina Alfonso -

Sí, no es necesario declarar tmp, es como que ya lo tengo automatizado. A veces lo hago para que en el while no me quede solo la sentencia vacía ; (aunque es correcto). En el switch sí, creo que tendría que poner case '1' porque efectivamente es un caracter ingresado desde el teclado.

Gracias!

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: Practico 8, ejercicio 3

de Ismael Schellemberg Gandolfo -

Corríjanme si me equivoco, pero creo que el ejercicio dice que se llama a una interrupción cada vez que se presiona una tecla.
En ese caso se tendría que guardar una flag "apretoEsc" cuando se aprieta ESC y la próxima vez que se llame a la interrupción chequear si ese flag está prendido y si se apretó 1,2,3.

Mi solución es así:



bool ejecutandoRutina;

bool apretoEsc;

void interrupcion_tecla() {

    char t = in(TECLA);

    if (ejecutandoRutina) {

        if (t == TECLA_ESC) {

ejecutandoRutina = false;

jmp(padr());

}

    } else {

if (apretoEsc) {

if (t == TECLA_1)

gotoRutina(RUTINA1);

else if (t == TECLA_2)

gotoRutina(RUTINA2);

else if (t == TECLA_3)

gotoRutina(RUTINA3);

}

apretoEsc = (t == TECLA_ESC);

}

}


void gotoRutina(string nombreRutina) {

ejecutandoRutina = true;

jmp(radr(nombreRutina));

}