Volatile - STB1019/SkullOfSummer GitHub Wiki

Introduzione

I programmi C spesso lavorano in ambienti embedded o comunque molto vicini all'hardware della macchina. volatile è una reserved word estremamente utile per gestire alcuni scenari tipici di questo livello di programmazione.

Volatile

Una variabile deve essere marcata come "volatile" se il suo valore cambia non solo per mano del programma C in costruzione, ma anche per fonti esterne, come thread esterni o hardware.

Ipotizza di star lavorando su un dispositivo hardware ed una cella in memoria (la 0xFF04) contiene 1 se un LED è acceso, 0 altrimenti. La variabile in quella cella di memoria dovrebbe essere definita come volatile, perché se ad un certo punto, senza che il programma faccia nulla, arriva corrente al LED, è l'hardware stesso a modificare il valore di quella specifica variabile. Definire quella variabile come volatile è un modo per dire al compilatore: "guarda che il valore di questa variabile cambia senza che tu non faccia nulla!". Applicazioni multithreading sono chiaramente un altro caso: una variabile condivisa può essere cambiata dal "Thread B" senza che il "Thread A" abbia eseguito alcuna modifica esplicita della variabile (modello producer-consumer).

Marcare una variabile come volatile ha come conseguenza che il compilatore:

  1. Esplicitamente legge dalla memoria il valore di quella variabile ogni volta che la deve usare (quindi si aggiungono istruzioni macchina);
  2. Non immagazzina mai il valore della variabile per un seguente riuso;
  3. Certe ottimizzazioni non vengono applicate alle variabili volatile;

Una variabile può essere definita come volatile nel seguente modo:

volatile int LED5;

Riferimenti