volatile

Las variables volátiles en sistemas embebidos 

Seguramente es de las primeras cosas que debe tener en mente un programador de sistemas embebidos (en C, claro está) .

El operador volatile, le dice al compilador que esa variable no debe ser optimizada; y que puede cambiar "sin previo aviso". Los clásicos ejemplos:

...
a = b;
a = b;
a = b;
...

Nuestro compilador promedio, va a darse cuenta que ejecutar 3 veces esta asignación no tiene sentido y va a hacerlo sólo una vez. ¿Para qué queremos hacer algo así, si "a" no se modifica entre la segunda y tercera instrucciones?

La respuesta clásica: ¿qué pasa si "b" en realidad es un registro que debe leerse 3 veces para que se restablezca? ¿O qué tal si "a" es un registro al que debemos escribirle varias veces para que meta el dato a una fila de transmisión? (y en realidad queremos transmitir 3 "b"s)

Otra consideración importante: Cuando programamos en C para PC, normalmente sólo tenemos un hilo (thread); de lo contrario, usaremos semáforos o mutexes. Pero en un sistema embebido, es demasiado fácil (y seguido peligroso) usar variables globales. El problema es que las interrupciones funcionan como threads; si tenemos algo del estilo:

...
while( TXRDY == 0) {}
// Ready..
...

.. podemos tener problemas de ciclo infinito, a menos de que TXRDY esté declarado como volátil.

La mayoría de las veces que programemos en C un DSP o micro, seguramente el IDE que usemos ya tendrá considerados todos los registros del procesador declarados como volátiles en un header a incluir; pero siempre es bueno saber cómo funciona.


Un buen artículo al respecto: http://www.embedded.com/story/OEG20010615S0107


[ Regresar ]