Betriebssystem und Hardware
Warum wird beim Lesen eines Statusregisters eines Geräts per Memory-Mapped I/O wie oben volatile angegeben und der Bereich als nicht gecacht konfiguriert?
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 装置の準備ができるまで待つ */
- AWeil volatile die Leseoperationen auf eine einzige zusammenfasst und es schneller wird
- BWeil beim Cachen der Wert des Geräteregisters automatisch auf 0 zurückgesetzt wird
- CWeil das Gerät den Wert ändert und eine Änderung übersehen würde, wenn nicht jedes Mal tatsächlich neu gelesen wird
Antwort und Erläuterung anzeigen
Antwort: C. Weil das Gerät den Wert ändert und eine Änderung übersehen würde, wenn nicht jedes Mal tatsächlich neu gelesen wird
Der Wert eines Geräteregisters wird vom Gerät unabhängig vom Programm umgeschrieben. Ohne volatile kann der Compiler annehmen, dass sich der Wert in der Schleife nicht ändert, und nur einmal lesen, wodurch Code entsteht, der ewig wartet. Würde der Bereich gecacht, läse die CPU weiter den veralteten Wert im Cache, und Änderungen des Geräts blieben unsichtbar. volatile verhindert, dass Lesezugriffe weggelassen werden, und wirkt dem Zusammenfassen zu einem Zugriff entgegen. Dass der Wert durch Cachen 0 wird, trifft nicht zu.