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();
}
  1. ADe compiler leest flag slechts één keer en leest het in de lus niet opnieuw. Voeg volatile toe aan flag
  2. BBij een interrupt wordt flag teruggezet op 0. Maak flag van het type long
  3. 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.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Embedded systemen en firmware

  1. Bij een 8-bits microcontroller verhoogt een timerinterrupt een 32-bits variabele ticks met 1 en berekent het hoofdprogramma de verstreken tijd door ticks te lezen. Wat is de juiste oorzaak van het soms lezen van een sterk afwijkende waarde?
  2. Welke eigenschap van seriële communicatie via UART is juist?
  3. Bij een UART van 115200 bps en het formaat met 8 databits, geen pariteit en 1 stopbit (8N1), hoeveel bytes per seconde kunnen er ongeveer worden verzonden?
  4. Bij UART kan een klein verschil in baudrate tussen zender en ontvanger tekenfouten veroorzaken. Waarom is de toelaatbare afwijking beperkt tot ongeveer enkele procenten?
  5. Welke eigenschap van SPI-communicatie is juist?

Vergelijkingen bij dit onderwerp