Que son las variables ‘volatile’ y para que sirven?

Volatile es una palabra clave del C que se puede aplicar solo a algunos tipos de variable (tipicamente enteras y sus derivados) y básicamente es una indicación al compilador para que no guarde el valor de la variable en un registro del micro, sino que fuerza la actualización en memoria. Esto se hace cuando existe la posibilidad de que el valor de la variable sea modificado por otro proceso que se ejecuta concurrentemente con el actual, por ejemplo cuando usas hilos o admitís interrupciones.

Un ejemplo típico es algo como esto:
// Esta suele ser parte de una declaración global

volatile int flag = 0;

// Esto es parte de un proceso

...
while( !flag ) {
// hacer algo mientras el flag sea falso
}
...

// Y esto es parte de una rutina de interrupción y está en una función o metodo diferente del proceso.

...
if( pasa_algo ) {
flag = 1;
}
...

Como veran, la declaración de flag es global para que sea accesible al proceso y a la ISR. Acá tenes que declarar flag como volatile, por que si no, el compilador puede suponer que los accesos y modificaciones a la variableflag son atómicos y por ello, puede guardar el valor de flag en un registro del micro para acelerar la evaluación de la condición del while, perdiendo las modificaciones introducidas por la ISR, si es que ocurrió una mientras estaba en el while. Poniéndola como volatile, forzás al compilador a generar código para recargar siempre de memoria el valor de la variable antes de verificar si es verdadero o falso. Algo parecido sucede para la ISR (Interrupt Service Routine).

Saludos!

Advertisement

2 comments to Que son las variables ‘volatile’ y para que sirven?

  1. jlobeto dice:

    gracias por la explicacion

  2. David dice:

    Muy buen Aporte

    Me ayudo a mejorar un programa ke estoy haciendo

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s