Besturingssysteem en hardware
Waarom wordt, wanneer zoals hierboven het statusregister van een apparaat via memory-mapped I/O wordt gelezen, volatile gebruikt en wordt dat gebied ingesteld om niet te worden gecachet?
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 装置の準備ができるまで待つ */
- AOmdat met volatile de leesinstructies tot één worden samengevoegd, wat sneller is
- BOmdat bij cachen de waarde van het apparaatregister automatisch naar 0 terugkeert
- COmdat de waarde door het apparaat verandert en een wijziging gemist wordt als niet telkens daadwerkelijk opnieuw wordt gelezen
Antwoord en toelichting tonen
Antwoord: C. Omdat de waarde door het apparaat verandert en een wijziging gemist wordt als niet telkens daadwerkelijk opnieuw wordt gelezen
De waarde van een apparaatregister wordt door het apparaat gewijzigd, los van het programma. Zonder volatile kan de compiler concluderen dat de waarde in de lus niet verandert, hem slechts één keer lezen en code genereren die eindeloos wacht. Als het gebied gecachet wordt, blijft de CPU bovendien de oude waarde uit de cache lezen en is de verandering van het apparaat niet zichtbaar. Volatile voorkomt dat leesacties worden weggelaten en werkt dus tegengesteld aan samenvoegen tot één. De waarde wordt door cachen ook niet 0.