[Examen 22/02/2013][Problema 2]

[Examen 22/02/2013][Problema 2]

de Andres Bello Ureta -
Número de respuestas: 1

LETRA

Buenas, resolvi este ejercicio de una forma distinta a la solución propuesta, la diferencia esta en donde se escribió la lógica y otros detalles que marcaré en rojo para ver si estan bien.

//aca van los define y creación de variables etc
int obtenerDistancia(){
   encontre=FALSE;
   //instalo interrupciones
   enable();
   tics = 0;
   OUT(PING,128);
   WHILE (!encontre || tics < tics_max)
   IF (encontre)
       return c*tics*1000/2
   ELSE
       return -1
}

void interruption timer(){
   IF(IN(ECHO)&128)
      encontre=FALSE;
   ELSE
      tics++
}

*Porque en la solución no se instalan las interrupciones?

* La solución plantea que tics se inicialice despues de hacer el OUT(PING,128), eso es porque escribir en E/S demora y al inicializar tics antes puede que el timer empiece a contar sin que todavia se halla realizado la escritura?

*La solución escribe la lógica en timer() y esta le avisa cuando encontro el objeto o se paso del tiempo, eso es así porque respeta mejor el concepto de "interrupción"?

*Por último, agradeszco si pueden haceme notar algunos otros errores en la solución.

Muchas gracias.

   Saludos.

 

En respuesta a Andres Bello Ureta

Re: [Examen 22/02/2013][Problema 2]

de Gustavo Brown -

La parte de instalar la interrupción no va en la rutina obtenerDistancia. Va en el programa principal que no se pedia escribir en ese problema.

- Fijate que sino cada vez que quieras obtener un distancia vas a estar reinstalando la rutina que atiende las interrupciones (ISR). Normalmente (no lo vemos en detalle en este curso) la acción de instalar una rutina de atención a interrupciones no es idempotente porque lo normal es que las ISR se encadenen (varias rutinas pueden atender distintos dispositivos asociados al mismo número de interrupción).

- Lo de poner tics en 0 antes o después del OUT no cambia sustancialmente la solución, cualquiera de las dos es correcta.

- El código puede ponerse perfectamente parte en la interrupcion del temporizador y parte en la rutina. Lo que parece estar mal en tu solución es la condición de salida

Creo que debería decir

WHILE (!encontre && tics < tics_max) { }

para que se quede en el loop hasta que se detecte el eco o de "timeout".

Saludos,
  Gustavo