26 de marzo de 2010

Error "Access violation at"...al depurar

Diego (curso 2009-2010) escribe un programa, lo compila con Keil y comienza la depuración. Empieza a usar "F11" para ejecutar paso a paso y encuentra el siguiente error:








El código es el siguiente:

sfr P1=0x90;
sfr P2=0xA0;
void main(void)
{int i;
i=P1&0x07;
switch(i){
case 0:P2=0x3f; break;
case 1:P2=0x06; break;
case 2:P2=0x5b; break; }
}

Cuando se graba un programa en el micro, empieza a ejecutarse inmediatamente desde el punto de entrada (main). Si te fijas, en el programa del ejemplo, sólo se ejecuta una vez ya que no está dentro de ningún bucle.

En un microcontrolador hay que 'encerrar' al programa en un bucle infinito (dentro de un "while"). El motivo es que al grabar el programa en la memoria y comienza la ejecución si no tiene un bucle rápidamente llega al final, pero no se detiene y sigue buscando instrucciones en las posiciones de memoria siguientes, pero como no encuentra nada 'coherente' se genera un error de ejecución. Por lo tanto el programa escrito correctamente sería:

sfr P1=0x90;
sfr P2=0xA0;
void main(void)
{
int i;
while(1) {
i=P1&0x07;
switch(i){
case 0:P2=0x3f; break;
case 1:P2=0x06; break;
case 2:P2=0x5b; break; }
}
}

No hay comentarios: