Système d'exploitation et matériel
Pour lire le registre d’état d’un périphérique par entrées/sorties mappées en mémoire comme ci-dessus, pourquoi ajouter volatile et configurer cette zone comme non cachée ?
#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
; /* 装置の準備ができるまで待つ */
- AParce qu’avec volatile, les lectures sont regroupées en une seule, ce qui accélère
- BParce que, mise en cache, la valeur du registre du périphérique revient automatiquement à 0
- CParce que la valeur est modifiée par le périphérique, et qu’il faut réellement la relire à chaque fois pour ne pas manquer ses changements
Afficher la réponse et l'explication
Réponse : C. Parce que la valeur est modifiée par le périphérique, et qu’il faut réellement la relire à chaque fois pour ne pas manquer ses changements
La valeur d’un registre de périphérique est modifiée par le périphérique, indépendamment du programme. Sans volatile, le compilateur peut juger que la valeur ne change pas dans la boucle, ne la lire qu’une fois et produire un code qui attend indéfiniment. De plus, si la zone est mise en cache, le CPU continue de lire l’ancienne valeur en cache et ne voit pas les changements du périphérique. volatile interdit d’omettre les lectures, ce qui est l’inverse d’un regroupement. La mise en cache ne remet pas non plus la valeur à 0.
Continuer : 9 autres questions sur Système d'exploitation et matériel