External avbryter på MPIDE del 1: attachInterrupt() (8 / 11 steg)
Steg 8: Flyktiga variabler
Jag nämnde innan att eftersom jag inte försöker manipulera utgångar direkt inuti min avbrott, vi använder variabeln LEDstate för att manipulera våra LED indirekt. Detta kräver en mycket speciell variabel kallas en "flyktig" variabel.
MPIDE har koden optimerare som hjälper din microcontroller funktion snabbare och smidigare. En av de saker som dessa optimerare kommer att göra är att ta variabler som inte ändra och göra dem till konstanter, vilket sparar utrymme i minnet. Tyvärr, eftersom våra LEDstate variabel inte används i huvudloop och funktionen som gör använda det (LEDchange()) är inte kallas i de viktigaste loopen, dessa optimerare kommer att se LEDstate som en variabel som inte ändras, och förvandla det till en konstant, som orsakar problem när våra avbrott försöker ändra den.
Nu vet vi att LEDstate inte är en konstant, men vår kod inte. Tack och lov, kan vi berätta våra optimerare att LEDstate inte är en konstant, och vi gör det genom att göra det till en "flyktig" variabel.
Du kanske tänker, då, att du bör göra alla dina variabler flyktiga, att säkerställa din optimerare inte kommer av misstag göra dem konstanter när den inte borde, men detta skulle vara en dålig idé.
På grund av hur flyktiga variabler lagras i minnet, de är lite långsammare att svara än normala variabler. Det innebär att om du ringer dina variabler ofta, de kan bromsa din kod avsevärt. Tack och lov, eftersom de flesta av våra avbryta program kallas så sällan, detta sluta inte som ett problem, men det betyder att du bara vill göra de variabler som används i avbryter volatile.