7

Leí sobre palabra clave volátil, pero no sé en qué situaciones debería usarlo.¿Dónde usar volátil?

¿Cuándo se actualiza la memoria (variable) y el proceso no es consciente de eso?

¿En qué casos los conductores deben usar variables volátiles?

+0

Ver: http://stackoverflow.com/questions/2535148/volatile-qualifier-and-compiler-reorderings (Aunque la otra pregunta tiene etiquetas C++ y C, recuerde que C++ obtuvo esta palabra clave de C.) – dirkgently

+0

del Dr. Dobbs - http://www.drdobbs.com/184403766;jsessionid=4HI2GRADWCN51QE1GHRSKHWATMY32JVN – pankajt

+0

Ver [ ¿Por qué es necesario volátil en c? ] (http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c). –

Respuesta

12

El caso más común en mi mundo es cuando está programando microcontroladores que usan E/S mapeadas en memoria. El valor de un registro podría cambiar debido a las entradas digitales externas, pero si no declara una variable como volatile, el compilador podría optimizar el código completamente y se preguntará por qué no funciona nada.

Matt sugirió que adornar en la declaración con respecto al código "optimizado". La memoria asignada de E/S se accede en código a través de punteros. Cuando desee verificar el estado de un botón, normalmente lo hará en bit Y el valor del registro con la máscara de bits para el botón. Si no especifica volátil, el compilador dirá, "hey, su código en realidad nunca cambia el valor de ese puntero, por lo que voy a eliminar esa declaración donde ya lo ha hecho con ANDs bit a bit, porque el valor siempre es ¡lo mismo!".

Espero que esto aclare mi declaración un poco. Gracias por la sugerencia, Matt.

+1

Debería entrar en lo que quiere decir con "optimizarlo", aunque para algunos de nosotros es familiar lo que esto significa, puede que no sea para todos. –

-1

Las variables volátiles son variables que se pueden cambiar en cualquier punto, sin que el programa lo sepa.

No puedo pensar en ningún uso para la palabra clave volátil en la programación diaria, pero puede surgir.

+0

él no pidió una definición, pidió el uso. – RPM1984

+0

Alexander es correcto. Él no se merece una marca. Hay ejemplos anteriores que ilustran esto. Un ejemplo en el uso diario es si usa un puntero a la variable. El compilador no puede decir que algo ha cambiado la variable a través del puntero. – Eddy

3

Como se ha marcado esta con la etiqueta linux-device-driver, algunos consejos específicos para la codificación dentro del núcleo de Linux es posiblemente el fin.

En general, no debería necesitar escribir volatile en su código de kernel de Linux. En los casos en que podría ser necesario volatile, su uso está envuelto en las funciones centrales del núcleo que debe llamar en su lugar. Por ejemplo, si está haciendo lo asignado a la memoria de E/S, entonces usted debe estar usando ioremap(), writel(), etc. readl()

-1

Desde mi conocimiento, en C volatile la palabra clave se debe utilizar cuando las operaciones no sincronizadas concurrentes se realizan en una variable de más de una fuente (proceso). Si la variable se declara volatile, todos los procesos accederán directamente a la variable desde su ubicación de memoria, en lugar de copiar la variable en la memoria caché del microprocesador y acceder desde allí.
Tenga en cuenta que esto reducirá significativamente el rendimiento para esa variable en particular. El tiempo de acceso para las variables en memoria es del orden de milisegundos, mientras que para las variables de caché de nivel 1 o nivel 2 y alrededor de décimas de nanosegundos, utilícelas solo cuando se hayan considerado todas las otras opciones.

+0

¿es posible realizar operaciones concurrentes no sincronizadas en una variable de más de una fuente (proceso)? – Pointer

+0

@Yogesh: sí. El ejemplo más simple es una variable que se escribe desde un manejador de señal y se lee en el bucle principal de un programa (por ejemplo, un indicador de "limpiar y terminar lo antes posible"). Otros incluyen varias formas de memoria compartida, como un archivo compartido de memoria asignada. –

2

Aparte de lo que otros han dicho, la palabra clave volátil generalmente es para evitar que el formulario del compilador realice la optimización. En ciertos registros mapeados en memoria donde el valor de los registros permanece en chinagin como un valor de reloj rtc se usa la palabra clave volátil. Tome un vistazo a este ejemplo:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
while(_currentTime - _time >= 100) 
{ 

//Do something 

} 

//rest of the code 

Si no añadimos la palabra clave volátil antes de tiempo de este código será así como _currentTime - _Hora = 0 y el compilador no tendrá en cuenta el bucle while debajo de ella .:

RTC_CLOCK _time; 
TIME _currentTime = _time ; 
//rest of the code 

para evitar esto tenemos que utilizar la palabra clave volátiles con el tiempo.

+0

excelente respuesta de hormigón, fácil de entender. y NO está lleno de falsa basura sobre cómo ayuda la concurrencia. –