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:
- Terminez l'instruction en cours.
- Désactivez l'indicateur d'interruption globale.
- Poussez l'adresse de l'instruction suivante sur la pile.
- Copiez l'adresse dans le vecteur d'interruption correct (en fonction de l'interruption survenue) dans le compteur de programme.
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.
- Exécutez le code de travail ISR.
Maintenant, nous avons terminé et voulons revenir de l'interruption. Nous devons d'abord faire le nettoyage du logiciel.
- Pop les registres CPU que nous avons poussés à l'étape 6.
- Remettez la valeur de statut enregistrée dans le registre de statut. Après cela, nous devons faire attention à ne pas exécuter d'instructions qui pourraient changer le registre d'état.
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.