¿Qué es una variable volátil?

Los compiladores más sofisticados se han creado para optimizar el programa, especialmente en dos factores: memoria y velocidad. En el sentido de aumentar la velocidad, los compiladores usan algunas unidades de almacenamiento temporales llamadas “registros” (a veces también caché). Por lo general, el resultado de cualquier operación que se haya realizado en ALU se almacenaría en la memoria de datos. Algunas veces se almacena en registros y se puede acceder a él más rápidamente que el tiempo que tarda el acceso a la memoria desde la memoria de datos.

Volviendo al uso de volátil, es una palabra clave que se usa ampliamente en C incrustado, ya que implica el concepto de manejo de interrupciones. Hay algo llamado ISR (), un bloque o un segmento de función que se hace para realizar una tarea particular y esto se ejecuta cada vez que se genera la interrupción respectiva. Se recomienda tener un código mínimo dentro de ISR (). Porque si este ISR () tiene más instrucciones de programa para ejecutar o si tiene varias llamadas de función, puede suceder que la ejecución se bloquee en cualquier momento durante la ejecución, ya que se está ejecutando por una interrupción que se puede generar con frecuencia con muy menos valores delta (diferencia de tiempo entre dos interrupciones consecutivas).

Entonces, la única forma de ejecutar un gran conjunto de instrucciones sobre la interrupción es establecer una variable en ISR () y salir de ella. En un bucle que se ejecuta continentemente, podemos hacer que nuestro gran código se ejecute con la verificación de que si el indicador es alto (se produjo una interrupción).

“Volátil” es la palabra clave con la que declaramos cualquier variable cuyo valor se esté modificando dentro de ISR () y también fuera de ISR (). La declaración es algo como esto,

bandera booleana volátil = FALSO;

volatile le dice al compilador que no lee los registros, sino que lee la variable de la memoria de datos o de la memoria original. Básicamente, la memoria de datos sería la memoria original donde las variables se actualizan con cada modificación en el programa. La memoria de registro o caché copiará el contenido de la memoria original o de datos.

Si una variable no se declara como volátil y se está utilizando dentro y fuera de ISR (), entonces los compiladores más recientes pueden buscar la optimización allí. Supongamos que ISR () es invocado por una interrupción, donde el indicador se establece en ALTO. Esto se establece ALTO en la memoria original o de datos primero, y nuestro compilador puede obtener el valor de la variable del registro de caché en el que los datos aún no se copian.

Por lo tanto, siempre es mejor usar volátiles y evitar este conflicto. Debido a que cualquier cambio en el código se refleja solo en la memoria de datos (memoria original), algunos compiladores pueden copiar esos valores en los registros de la memoria caché para acelerar la ejecución o el acceso a la memoria y otros no.

“Volátil” garantiza que el acceso a la memoria se realice desde la memoria original (datos) y no desde la memoria caché o registros temporales.

Es tan bueno como decir “los datos originales son confiables o más confiables que una copia xerox”.

Volátil es un teclado que se agregó en Java 5. Una vez que declara una variable como volátil, el valor de la variable regresa directamente a la memoria principal en lugar de almacenar el caché de la CPU.

Con las variables no volátiles no hay garantías sobre cuándo la máquina virtual Java (JVM) lee datos de la memoria principal en cachés de la CPU, o escribe datos de los cachés de la CPU en la memoria principal. Esto puede causar varios problemas, como podría ser posible, no obtendremos el valor correcto de la variable porque está leyendo y escribiendo la variable desde el caché de la CPU y la diferencia de CPU tiene su propio caché y sus propios valores, pero si define la variable como un entonces el valor se leerá desde la memoria principal y se escribirá en la memoria principal para que obtengamos el valor correcto

Nota: – La variable volátil debe estar sincronizada. la palabra clave sincronizada evitará que se modifique la variable en mens simultáneamente si un hilo usa la variable y luego otro hilo solo puede leer la variable

La palabra clave volátil tiene los siguientes propósitos:

1] Desactivación de las optimizaciones de acceso a la memoria: una variable calificada con volátil se ve obligada a leerse desde la memoria principal para cada carga, evitando el almacenamiento en caché de su valor en los registros o las memorias caché de la CPU, lo que puede ser útil, por ejemplo, cuando se interactúa con el hardware mapeado en memoria.

2] Retener el valor de las variables locales de un longjmp. Todas las variables locales después de un longjmp tienen valores indefinidos, excepto las calificadas con volátil. La razón de esto es que es más probable que las variables locales se almacenen en los registros de la máquina y, por lo tanto, se golpearían después de un largo salto. Una variable volátil, por otro lado, siempre se cargaría desde la memoria y, por lo tanto, no se vería afectada en un salto largo.