Entendiendo el calificador “volátil” en C | Serie 1 (Introducción)

A pesar de toneladas de literatura sobre lenguaje C, la palabra clave » volátil » de alguna manera no se entiende bien (incluso por programadores de C experimentados). Creemos que la razón principal de esto se debe a que no existe un caso de uso real de una variable ‘ volátil ‘ en los programas C típicos que están escritos en lenguaje de alto nivel. Básicamente, a menos que esté haciendo algo de programación de hardware de bajo nivel en C, probablemente no usará una variable mientras esté calificada como “ volátil ”. Por programación de bajo nivel, nos referimos a una pieza de código C que se ocupa de dispositivos periféricos, puertos IO (principalmente puertos IO mapeados en memoria), rutinas de servicio de interrupción (ISR) que interactúan con el hardware. Es por eso que no es tan sencillo tener un programa en C de muestra que pueda mostrar fácilmente el efecto exacto de «palabra clave volátil ”. 
De hecho, en este artículo, si pudiéramos explicar el significado y propósito de ‘ volátil‘, serviría como base básica para un mayor estudio y uso de ‘volátil’ en C. Para entender ‘volátil’, primero debemos tener algunos antecedentes sobre lo que un compilador le hace a un programa en C. En un nivel alto, sabemos que un compilador convierte el código C en código de máquina para que el ejecutable se pueda ejecutar sin tener el código fuente real. Al igual que otras tecnologías, la tecnología de compilación también había evolucionado mucho. Al traducir el código fuente al código de máquina, los compiladores generalmente intentan optimizar la salida para que finalmente se deba ejecutar el código de máquina menor. Una de esas optimizaciones es eliminar el código de máquina innecesario para acceder a la variable que no cambia desde la perspectiva del compilador. Supongamos que tenemos el siguiente código:
 

CPP

uint32 status = 0;
 
while (status == 0)
{
  /*Let us assume that status isn't being changed
  in this while loop or may be in our whole program*/
 
  /*So long as status (which could be reflecting
  status of some IO port) is ZERO, do something*/
}

Un compilador optimizador vería que el estado no está siendo cambiado por el ciclo while . Por lo tanto, no es necesario acceder a la variable de estado una y otra vez después de cada iteración del ciclo. Entonces, el Compilador convertiría este ciclo en un ciclo infinito, es decir , while (1) para que no se necesite el código de la Máquina para leer el estado . Tenga en cuenta que el compilador no es consciente de que el estado es una variable especial que se puede cambiar desde fuera del programa actual en cualquier momento, por ejemplo, alguna operación de E/S ocurrió en un dispositivo periférico para el cual el puerto de E/S del dispositivo estaba asignado en memoria a esta variable. Entonces, en realidad, queremos que el compilador acceda al estadovariable después de cada iteración del bucle, aunque nuestro programa no la modifique y compila Compiler.
Se puede argumentar que podemos desactivar todas las optimizaciones del compilador para dichos programas para que no nos encontremos con esta situación. Esta no es una opción debido a múltiples razones, como 
A) Cada implementación del compilador es diferente, por lo que no es una solución portátil 
B) Solo por una variable, no queremos desactivar todas las demás optimizaciones que el compilador hace en otras partes de nuestro programa. 
C) Al desactivar todas las optimizaciones, nuestro programa de bajo nivel no podía funcionar como se esperaba, por ejemplo, demasiado aumento de tamaño o retraso en la ejecución.
Ahí es donde » volátil » entra en escena. Básicamente, necesitamos instruir al Compilador queEl estado es una variable especial, por lo que no se permite tal optimización en esta variable. Con esto, definiríamos nuestra variable de la siguiente manera:
 

CPP

volatile uint32 status = 0;

Para simplificar el propósito de la explicación, elegimos el ejemplo anterior. Pero, en general, volatile se usa con punteros como los siguientes:
 

CPP

volatile uint32 * statusPtr = 0xF1230000

Aquí, statusPtr apunta a una ubicación de memoria (por ejemplo, para algún puerto IO) en el que el contenido puede cambiar en cualquier momento desde algún dispositivo periférico. Tenga en cuenta que nuestro programa podría no tener ningún control o conocimiento sobre cuándo cambiaría esa memoria. Por lo tanto, lo haríamos » volátil » para que el compilador no realice la optimización de la variable volátil que señala statusPtr .
En el contexto de nuestra discusión sobre » volátil «, citamos el estándar de lenguaje C, es decir, ISO/IEC 9899 C11 – cláusula 6.7.3 
«Un objeto que tiene un tipo calificado como volátil puede modificarse de formas desconocidas para la implementación o tener otro lado desconocido» . efectos.” 
“Se puede usar una declaración volátil para describir un objeto correspondiente a un puerto de entrada/salida asignado a la memoria o un objeto al que se accede mediante una función de interrupción asíncrona. Las acciones sobre los objetos así declarados no serán «optimizadas» por una implementación ni reordenadas, excepto según lo permitido por las reglas para evaluar expresiones».
Básicamente, el estándar C dice que las variables » volátiles » pueden cambiar desde fuera del programa y es por eso que se supone que los compiladores no deben optimizar su acceso. Ahora, puede adivinar que tener demasiadas variables ‘ volátiles ‘ en su programa también resultaría en una optimización del compilador cada vez menor. Esperamos que le brinde suficiente información sobre el significado y el propósito de «volátil».
De este artículo, nos gustaría que elimine el concepto de » variable volátil -> ¡no haga optimización del compilador para esa variable «!
El siguiente artículo explica volátil a través de más ejemplos. 
Entendiendo el calificador “volátil” en C | Conjunto 2 (Ejemplos)
Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *