volatile
Description :
volatile est un mot-clé appelé qualificateur de variable. Il est généralement utilisé avant le type de données d’une variable pour modifier la façon dont le compilateur et le programme qui en découle traitent la variable.
Déclarer une variable volatile est une directive adressée au compilateur. Le compilateur est un logiciel qui traduit votre code C/C++ en code machine, qui constitue les véritables instructions de la puce Atmega de la carte Arduino.
Plus précisément, il indique au compilateur de charger la variable depuis la RAM et non depuis un registre de stockage, un emplacement de mémoire temporaire où les variables du programme sont stockées et manipulées. Dans certaines conditions, la valeur d’une variable stockée dans les registres peut être inexacte.
Une variable doit être déclarée volatile lorsque sa valeur peut être modifiée par un élément indépendant de la section de code dans laquelle elle apparaît, comme un thread en cours d’exécution. Sur la carte Arduino, le seul endroit où cela est susceptible de se produire est dans les sections de code associées à des interruptions, appelées routines de service d’interruption.
int ou long volatiles :
Si la variable volatile est supérieure à un octet (par exemple, un entier de 16 bits ou un long de 32 bits), le microcontrôleur ne peut pas la lire en une seule étape, car il s’agit d’un microcontrôleur 8 bits. Cela signifie que pendant que votre section de code principale (par exemple, votre boucle) lit les 8 premiers bits de la variable, l’interruption peut déjà modifier les 8 bits suivants. Cela produira des valeurs aléatoires pour la variable.
Solution : Pendant la lecture de la variable, les interruptions doivent être désactivées afin qu’elles ne puissent pas perturber les bits. Il existe plusieurs façons de procéder :
- noInterrupts
- Utilisez la macro ATOMIC_BLOCK. Les opérations atomiques sont des opérations MCU uniques, la plus petite unité possible.
Exemple de code :
Le modificateur volatile garantit que les modifications apportées à la variable changed sont immédiatement visibles dans loop(). Sans ce modificateur, la variable changed pourrait être chargée dans un registre à l’entrée de la fonction et ne serait plus mise à jour jusqu’à la fin de la fonction.
// La LED clignote pendant 1 s si l'entrée a changé // dans la seconde précédente. volatile byte changed = 0; void setup() { pinMode(LED_BUILTIN, OUTPUT); attachInterrupt(digitalPinToInterrupt(2), toggle, CHANGE); } void loop() { if (changed == 1) { // toggle() a été appelé à partir d'interruptions ! // La réinitialisation a été remplacée par 0 changed = 0; // LED clignotante pendant 200 ms digitalWrite(LED_BUILTIN, HIGH); delay(200); digitalWrite(LED_BUILTIN, LOW); } } void toggle() { changed = 1; }
Source : https://docs.arduino.cc/language-reference/en/variables/variable-scope-qualifiers/volatile/