# Alguien puede explicar los tipos de datos "volatile" en un programa de



## Danirm (Mar 9, 2009)

Alguien podria explicarme un poco por encima para que se usa este tipo de datos? Hasta ahora he utilizado del tipo char, unsigned/signed int, pero ademas se le puede poner que sea volatil, pero no acabo de entender bien por que y para que.

Gracias.


----------



## Dr. Zoidberg (Mar 9, 2009)

Danirm dijo:
			
		

> Alguien podria explicarme un poco por encima para que se usa este tipo de datos? Hasta ahora he utilizado del tipo char, unsigned/signed int, pero ademas se le puede poner que sea volatil, pero no acabo de entender bien por que y para que.



*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 verás, 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 variable flag 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.

Saludos!


----------



## Chico3001 (Mar 9, 2009)

Completando un poco lo que dice ezavalla, el compilador de C siempre esta tratando de optimizar lo mas posible el programa y aveces si detecta que una variable no se usa en algun loop o subrutina simplemente no la toma en cuenta, o la pone provisionalmente como constante, con volatile le estas diciendo al compilador que la variable puede cambiar en cualquier momento y asi el compilador se obliga a revisarla constantemente durante todo el programa

No es buena idea declarar todas tus variables como volatiles por que el tamaño del programa se incrementaria demasiado, solo declara como volatiles aquellas variables que sean modificadas por interrupciones o procesos ajenos al procesador (como timers, resultados de convertidores, buffers de transmision serial, etc)


----------



## Danirm (Mar 10, 2009)

gracias! 

Todo aclarado!  ^^


----------

