2009-11-03 16 views

Respuesta

7

La volatilidad de una variable no cambia el lugar en el que se almacena una variable. Lo que cambia es la semántica sobre cómo se accede con respecto a las lecturas y escrituras.

No creo que el estándar C diga nada sobre la implementación de volátiles. Pero, por lo general, las garantías volátiles liberan semántica para operaciones de escritura en una variable y semántica de adquisición en operaciones de lectura de una variable. Sin embargo, esto no será cierto para todas las implementaciones y debería leer lo que su compilador específico garantiza

+0

no, NO da esa semántica ver [esto] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html) y [CERT] (https : //www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive) diciendo 'no use 'volátil' para la sincronización' – Spudd86

2

No hay razón para almacenar una variable volátil en ninguna sección "especial" de la memoria. Normalmente se almacena junto con otras variables, incluidas las no volátiles. Si algún compilador decide almacenar variables volátiles en alguna sección especial de la memoria, no hay nada que evite que lo haga. Pero a nivel de lenguaje no hay absolutamente ninguna razón para esto.

¿Por qué hace una pregunta? ¿Qué le hizo pensar que debería almacenarse en alguna sección especial de la memoria?

9

En C volatile simplemente le dice al compilador: "No tiene suficiente conocimiento para suponer que el valor de esta variable no ha cambiado". No hay una "sección", por ejemplo, BSS, CSS para eso.

Considérelo una bandera para el compilador para evitar ciertos tipos de optimizaciones. Es muy útil en la programación integrada, donde la memoria en una determinada dirección puede "cambiar" debido a la entrada de un dispositivo de hardware.

Aquí hay una buena explicación: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

Mientras se optimiza, ¿desde dónde el compilador obtendrá este valor supuesto? Me refiero a qué parte de la memoria? – kapilddit

+1

Depende, generalmente el compilador "recuerda" que el valor está en un registro de la CPU. La volatilidad obliga al compilador a no hacer nunca esa suposición, y vuelve a cargar el valor de cada acceso (generalmente desde la memoria principal). – Justicle

21

volatile no es un type qualifier un storage class specifier, por lo que no determina la ubicación de almacenamiento en absoluto; afecta la definición del tipo de una variable, no su almacenamiento.

Simplemente obliga al compilador para leer explícitamente una variable cuyo tipo es volatile de ubicación de almacenamiento de la variable (sea donde sea) en lugar de asumir que un cierto valor leído previamente en un registro, por ejemplo, sigue siendo válida.

4

volátil no tiene nada que ver con la clase de almacenamiento.

volátil solo le dice al compilador u obliga al compilador a "no hacer la optimización" para esa variable. para que el compilador no optimice el código para esa variable y lea el valor de la ubicación especificada, no a través del registro interal que contiene el valor anterior.

Por lo tanto, al declarar la variable como volátil ... da garantía de que obtendrá el último valor, que puede ser alterado por un evento externo.

su código puede funcionar bien si no ha declarado que la variable es volátil, pero puede existir la posibilidad de no obtener el valor correcto a veces .. para evitar eso debemos declarar la variable como volátil.

volátil generalmente se usa cuando se trata de eventos externos, como interrupciones de pines relacionados con el hardware.

ejemplo. leyendo valores de adc.

const voltile means no puede modificar o alterar el valor de esa variable en el código. solo evento externo puede cambiar el valor.

Los pines del controlador generalmente se definen como volátiles. puede ser al declarar variable ya que el controlador volátil hará "leer por pin" no "leer por bloqueo" ... esta es mi suposición. puede estar equivocado ...

pero todavía hay mucha confusión al elegir variable como volátil ..

Una variable debe declararse volátiles siempre que su valor podría cambiar de forma inesperada. En la práctica, sólo tres tipos de variables podrían cambiar:

  1. registros periféricos de memoria mapeada

  2. Las variables globales modificados por un servicio de rutina de interrupción

  3. Las variables globales dentro de una aplicación multi-hilo

Enlace: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

Por lo tanto, se ofrece a la variable como volátil en tales casos.

1

"Volátil" se usó en las especificaciones C/C++ para permitir el uso de dispositivos mapeados en memoria. Dirige el compilador para que no optimice la variable definida con esta palabra clave, simplemente porque la variable no parece cambiar su estado en el código visible del compilador.