L'essentiel d'Assembleur

Comprendre le fonctionnement des vecteurs d'interruption

Testez gratuitement nos 1302 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Abordez le principe de fonctionnement des interruptions dans une architecture 16 bits. Définissez les niveaux de priorités et les vecteurs d'interruptions hardwares.
06:58

Transcription

Dans cette vidéo, je vais vous parler du fonctionnement des interruptions, et notamment des vecteurs d'interruption. Alors, supposons que nous ayons deux interruptions donc une, par exemple, nommée " T1 ", qui pourrait être associée au timer 1, qui est de plus haut niveau qu'une interruption de priorité plus basse qui est A2, qui est asynchrone et quelconque. Alors, T1 est assez cyclique, c'est un timer qui déborde régulièrement. Et puis A2 apparaît. Donc A2 est traité, mais T1 est plus prioritaire. Que se passe-t-il alors ? Eh bien, dans ce cas-là, on va retraiter T1, on va mettre A2 de côté, et puis on va rogner sur le temps de A2, et de ce qu'ils doivent continuer de faire en espérant ne pas aller trop loin, sinon on va devoir remorceler encore. Et voilà comment ça se passe au niveau du mécanisme d'interruption. Nous avons aussi une table de vecteurs d'interruption. Alors qu'est-ce que c'est que cette table ? En fait, ce sont des vecteurs qui ont tous une adresse et ces adresses vont permettre de départager des ex aequo. Si deux interruptions arrivent en même temps, et qui sont de même niveau de priorité software, ça va être le vecteur d'interruption hardware qui va jouer l'arbitre. Donc c'est pour ça que pour chaque source d'interruption, vous avez un vecteur qui est hiérarchisé. Donc vous verrez ça dans l'exemple qui va venir au niveau de notre programmation. Après, il y a des vecteurs qui sont mis vraiment de façon hardware et qu'on ne peut pas bouger - ce sont ceux-ci - car ils sont considérés comme des sources graves de reset. Par exemple, le classique Math Error, c'est-à-dire que vous divisez par 0. Que fait-on ? Dans ce cas-là, on vient se brancher à cette adresse, et puis, il faut traiter la défaillance. Donc à partir de là, on a une recopie, aussi, de cette table de vecteurs d'interruption, - ce qu'on appelle "table alternative " - mais pour l'instant je n'en parle pas, simplement parce qu'elle sert principalement au mode debug. Alors, le CPU a 16 niveaux de priorité : le niveau zéro est celui, en fait, du main, le programme principal, et puis après, vous avez des niveaux qui vont de 1 à 7. Et ils sont tous destinés à l'utilisateur pour paramétrer ses niveaux associés à ces sources. Les levels 8 à 15 sont réservés aux défaillances soft ou hardware, donc celles dont je vous ai parlé précédemment, notamment avec le problème de la division par zéro. Et puis, une interruption doit avoir une assignation de niveau de priorité supérieure à zéro. Sinon, vous êtes au même niveau que le programme principal. Et une configuration de chaque source d'interruption est nécessaire par le biais des bits IPL, qui vont de 0 à 3. Donc nous avons 4 bits, qui vont permettre, en fait, de hiérarchiser nos niveaux Et puis, par défaut, toutes les interruptions ont le même niveau et c'est le niveau 4. Et donc, je le répète : à même niveau d'interruption, deux interruptions qui apparaissent, c'est la priorité hardware qui l'emporte. D'où la table de vecteurs d'interruption. Alors, voyons un peu une séquence d'interruption : comment tout cela peut se traiter dans le temps ? Par exemple, nous partons de notre programme main, et puis, d'un seul coup, une interruption apparaît. Donc, soit 5 cycles avant, l'interruption est de niveau 4, donc IRQ, comme : " Interrupt Request ". Et puis, à partir de là, j'exécute mon interruption. Alors mon interruption vient être interrompue, une nouvelle fois, mais cette fois-ci par une interruption de niveau plus élevé, de niveau 7. Et puis, elle mène tranquillement sa vie de petite routine de niveau 7. Et puis entre deux, j'ai une interruption de niveau 1 qui apparaît. Seulement, la niveau 7 n'a pas terminé. Donc tant qu'elle n'a pas terminé, c'est fini. L'interruption de niveau 1, elle, va devoir patienter, parce que la 4 était plus prioritaire, et justement, on n'a pas terminé. Alors la 4, elle, termine, pour le coup. Et puis là, cette fois-ci, OK, on va prendre en compte notre interruption de niveau 1. Alors là, il se passe un certain temps. On a terminé, et on revient au programme principal. Donc j'attire votre attention, par contre, sur les cycles, qui sont nécessaires pour passer, en fait, d'un niveau d'interruption à un autre. Ici, il nous faut absolument cinq cycles d'entrée. Et ici, en fonction des niveaux d'interruption (par exemple, entre le 1 et le main, donc le niveau 0) il faut trois cycles, et pour les autres il faut sept cycles. Donc ce qui est très important, en fait, à savoir. Pour désactiver momentanément des interruptions, Il existe une instruction, par exemple, qui s'appelle : " disi ". Alors vous mettez " disi# ", et puis derrière, vous mettez le nombre de cycles d'instruction pendant lesquelles vous voulez simplement désactiver les interruptions. La deuxième méthode, c'est dans ce cas-là de passer le niveau d'interruption du main, en fait, qui est au niveau 0 du CPU, de le mettre au niveau 7. Alors comme ça, il est ultra prioritaire et toutes les autres sources d'interruption sont forcément en dessous, donc désactivées. Pour ça, il suffit de rentrer ces deux lignes. Alors SRL, c'est l'équivalent du registre de statut sur notre pic24. Comment devons-nous procéder pour effectuer cette configuration d'interruption ? Alors on va prendre un exemple de la configuration de INT0. Donc tout d'abord, il va falloir aller chercher dans le registre IEC0 le fait de valider l'interruption de cette nature qui est INT0. Après, il va falloir aller chercher le registre IPC0 qui va permettre en fait d'assigner, selon les valeurs des bits que vous allez y mettre, le niveau de priorité auquel vous assignait INT0. Et enfin, à la fin, il ne faudra pas oublier, forcément, d'effacer le flag contenu dans ce registre et mettre INT0IF, " Interrupt Flag ", à zéro. Donc, pour la sauvegarde de context, vous avez une sauvegarde de context automatique. Mais seulement, elle ne se fait que pour un niveau. Donc là, les registres W0 à W3 sont faits pour être sauvegardés et mis directement, en fait, dans les registres dit " fantômes ", non accessibles par l'utilisateur, juste en utilisant l'instruction push.s. Et à partir de là, vous avez la sauvegarde de votre context qui se fait automatiquement. De même, en fait, pour le registre de statut, qui passe, ici, à l'adresse 014.

L'essentiel d'Assembleur

Plongez-vous dans le langage bas niveau, nommé Assembleur. Abordez les notions de jeu d'instructions, de pipeline, de registres, de mode d’adressage, de compteur de programme, etc.

4h52 (57 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :26 sept. 2016

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !