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 ?

  1. 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
  2. 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
  3. 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.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Quelle description du comportement indéfini, au sens de la norme du langage C, est correcte ?
  2. int et unsigned int font 32 bits. Laquelle des opérations suivantes est un comportement indéfini selon la norme du langage C ?
  3. Lorsque la fonction ci-dessus est compilée avec gcc en activant l'optimisation, le test if (p == NULL) peut être supprimé. Quelle en est la raison ?
  4. Que fixe la norme du langage C au sujet de la taille du type int ?
  5. Dans les programmes embarqués, une variable qui reçoit la valeur d'un registre de périphérique de 32 bits est souvent déclarée avec le type uint32_t de stdint.h plutôt qu'avec unsigned int. Quelle en est la raison principale ?