variable local se reinicia a cero

0

Tengo un problema con el siguiente código. La variable loopTimes se restablece a 0 después de un bucle. El programa también tiene una rutina ISR para la interfaz TWI que actualiza el valor como se muestra en el siguiente código.

int main(void){
 //my var
 int loopTimes = 0;

 for(;;){

   if(loopTimes >= 0){ 
      loopTimes--;
      //Do some operations
   }
  // check if twi has data
   if(TWI_has_data()){

   //Read it into buffer
     twi_read_data(rxBuffer,2);
     if(loopTimes == 0){ // set the variable if it has reached zero
       loopTimes = rxBuffer[0];
     }
   }
 }
}

La configuración es un ATMEGA 8L en una placa personalizada con un cristal externo de 8 MHZ, programa compilado utilizando Atmel Studio 6 con optimización del compilador en el nivel 1. No puedo averiguar por qué la variable se pone a cero cada vez que pasa el bucle. El problema no ocurrirá si declaro loopTimes fuera del bucle principal.

Esto resuelve el problema

int loopTimes = 0;
int main(void){
 //my var
 ... Rest of code is same
}

¿Alguien puede explicar esto un poco más?

    
pregunta srinathhs

1 respuesta

4

Creo que encontré el problema, vea los comentarios en el código:

int main(void){
   int loopTimes = 0;

   for(;;) {

   // compiler knows that this condition MUST be true the first time 
   // it runs, since loopTimes is 0
   if (loopTimes >= 0) { 
      loopTimes--;
   }

   // loopTime is now -1 !

   if(TWI_has_data()) {

       twi_read_data(rxBuffer,2);

       // this condition is NEVER true, because loopTime is -1 and will 
       // never be changed again since there are no further assignments
       if (loopTimes == 0) { 
           loopTimes = rxBuffer[0];
       }
   }
}
}

Como resultado, el compilador optimiza un montón de código de distancia, porque nunca será ejecutado o útil de todos modos. Si la variable es global, el compilador no puede hacer esta suposición tan fácilmente.

Solucione su problema cambiando

if (loopTimes >= 0)

a

if (loopTimes > 0)

o cambiar

if (loopTimes == 0)

en consecuencia.

    
respondido por el Rev1.0

Lea otras preguntas en las etiquetas