Bonjour à tous,
J'ai une question qui me taraude et je n'arrive pas à trouver la réponse dans le datasheet de l'ATmega1284.
J'écris un firmware multitâche et les routines de basculement d'une tâche à une autre, les mutexes et autres variables conditionnelles utilisent sei() et cli(). Les interruptions sont donc masquées durant un bref instant (on parle d'un traitement interruptif au moins toutes les millisecondes pour un CPU qui tourne en 3,3V donc à 8 MHz).
Or j'utilise l'interruption TX0 pour envoyer des données (sur un bus lent, on est à 1200,7E1). La routine d'envoi utiliseun buffer (parce que, vue la lenteur du bus, on ne va pas passer son temps à attendre).
Je charge donc le registre d'envoi, lequel envoie les données, lève l'interruption lorsque les données ont été transmises. L'interruption réveille une tâche qui va regarder dans le buffer d'envoi s'il reste quelque chose à envoyer et, le cas échéant, charge le regitre d'envoi avec une nouvelle donnée. Ça fonctionne bien. Ça fonctionne même trop bien.
Je pensais de temps en temps qu'une interruption allait ne pas être traitée et que le mécanisme en question ne fonctionnerait pas correctement. Or je n'ai pas réussi à le mettre en défaut. Soit j'ai de la chance (je n'y crois pas), soit il y a un truc qui m'échappe.
Mes routines multitâches s'exécutent toutes dans un contexte atomique (donc avec SEI/CLI). Il y a trois tâches (chacune utilisant le CPU durant 2ms) et des mutexes partout. Il n'y a aucune raison valable que, de temps en temps, une interruption ne tombe pas durant ce laps de temps.
Si j'en crois la doc du CPU, lorsque les interruptions sont désactivées dans le registre SREG, elles ne sont pas traitées. Or il y a un drapeau d'interruption dans d'autres registres (comme celui associé à USART1). Est-ce à dire que l'interruption TX sera traitée après le prochain SEI parce qu'elle est "bufferisée" ? Il y a un passage dans la doc qui indique que le drapeau de l'interruption repasse à zéro après le traitement de l'interruption, mais jamais il n'est indiqué que l'interruption sera "bufferisée" jusqu'au prochain SEI...
Si quelqu'un avait une petite expérience du sujet, ce serait sympathique d'éclairer ma lanterne.
Bien cordialement,
JKB