Variables “volatile” en un sistema embebido

La regla es simple: todas aquellas variables, locales y en especial las globales, deben ser declaradas como volatile si pertenecen o se usan en funciones del tipo ISR, o callbacks, o hook; es decir, si se encuentran en algún lugar donde cambien de valor fuera del flujo normal del programa (principalmente en interrupciones ).

De no hacerlo así entonces el compilador tomará decisiones erróneas respecto a dichas variables. Sin el modificador volatile el compilador tratará de optimizarlas, lo cual no es, en la mayoría de los casos, lo deseado.

Si se encuentran en una situación donde no entienden porqué el programa no incrementa una variable o se queda colgado en un loop, posiblemente sea causado porque el compilador trató de optimizar la variable. Por ejemplo:

int tim;
void alguna_isr()
{
    tim++;
}
void delay()
{
    for(tim=0;tim<100;); /* no, no se me olvidó el tercer argumento */
}

En este caso la variable tim se incrementa dentro de la ISR (timer, contador de pulsos externos, etc.), pero el compilador no lo sabe, por lo que tratará de hacer algo, tal vez un warning, o en el peor de los casos, un loop infinito.  Si tienen la posibilidad de ver el código en ensamblador generado verán código que ustedes no escribieron. Para resolverlo simplemente modifiquen la declaración de la variable tim a:

volatile int tim;

No importa el tipo del dato, puede ser int, char, struct, etc., la regla es que si cambia de valor fuera del flujo normal del programa, entonces declárenla como volatile.

Anuncios

Un comentario sobre “Variables “volatile” en un sistema embebido

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s