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();
}
- ALe compilateur ne lit flag qu'une fois et ne le relit pas dans la boucle. On déclare flag avec volatile
- Bflag revient à 0 lors de l'interruption. On déclare flag en long
- 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.
Continuer : 9 autres questions sur Systèmes embarqués et firmware