Het is duidelijk gedocumenteerd dat wanneer globale gegevens worden gedeeld met een ISR en het hoofdprogramma, de gegevens vluchtig
moeten worden verklaard om zichtbaarheid van het geheugen te garanderen (en dat is alleen voldoende voor 1-byte data; alles wat groter is heeft speciale regelingen nodig om ook atomiciteit te garanderen). Hier hebben we goede regels:
- Variabelen die alleen buiten een ISR worden gebruikt, mogen niet vluchtig zijn.
- Variabelen die alleen binnen een ISR worden gebruikt, mogen niet vluchtig.
- Variabelen die zowel binnen als buiten een ISR worden gebruikt, moeten vluchtig zijn.
Maar is vluchtig
nodig wanneer de variabele wordt benaderd vanuit> 1 ISR's, maar niet gedeeld buiten ISR's? Ik heb bijvoorbeeld een functie die de interne toestand handhaaft met een statische
variabele:
void func () {statische vluchtige lange teller; // vluchtig of niet? // Doe dingen met teller enz.}
Die functie wordt op twee manieren aangeroepen: vanaf pin-interrupt en vanuit TimerOne-bibliotheek:
-
attachInterrupt (0, func, CHANGE);
-
Timer1.attachInterrupt (func);
Er zijn geen atomiciteitsproblemen, aangezien wanneer een ISR wordt ingevoerd, interrupts automatisch worden uitgeschakeld, maar deze vluchtige
is meer een compilervraag: wat wordt in de cache opgeslagen en wat is niet.
Beter dan genezen, natuurlijk ...