Embedded Systems und Firmware
Beim Kompilieren des obigen Programms mit aktivierter Optimierung wird led_on() mitunter auch dann nicht aufgerufen, wenn ein Timer-Interrupt auftritt. Welche Kombination aus Ursache und Gegenmaßnahme ist korrekt?
int flag = 0;
void timer_isr(void) { flag = 1; }
int main(void) {
while (flag == 0) { }
led_on();
}
- ADer Compiler liest flag nur einmal und nicht erneut in der Schleife. flag wird mit volatile versehen
- BBei einem Interrupt wird flag auf 0 zurückgesetzt. flag wird als long deklariert
- CEin leerer while-Rumpf hält die CPU an. In die Schleife wird eine Addition eingefügt
Antwort und Erläuterung anzeigen
Antwort: A. Der Compiler liest flag nur einmal und nicht erneut in der Schleife. flag wird mit volatile versehen
Der Compiler betrachtet nur main und schließt daraus, dass nichts in der Schleife flag ändert; er kann Code erzeugen, der flag nur einmal in ein Register liest und mit diesem Wert weiterläuft. Auch wenn der Interrupt-Handler flag im Speicher ändert, sieht die Schleife dies nicht. Mit volatile wird bei jedem Zugriff aus dem Speicher gelesen bzw. dorthin geschrieben. Bei Variablen aus mehreren Bytes ist zusätzlich dafür zu sorgen, dass Lesen und Schreiben nicht von einem Interrupt unterbrochen werden.