Embedded systemen en firmware
Wanneer het bovenstaande programma met optimalisatie wordt gecompileerd, wordt led_on() soms niet aangeroepen, ook al treedt de timerinterrupt op. Welke combinatie van oorzaak en tegenmaatregel is juist?
int flag = 0;
void timer_isr(void) { flag = 1; }
int main(void) {
while (flag == 0) { }
led_on();
}
- ADe compiler leest flag slechts één keer en leest het in de lus niet opnieuw. Voeg volatile toe aan flag
- BBij een interrupt wordt flag teruggezet op 0. Maak flag van het type long
- CEen lege while-lus laat de CPU stoppen. Zet een optelling in de lus
Antwoord en toelichting tonen
Antwoord: A. De compiler leest flag slechts één keer en leest het in de lus niet opnieuw. Voeg volatile toe aan flag
De compiler kijkt alleen naar main en kan concluderen dat niets in de lus flag wijzigt; daarom kan hij code maken die flag slechts één keer in een register leest en met die waarde blijft herhalen. Ook als de interrupthandler flag in het geheugen wijzigt, ziet de lus dat niet. Met volatile wordt bij elke toegang uit het geheugen gelezen of ernaar geschreven. Bij variabelen van meerdere bytes is bovendien een maatregel nodig om te voorkomen dat tijdens lezen of schrijven een interrupt optreedt.