¿Qué sucede cuando no usamos la palabra clave ‘volátil’ para definir registros de hardware en la programación de sistemas integrados?

Los compiladores en la mayoría de los idiomas están programados para optimizar el código de los idiomas superiores, antes de compilarlo en lenguaje máquina. Pero, en ciertas condiciones, el compilador no conoce el flujo de datos completo y las actualizaciones / interrupciones, en cuyo caso la optimización causa errores.
Un ejemplo puede ser el ciclo:

registerX = 0xFF; // o cualquier valor inicial distinto de cero
while (registerX! = 0)
{
// algún código, que no contiene actualización de registerX en el código
}

El código anterior es típico en operaciones de tipo de sondeo , donde está esperando, por ejemplo, un sensor conectado a registerX para detectar algún valor (0 en este caso) después del cual sale del bucle.
¡Pero su compilador no es consciente de que esto es similar a una operación asignada de memoria ! Todo lo que ve es que está esperando que registerX sea 0, cuando no lo está actualizando ni una sola vez en el código. Por lo tanto, se traduce como:

mientras que (1)
{
// mismo código
}

lo cual es desastroso en el sistema embebido, ya que los datos del sensor no tienen significado para la respuesta del microcontrolador. Además, los compiladores almacenan el valor de variables no volátiles en ‘ caché ‘ para referencias en todas las iteraciones de bucles. Esto es una falla, ya que el cambio de datos del sensor no será capturado. Por lo tanto, debe usarse volátil para definir registros de hardware en la programación Embebida. De lo contrario, el valor inicial de ese registro se utilizará en todas las iteraciones en dichos bucles. La palabra clave volátil se asegura de que esas variables no se almacenen en la memoria caché, y no se realiza ninguna optimización al respecto.

Si no usamos calificador volátil, pueden surgir los siguientes problemas:

  • Código que funciona bien hasta que active la optimización
  • Código que funciona bien, siempre que las interrupciones estén deshabilitadas
  • Controladores de hardware escamosos
  • Tareas que funcionan bien de forma aislada, pero se bloquean cuando se habilita otra tarea

Fuente: palabra clave volátil en cy sistema integrado

¡Apocalipsis!
Para salvar al mundo, lea El lenguaje de programación C: Kernighan y Ritchie, de principio a fin.