2010-01-11 7 views
56

¿Es suficiente declarar una instancia de una variable estructurada como volátil (si se accede a sus campos en el código entrante), o debe declarar campos específicos de la estructura como volátiles?Semántica de Estructuras Volátiles

redactadas de manera diferente, ¿cuáles son las diferencias semánticas (si los hay) entre:

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

y

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

Reconozco que se declara una variable de puntero-tecleado tan volátil (por ejemplo uint8_t volátil * foo) simplemente informa al compilador que la dirección apuntada por foo puede cambiar, sin hacer ninguna declaración acerca de los valores apuntados por foo. No está claro si una analogía es válida para las variables estructuradas.

Respuesta

61

En su ejemplo, los dos son iguales. Pero los problemas giran en torno a los indicadores.

En primer lugar, volatile uint8_t *foo; le dice al compilador que la memoria apuntada es volátil. Si desea marcar el puntero como volátil, deberá hacer uint8_t * volatile foo;

Y ahí es donde se llega a las principales diferencias entre marcar la estructura como volátil y marcar campos individuales. Si usted tenía:

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

que actuaría como:

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

y no como:

typedef struct 
{ 
    volatile uint8_t *field; 
} foo; 
+1

Si el campo era un 'uint8_t campo [10]', cuando marca la estructura como volátil, los datos subyacentes se marcan como volátiles o el "efecto tivo "puntero al campo marcado como volátil? –

+1

Los datos subyacentes son volátiles. Una cosa en que pensar es que el puntero "efectivo" no es modificable (siempre es la dirección del primer elemento), por lo que volátil no tendría ningún significado en relación con ello. –

13

si se declara una estructura con volátil entonces todos sus miembros también podrán ser volátiles

+0

en una barra lateral esto también es cierto para const – Alon