Bases de la programmation en C
#define GPIO_BASE 0x40020000u
volatile uint32_t *const odr =
(volatile uint32_t *)(GPIO_BASE + 0x14);
*odr |= 1u << 5;Un registre de sortie de microcontrôleur est déclaré et utilisé comme ci-dessus. Quelle description de cette déclaration est correcte ?
- ALa valeur de *odr ne peut pas être modifiée, alors qu'odr lui-même peut être modifié par des interruptions : il est donc relu à chaque utilisation
- BGrâce à volatile, la lecture-modification-écriture de *odr |= 1u << 5 devient une opération d'un seul tenant qui ne peut pas être interrompue
- CL'adresse désignée par odr ne peut pas être changée, et les lectures et écritures à travers odr ne sont pas supprimées, mais effectuées exactement autant de fois qu'elles sont écrites
Afficher la réponse et l'explication
Réponse : C. L'adresse désignée par odr ne peut pas être changée, et les lectures et écritures à travers odr ne sont pas supprimées, mais effectuées exactement autant de fois qu'elles sont écrites
const est à droite de * : le pointeur odr lui-même ne peut pas être modifié et désigne toujours l'adresse du même registre. Le uint32_t pointé est volatile : le compilateur ne supprime ni ne fusionne les lectures et écritures de *odr, et effectue autant d'accès qu'il y en a d'écrits. En revanche, volatile ne rend pas les opérations atomiques : une interruption peut survenir entre la lecture et l'écriture de *odr |= …. Si un gestionnaire d'interruption manipule aussi le même registre, on désactive les interruptions pendant ce temps, ou l'on utilise un registre dédié à la mise à 1 de bits.
Continuer : 9 autres questions sur Bases de la programmation en C