Systèmes embarqués et firmware

Lorsque le programme ci-dessus est compilé avec optimisation, led_on() peut ne pas être appelée même si l'interruption de temporisateur survient. Quelle combinaison de cause et de remède est correcte ?

int flag = 0;
void timer_isr(void) { flag = 1; }
int main(void) {
    while (flag == 0) { }
    led_on();
}
  1. ALe compilateur ne lit flag qu'une fois et ne le relit pas dans la boucle. On déclare flag avec volatile
  2. Bflag revient à 0 lors de l'interruption. On déclare flag en long
  3. CLe processeur s'arrête si le corps du while est vide. On ajoute une addition dans la boucle
Afficher la réponse et l'explication

Réponse : A. Le compilateur ne lit flag qu'une fois et ne le relit pas dans la boucle. On déclare flag avec volatile

Le compilateur, ne considérant que main, peut juger que « rien ne modifie flag dans la boucle », lire flag une seule fois dans un registre et générer une boucle tournant sur cette valeur. Même si le gestionnaire d'interruption modifie flag en mémoire, la boucle ne le voit pas. Avec volatile, chaque accès lit et écrit la mémoire. Pour les variables de plusieurs octets, il faut en outre empêcher qu'une interruption survienne au milieu d'une lecture ou d'une écriture.

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

Autres questions sur Systèmes embarqués et firmware

  1. Sur un microcontrôleur 8 bits, une interruption de temporisateur incrémente une variable 32 bits ticks, et le traitement principal lit ticks pour calculer le temps écoulé. Quelle est la cause des valeurs parfois très erronées ?
  2. Quelle caractéristique de la communication série par UART est correcte ?
  3. Pour un UART à 115200 bps au format 8 bits de données, sans parité, 1 bit de stop (8N1), quelle valeur est la plus proche du nombre d'octets transmissibles par seconde ?
  4. Un léger écart de débit en bauds entre émetteur et récepteur UART peut produire des caractères corrompus. Pourquoi l'écart admissible est-il limité à quelques % environ ?
  5. Quelle caractéristique de la communication SPI est correcte ?

Comparatifs sur ce thème