Partout où j'ai recherché la mise en œuvre pratique de l'interruption basée sur le niveau, je n'ai trouvé qu'une seule suggestion que les gens ont donnée, c'est-à-dire désactiver l'interruption dès qu'elle entre dans l' ISR afin qu'elle ne continue pas de se déclencher.
Une autre chose que j'ai lue est qu'elle est utilisée pour créer une boucle, c'est-à-dire tant que l'interruption est là, sert l'ISR, mais cela pourrait être réalisé avec une boucle while
ou do while
.
Et les avantages d'une interruption de niveau pourraient fournir le luxe d'exécuter une instruction du programme principal entre le service des ISR et la latence. J'imagine.
Alors, y a-t-il quelque chose qui me manque quand il s'agit de comprendre l'interruption de niveau?
Une excellente réponse serait de me montrer une sorte d'utilisation pratique des interruptions basées sur le niveau.
la source
Réponses:
Les interruptions basées sur le niveau peuvent être partagées et cascadées en toute sécurité de manière simple et fiable; en revanche, le partage fiable d'interruptions déclenchées par les fronts est souvent difficile et parfois impossible.
Lors de l'utilisation d'interruptions basées sur le niveau, un gestionnaire d'interruption peut simplement demander à chaque source d'interruption possible tour à tour "Avez-vous besoin d'attention", et la réparer si c'est le cas. Une fois cela fait, le gestionnaire peut revenir. Si une source d'interruption qui a été interrogée au début de la séquence décide qu'elle a besoin d'attention pendant qu'une source ultérieure est en cours de maintenance, le processeur remarquera que la broche IRQ est toujours active et relancera le gestionnaire d'interruption, permettant ainsi à l'interruption tardive d'arriver à être entretenu.
Lorsque vous utilisez des interruptions déclenchées par un bord non en cascade, les choses deviennent plus compliquées. Après qu'un gestionnaire d'interruptions a traversé et entretenu tout le monde, il doit ensuite passer en revue et interroger tout le monde pour savoir si un périphérique interrogé précédemment a décidé qu'il avait besoin de service. Ce n'est que lorsque chaque appareil a signalé consécutivement qu'il n'a pas besoin de service que l'interruption peut revenir en toute sécurité. Notez que si les périphériques qui souhaitent un service gardent leur indication "besoin de service" active, le retour d'un gestionnaire d'interruption à un moment où un périphérique a besoin de service peut rendre cette interruption définitivement inutile.
Il peut être utile pour une broche d'E / S d'avoir une logique de capture de front qui, quand un front arrive, définit un verrou et émet une indication "besoin de service" jusqu'à ce que le logiciel l'efface. Une telle chose peut apparaître à l'extrémité avant comme une interruption sensible aux bords. À tout point en aval, cependant, il est préférable que la logique d'interruption demande qu'une interruption soit réparée à tout moment lorsqu'un point en amont n'est pas satisfait.
la source
Une situation évidente où les interruptions basées sur le niveau sont utiles est la situation où le signal est déjà dans cet état lorsque le code commence à surveiller le signal.
Prenons un exemple typique ...
Signal: "Case_Over_Temperature" devient bas lorsque la température ambiante dans la boîte est trop élevée pour un fonctionnement normal.
Évidemment, ce signal pourrait à tout moment baisser, soit parce que nous produisons trop de chaleur, soit parce que le boîtier est installé dans un endroit chaud.
De toute évidence, à la mise sous tension, cette ligne peut être dans l'une ou l'autre condition. Supposons pour le moment que le code de mise sous tension ne se contente pas de rechercher, mais repose plutôt sur l'interruption. Si l'interruption est déclenchée par front et que le signal est déjà faible, lorsque l'interruption est activée, le code approprié n'est pas exécuté. Les interruptions sensibles au niveau seraient prudentes ici.
De même, si le processeur est mis en veille et n'est pas configuré pour se réveiller sur cette interruption, cette ligne peut descendre à tout moment. Quand quoi que ce soit d'autre le réveille, vous voulez que l'interruption se déclenche à ce moment-là.
En effet, sans doute, avec la prévalence des processeurs en mode veille, les interruptions basées sur le niveau sont devenues plus utiles.
Cependant, comme pour tout ce qui concerne le code, il existe toujours plus d'une façon de "dépouiller un chat". Si vous n'utilisez pas de niveau, le code de réveil doit aller interroger les broches d'interruption si elles ne sont pas automatiquement mises en file d'attente par le processeur.
De toute évidence, le niveau déclenché s'accompagne également de son propre ensemble de problèmes en ce que le code doit gérer en sachant qu'il a déjà géré la condition, etc.
la source
C'est un peu l'inverse: pourquoi des interruptions gênantes déclenchées par les bords alors que vous pouvez faire déclencher le niveau plus facilement?
Les interruptions déclenchées par les bords sont plus sensibles aux pics de bruit et plus difficiles à filtrer. Ils courent alors plus de risques de courir à l'extérieur ou sur des câbles. L'interruption ne peut pas être retirée par la source.
Les interruptions déclenchées par le niveau restent actives jusqu'à ce que le CPU reconnaisse la source. Il y a donc la base solide d'une prise de contact complète. Le processeur peut filtrer le bruit du signal d'interruption de presque comme il le souhaite, cela augmente simplement le temps de réponse aux interruptions. Si l'application nécessite et permet des signaux bien filtrés, le déclenchement de niveau est adaptable.
J'ai d'abord vu des interruptions déclenchées par les bords utilisées pour les NMI sur des processeurs comme le Z80 et 6502, tandis que les interruptions masquables utilisaient le niveau déclenché. Les NMIs ont utilisé le déclenchement par bord simplement pour empêcher une broche bloquée ou un circuit de conduite coincé de garder le CPU rentrant pour toujours dans le NMI ISR. Le NMI doit montrer l'activité pour en obtenir un autre.
La réponse, bien sûr, est que les deux ont leurs applications. Mais déclenché par le niveau est le point de départ et déclenché par le bord, car il y a un cas spécial.
la source
Le support ISR basé sur le niveau Ack / Nak est utile lorsque vous avez de nombreuses sources.
Si vous avez de nombreux ISR et de nombreux rangs de priorité dans les SW et HW externes avec des priorités classées.
Si toutes les sources étaient en périphérie OU, vous devriez toujours interroger chacune pour trouver le jeu de sources, puis effacer l'interruption.
Le bord et le niveau présentent donc des avantages dans différentes architectures.
Pour éviter de manquer un IRQ Edge, il doit être activé puis testé immédiatement après à la fin de l'ISR.
Certains IRQ de niveau peuvent durer plus longtemps que l'ISR et détectés si prévu.
la source
C'est quand une "ligne de parti" est utilisée, conjointement avec un drain ouvert ou un collecteur ouvert, lorsque le mode de fonctionnement de niveau a plus de sens.
Dans ce cas, chaque "partie" sur la ligne active sa sortie quand elle a besoin de "service". Au fur et à mesure que le logiciel de gestion des interruptions s'éteint et interroge (puis gère) chaque périphérique sur la ligne du groupe à tour de rôle, ces périphériques relâchent leur prise et deviennent inactifs. Finalement, il n'y a plus d'interruptions (de niveau) restantes, la ligne d'interruption elle-même devient inactive et le logiciel gérant les interruptions redevient "au repos".
la source