2010-01-11 24 views
56

E 'sufficiente dichiarare un'istanza di una variabile tipizzata dalla struttura come volatile (se i suoi campi sono accessibili nel codice del nuovo concorrente) o si deve dichiarare volatile un campo specifico della struttura?Semantica di Struct Volatile

formulata in modo diverso, quali sono le differenze semantiche (se presente) tra:

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

e

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

riconosco che dichiara una variabile puntatore tipizzato come volatile (es uint8_t volatili * foo) informa semplicemente il compilatore che l'indirizzo indicato da foo può cambiare, mentre non fa alcuna dichiarazione sui valori indicati da foo. Non mi è chiaro se un'analogia valga per le variabili tipizzate dalla struttura.

risposta

61

Nel tuo esempio, i due sono uguali. Ma i problemi ruotano attorno ai puntatori.

Prima di tutto, volatile uint8_t *foo; indica al compilatore che la memoria puntata è volatile. Se si desidera contrassegnare il puntatore come volatile, è necessario eseguire uint8_t * volatile foo;

Ed è qui che si ottengono le principali differenze tra la marcatura della struttura come volatile rispetto alla marcatura di singoli campi. Se avete avuto:

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

che avrebbe agito come:

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

e non come:

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

Se il campo fosse un 'uint8_t campo [10]', quando si contrassegna la struttura come volatile sono i dati sottostanti contrassegnati come volatile o "effec tive "puntatore a campo marcato volatile? –

+1

I dati sottostanti sono volatili. Una cosa a cui pensare è che il puntatore "efficace" non è modificabile (è sempre l'indirizzo del primo elemento) così volatile non avrebbe alcun significato in merito. –

13

se si dichiara una struttura con volatili poi tutti i suoi membri potranno anche essere volatili

+0

su una barra laterale vale anche per const – Alon