Quel est l'intérêt d'avoir une interruption basée sur le niveau?

8

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 whileou 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.

MaNyYaCk
la source
... Une autre chose que j'ai lu est qu'il est utilisé pour créer une boucle, c'est-à-dire aussi longtemps que l'interruption est là, servir l'ISR mais cela pourrait être réalisé avec une boucle while ou do while .... Le fait que quelque chose puisse être atteint d'une manière, ne signifie pas que nous devrions éliminer toutes les autres façons de faire de même.
Eugene Sh.
@EugeneSh. Cela ne fait aucun doute, mais il doit y avoir un solide avantage à faire la même chose dans l'autre sens. N'est-ce pas? Je suis plus intéressé à connaître cet "avantage". Je veux juste savoir quel genre de différence cela fait en boucle en utilisant des instructions de boucle et une interruption basée sur le niveau? Si le bouclage est le seul objectif atteint avec son utilisation.
MaNyYaCk
2
que faire si vous avez plusieurs interruptions en attente sur une seule ligne? Par exemple, chaque déclencheur d'ISR gère un paquet de données mais le périphérique en a plusieurs dans la file d'attente? Avec une interruption déclenchée par un front, le contrôleur d'interruption doit savoir quand l'interruption précédente est gérée et quand il est temps de soumettre l'interruption suivante. Aussi pour les cas d'utilisation où plusieurs interruptions sont affirmées lorsque l'hôte gère toujours une précédente, sans déclenchement de niveau, il est difficile de les mettre en file d'attente et de les hiérarchiser.
user3528438

Réponses:

10

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.

supercat
la source
Je voudrais m'excuser de prendre autant de temps. Mais la question que j'ai posée était très spécifique aux interruptions externes du contrôleur, et il m'a fallu un certain temps pour comprendre toutes les réponses qui sont arrivées en considérant le processeur avec un contrôleur d'interruption. Merci d'avoir fourni cette précieuse réponse.
MaNyYaCk
6

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.

Trevor_G
la source
2

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.

TonyM
la source
1
Je ne dirais pas que les Z80 et 6502 ont utilisé des interruptions déclenchées par les bords pour éviter les problèmes de broches "bloquées". Au lieu de cela, je dirais qu'ils doivent être en mesure de masquer tout type d'interruption une fois que le service a commencé, et pour NMI qui est accompli via un verrou spécial "mask NMI" qui est défini lorsqu'un NMI est réparé, et est effacé lorsque le La broche NMI est libérée.
supercat
@supercat, vous avez décrit comment vous le voyez, mais pas comment fonctionne le Z80 / 6502. Le NMI aurait pu être de niveau, identique à INT / IRQ avec la source d'interruption supprimée par acquittement d'interruption hw ou sw. Fonctionne parfaitement bien. Selon vous, qu'est-ce qui les a amenés à concevoir NMI comme déclencheur de bord et INT / IRQ comme niveau, quel avantage voyez-vous?
TonyM
Le terme "déclenchement par front" est utilisé pour décrire les entrées qui placent un circuit de détection de front avant un synchroniseur, de sorte qu'un signal qui va et vient tout au long d'un seul cycle sera traité, mais je l'ai également vu utilisé pour décrire les entrées qui verrouillent un signal sur chaque signal d'horloge et recherchent un signal absent sur un ou plusieurs cycles puis présent pendant un ou plusieurs cycles. Si le NMI devait être acquitté par logiciel, le fait de ne pas accuser réception de la première interruption masquerait efficacement toutes les suivantes.
supercat
@supercat, ce n'est pas ainsi que fonctionnent les Z80 / 6502 et ils ont été à eux seuls le sujet de mon exemple que vous avez interrogé. Si vous recherchez une discussion sur les NMI déclenchés par les périphéries, veuillez vous rendre sur le chat pour éviter un échange de commentaires prolongé. Je ne sais pas trop ce que je peux ajouter. Merci.
TonyM
Je n'ai pas examiné les détails du fonctionnement du Z80, mais selon la fiche technique 6502, NMI est échantillonné une fois sur chaque horloge phi2. La fiche technique est muette sur les temps d'échantillonnage / de maintien, mais d'après ce que j'ai lu ailleurs, une impulsion NMI qui n'est pas présente pendant au moins trois échantillons consécutifs ne sera pas toujours traitée.
supercat
1

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.

Tony Stewart Sunnyskyguy EE75
la source
1

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".

jonk
la source
1
ça compte. que faire si l'hôte reçoit un autre front sur une autre ligne alors qu'il gère déjà une interruption? quelques choix: 1) ignorer l'interruption entrante; 2) le mettre en file d'attente dans le matériel; 3) interrompre le gestionnaire d'interruption actuel et gérer le nouveau, soit le gérer complètement, soit le mettre en file d'attente pour plus tard. Avec le déclencheur de niveau, vous le laissez simplement là et il sera toujours là pour que vous puissiez le gérer après avoir terminé avec l'ISR actuel.
user3528438
@ user3528438 Je réponds à la question "pourquoi niveau". Je vais donc supprimer cette partie et éviter le débat.
2017
1
Même lorsque vous utilisez des interruptions dédiées, je suggère que les interruptions déclenchées par les fronts ne sont meilleures que si l'on peut être intéressé à répondre à un événement qui peut s'être produit au moment où l'on peut le réparer, et même là en utilisant un verrouillage d'événement périphérique pour déclencher une interruption sensible au niveau peut être tout aussi utile que d'utiliser une interruption sensible au bord. Une interruption déclenchée par un front peut enregistrer une instruction qui serait autrement nécessaire pour effacer le verrou, mais ce n'est généralement pas un coût ou des économies significatifs.
supercat
@supercat J'ai recentré ma réponse pour répondre directement à la question intitulée, afin d'éviter de m'engager dans un long et sordide chapitre et verset. Beaucoup plus simple. (Oui, j'utilise toutes sortes de méthodes d'interruption depuis ... 1974 ... donc j'ai vu toutes les raisons, je pense. Je ne veux tout simplement pas en discuter aujourd'hui.)
jonk