(Spécifique à l'Arduino Uno ...)
Qu'arrive-t-il à la pile lorsqu'une interruption se produit sur un microcontrôleur AVR et que j'appelle une fonction? Le compilateur insère-t-il le code? Est-ce qu'il cache la pile quelque part, puis réinitialise le pointeur de la pile? A-t-il une pile secondaire pour les interruptions uniquement?
Si je comprends bien, le vecteur de l'interruption est une commande GOTO directe dans l'assemblage. De plus, je ne pense pas que le microcontrôleur gâcherait automatiquement la pile, donc il est probablement laissé seul. Cependant, cela n'explique toujours pas comment les fonctions fonctionnent pendant un ISR.
arduino
interrupts
compiler
Pingouin anonyme
la source
la source
Réponses:
L'AVR est une architecture RISC, donc il a une gestion matérielle assez basique des interruptions. La plupart des processeurs jouent avec la pile pendant les interruptions, bien qu'il y en ait quelques-uns, notamment ARM et PowerPC, qui utilisent des méthodes différentes.
En tout cas, c'est ce que fait l'AVR pour les interruptions:
Lorsqu'une interruption se produit, le matériel du processeur effectue ces étapes, qui ne sont pas simplement un simple GOTO:
Maintenant, à ce stade, le matériel a fait tout ce qu'il va faire. Le logiciel doit être écrit correctement pour ne pas casser les choses. En règle générale, les étapes suivantes vont dans ce sens.
Poussez le registre d'état sur la pile. (Cela doit être fait avant de le changer).
Poussez tous les registres CPU qui seront (ou peuvent être) modifiés sur la pile. Les registres qui doivent être sauvegardés de cette manière sont définis par le modèle de programmation. Le modèle de programmation est défini par le compilateur.
Maintenant, le code d'interruption de travail peut être exécuté. Pour répondre au cas de la question d'appeler une fonction, il fait juste ce qu'il fait toujours, pousse la valeur de retour sur la pile, puis la fait revenir quand c'est fait. Cela n'affecte aucune de ces valeurs précédentes que nous avons enregistrées sur la pile jusqu'à présent.
Maintenant, nous avons terminé et voulons revenir de l'interruption. Nous devons d'abord faire le nettoyage du logiciel.
Exécutez l'instruction RTI. Le matériel effectue ces étapes pour cette instruction:
une. Activez l'indicateur d'interruption globale. (Notez qu'au moins une instruction doit être exécutée avant que la prochaine interruption ne soit honorée. Cela empêche les interruptions importantes de bloquer complètement le travail en arrière-plan.)
b. Insérez l'adresse de retour enregistrée dans le PC.
Nous revenons maintenant au code normal.
Notez qu'il y a certains points où nous devons être très prudents, en particulier autour du registre d'état et de la sauvegarde des registres qui pourraient être modifiés. Heureusement, si vous utilisez un compilateur C, tout cela est géré sous les couvertures.
Vous devez également surveiller la profondeur de votre pile. À tout moment lorsque les interruptions sont activées, un ISR pourrait utiliser plus de la pile qu'il n'est évident en regardant le code local. Bien sûr, cela ne se produit vraiment que si vous poussez votre mémoire à ses limites.
Voici un lien décrivant ce processus si vous souhaitez une référence.
la source
ISR_NAKED
). Cela peut vous permettre de sauter les étapes 5, 6, 8, 9, dans un contexte où vous avez vraiment besoin de ces cycles. L'inconvénient est que vous devez être absolument certain que vous préserverez les registres pertinents ou que vous pourrez les remplacer sans danger.