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!
gracias por la explicacion
Muy buen Aporte
Me ayudo a mejorar un programa ke estoy haciendo