2015-08-07 16 views
7

Recentemente ho lavorato sull'apprendimento della programmazione di sistemi embedded per conto mio. Ho osservato un utilizzo piuttosto elevato del qualificatore della parola chiave volatile quando dichiaro le variabili?Qual è il significato della parola chiave "volatile" rispetto a Embedded Systems?

Qual è il significato di volatile quando si dichiara una variabile nella programmazione di Sistema incorporato?

Fondamentalmente quando è necessario utilizzare la parola chiave. Ho letto qualcosa sull'ottimizzazione del compilatore e l'uso della parola chiave. Anche qualcosa legato ai registri di mappatura della memoria.

Ad esempio, ho letto questo StackOverflow post ma non ho capito come applicato in un ambiente embedded. Più specificamente, non capisco quando la parola chiave dovrebbe essere usata. Ho letto qualcosa sull'ottimizzazione del compilatore e l'uso della parola chiave. Anche qualcosa legato ai registri di mappatura della memoria, ma non capisco quando usarlo.

+0

possibile duplicato di [Perché è volatile necessario in C?] (Http://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c) – Olaf

risposta

6

Nel mondo dei sistemi embedded, uno degli aspetti chiave della parola chiave volatile è che si tratta di una variabile che può cambiare in qualsiasi momento (ad esempio un input dati esterno/hardware, ad esempio un ADC) e quindi il compilatore non deve utilizzare ottimizzato.

Ma in particolare, se utilizzato con un registro di controllo, indica che un accesso in lettura potrebbe infatti modificare i dati!

Come regola generale, consiglio l'utilizzo del qualificatore volatile in tutte le seguenti:

  • Tutti gli accessi di registro hardware (lettura e scrittura)
  • Tutte le variabili che sono accessibili in più thread (soprattutto gestori di interrupt)

Nota: l'accesso a un volatile non è necessariamente atomica, per cui è indispensabile conoscere l'hardware e la struttura del codice.

9

Diamo un'occhiata a un esempio. Quando si guarda a file header C per microcontrollori PIC, vedrete che molti elementi sono dichiarati volatile:

extern volatile unsigned char   PORTB    @ 0x006; 

Come avete letto, la parola chiave volatile disabilita ottimizzazione del compilatore. Supponiamo che si scrive un programma che fa il seguente:

PORTB = 0x00;   // set all of port B low 
while (PORTB == 0x00); // wait for any pin to get high 
// do something else 

Quando il compilatore ottimizza il codice, riconoscerà la seconda linea come un ciclo infinito: la condizione è vera e non viene mai falsa all'interno del suo corpo. Pertanto, tutto dopo il il ciclo infinito non ha bisogno di essere compilato in quanto non verrà mai eseguito. Quindi, il compilatore può decidere di non includere quella parte del codice nel codice assembly generato.

Tuttavia, questo PORTB è effettivamente collegato a una porta fisica. È una porta dell'hardware il cui valore può essere modificato dal circuito esterno. Ciò significa che sebbene il ciclo sembri essere infinito, non deve esserlo. Il compilatore non può saperlo.

Ecco dove volatile entra. Quando PORTB è dichiarato volatile, il compilatore non farà alcuna ottimizzazione in base a un ragionamento su PORTB. Assumerà che il suo valore possa essere modificato in qualsiasi momento da fattori esterni.

2

La parola chiave volatile viene utilizzata principalmente per indicare al compilatore che il valore della variabile può cambiare in qualsiasi momento. Indica anche al compilatore di non applicare l'ottimizzazione sulla variabile. Non sono un esperto di questo, ma qui di seguito è un buon riferimento a cui ho fatto riferimento in passato.

volatili è una qualificazione che viene applicata a una variabile quando viene dichiarato. Indica al compilatore che il valore della variabile può cambiare in qualsiasi momento, senza che venga intrapresa alcuna azione dal codice che il compilatore trova nelle vicinanze. Le implicazioni di questo sono abbastanza serie. Tuttavia, prima di esaminarli, diamo un'occhiata alla sintassi.

Riferimento:

+1

Mentre questo link può teoricamente rispondere alla domanda, [sarebbe preferibile] (http://meta.stackexchange.com/q/8259) includere le parti essenziali della risposta qui e fornire il link per riferimento. –

1

Mettiamola in un altro punto di vista è esattamente opposto di const parola chiave. Quando il compilatore incontra il qualificatore const per qualsiasi variabile, controlla se una funzione o un'istruzione viene modificata una volta inizializzata. Quindi errore flag.

Volatile è esattamente l'opposto, questa variabile può essere modificata da qualsiasi funzione. Quindi il compilatore non applica l'ottimizzazione.

Questo si vede principalmente nella programmazione di sistemi incorporati a causa dell'uso di interrupt e alcuni costrutti di logica di programmazione sembrano ridondanti.

+3

Questo è impreciso. Può essere modificato da fattori * esterni al programma che stai scrivendo *. Le variabili che possono essere modificate da qualsiasi funzione sono chiamate variabili di ambito globale, che è ortogonale al fatto che siano dichiarate come "volatili". –

Problemi correlati