¿Cuál es el punto de tener interrupciones basadas en niveles?


8

Dondequiera que he buscado sobre la implementación práctica de la interrupción basada en el nivel, solo he encontrado una sugerencia que la gente me ha dado, es decir, deshabilite la interrupción tan pronto como ingrese al ISR para que no siga disparando.

Otra cosa que he leído es que se usa para crear un bucle, es decir, siempre que haya una interrupción, sirva al ISR, pero eso podría lograrse con un bucle whileo do while.

Y las ventajas que proporcionaría una interrupción de borde de nivel podrían ser el lujo de ejecutar una instrucción del programa principal entre el servicio de los ISR y la latencia. Supongo.

Entonces, ¿hay algo que me falta cuando se trata de comprender la interrupción de borde de nivel?

Una gran respuesta sería mostrarme algún tipo de uso práctico de las interrupciones basadas en niveles.


... Otra cosa que he leído es que se usa para crear un bucle, es decir, siempre que haya una interrupción, sirva al ISR, pero eso podría lograrse con un tiempo o hacer un bucle while ... El hecho de que algo puede ser logrado de una manera, no significa que debamos eliminar todas las otras formas de hacer lo mismo.
Eugene Sh.

@EugeneSh. No hay duda al respecto, pero debe haber alguna ventaja sólida para hacer lo mismo de la otra manera. ¿No es así? Estoy más interesado en saber esa "ventaja". Solo quiero saber qué tipo de diferencia hace en el bucle usando declaraciones de bucle e interrupción basada en el nivel. Si el bucle es el único propósito logrado usándolo
MaNyYaCk

2
¿Qué pasa si tiene varias interrupciones pendientes en una línea? Por ejemplo, ¿cada disparador de ISR maneja un paquete de datos pero el dispositivo tiene múltiples en la cola? Con la interrupción activada por flanco, el controlador de interrupción necesita saber cuándo se maneja la interrupción anterior y cuándo es el momento de enviar la próxima interrupción. También para casos de uso donde se afirman interrupciones múltiples cuando el host todavía está manejando una anterior, sin activación de nivel, es difícil ponerlas en cola y priorizarlas.
user3528438

Respuestas:


10

Las interrupciones basadas en niveles pueden compartirse y conectarse en cascada de manera fácil y confiable; por el contrario, compartir de manera confiable las interrupciones activadas por el borde a menudo es difícil y a veces imposible.

Cuando se usan interrupciones basadas en niveles, un manejador de interrupciones simplemente puede preguntar a cada posible fuente de interrupción "¿Necesita atención?" Y atenderla si es así. Una vez hecho, el controlador puede volver. Si una fuente de interrupción que se encuestó al principio de la secuencia decide que necesita atención mientras se repara una fuente posterior, el procesador notará que el pin IRQ todavía está activo y volverá a activar el controlador de interrupción, permitiendo así que la interrupción que llega tarde Ser atendido.

Cuando se usan interrupciones no en cascada activadas por bordes, las cosas se vuelven más complicadas. Después de que un controlador de interrupciones haya pasado y haya prestado servicio a todos, debe pasar y volver a sondear a todos para averiguar si un dispositivo previamente consultado ha decidido que necesita servicio. Solo después de que cada dispositivo haya informado consecutivamente que no necesita servicio, sería seguro que la interrupción regrese. Tenga en cuenta que si los dispositivos que desean servicio mantienen activa su indicación de "necesidad de servicio", regresar de un controlador de interrupciones en un momento en que un dispositivo necesita servicio puede hacer que esa interrupción sea inútil permanentemente.

Puede ser útil que un pin de E / S tenga cierta lógica de captura de borde que, cuando llega un borde, establece un pestillo y emite una indicación de "necesidad de servicio" hasta que el software lo borra. Tal cosa podría aparecer en el extremo frontal como una interrupción sensible al borde. Sin embargo, en cualquier punto aguas abajo, es mejor tener una lógica de interrupción que exija que se atienda una interrupción en todo momento cuando no se satisfaga ningún punto aguas arriba.


Me gustaría disculparme por tomarme tanto tiempo. Pero la pregunta que hice fue muy específica para las interrupciones externas del controlador, y me tomó cierto tiempo entender todas las respuestas que surgieron considerando el procesador con un controlador de interrupción. Gracias por proporcionar esta valiosa respuesta.
MaNyYaCk

6

Una situación obvia donde las interrupciones basadas en el nivel son útiles es para la situación en la que la señal ya está en ese estado cuando el código comienza a monitorear la señal.

Consideremos un ejemplo típico ...

Señal: "Case_Over_Temperature" baja cuando el ambiente en la caja es demasiado alto para la operación normal.

Obviamente, esta señal podría bajar en cualquier momento, ya sea porque estamos haciendo demasiado calor o porque la caja está instalada en un lugar caliente.

Obviamente, al encender esa línea podría estar en cualquier condición. Supongamos por el momento que el código de encendido no solo se ve, sino que se basa en la interrupción. Si la interrupción es activada por el borde y la señal ya es baja, cuando la interrupción se habilita, el código apropiado no se ejecutará. Las interrupciones sensibles al nivel serían prudentes aquí.

Del mismo modo, si el procesador se pone en suspensión y no está configurado para activarse en esa interrupción, esa línea puede quedar baja en cualquier momento. Cuando ocurra lo que sea que despierte, querrá que la interrupción se active en ese momento.

De hecho, podría decirse que, con la prevalencia de los procesadores del modo de suspensión, las interrupciones basadas en niveles se han vuelto más útiles.

Sin embargo, como con todo lo relacionado con el código, siempre hay más de una forma de "desollar un gato". Si no utiliza el nivel, el código de activación debe sondear los pines de interrupción si el procesador no los pone en cola automáticamente.

Obviamente, el nivel activado también viene con su propio conjunto de problemas en el que el código tiene que manejar sabiendo que ya ha manejado la condición, etc.


2

Es algo al revés: ¿por qué tener interrupciones incómodas activadas por el borde cuando se puede activar el nivel más fácilmente?

Las interrupciones activadas por el borde son más susceptibles a picos de ruido y más difíciles de filtrar. Entonces son más arriesgados de correr cables fuera de borda o cables. La interrupción no puede ser retirada por la fuente.

Las interrupciones activadas por nivel permanecen activadas hasta que la CPU reconoce la fuente. Así que ahí está la base sólida del apretón de manos completo. La CPU puede filtrar el ruido de la señal de interrupción de casi cualquier forma que desee, solo está aumentando el tiempo de respuesta de interrupción. Si la aplicación requiere y permite señales bien filtradas, la activación de nivel es adaptable.

La primera vez que vi interrupciones disparadas por el borde se utilizaron para NMI en CPU como el Z80 y 6502, mientras que las interrupciones enmascaradas usaron el nivel disparado. Los NMI usaban activación por flancos simplemente para evitar que un pin atascado o un circuito de conducción atascado impidiera que la CPU volviera a ingresar al NMI ISR para siempre. El NMI debe mostrar actividad para obtener otro.

La respuesta, por supuesto, es que ambos tienen sus aplicaciones. Pero disparado por nivel es el punto de partida y disparado desde el borde porque hay un caso especial.


1
No diría que el Z80 y el 6502 usaron interrupciones activadas por bordes para evitar problemas de pines "atascados". En cambio, yo diría que necesitan poder enmascarar cualquier tipo de interrupción una vez que el servicio ha comenzado, y para NMI eso se logra a través de un pestillo especial "enmascarar NMI" que se establece cuando se repara un NMI, y se borra cuando el Se libera el pin NMI.
supercat

@supercat, has descrito cómo lo ves pero no cómo funciona Z80 / 6502. El NMI podría haber estado nivelado, igual que INT / IRQ con la fuente de interrupción eliminada por el reconocimiento de interrupción hw o sw. Funciona perfectamente bien ¿Qué crees que les hizo diseñar NMI como activado por flancos e INT / IRQ como nivel, qué ves como beneficio?
TonyM

El término "activación de borde" se usa para describir entradas que colocan un circuito de detección de borde antes de un sincronizador, para que se procese una señal que entra y sale en un solo ciclo, pero también he visto que se usa para describir entradas que bloquean una señal en cada señal de reloj y buscan una señal que esté ausente en uno o más ciclos y luego presente durante uno o más ciclos. Si el software tuviera que reconocer el NMI, el hecho de no reconocer la primera interrupción enmascararía efectivamente todos los siguientes.
supercat

@supercat, no es así como funciona Z80 / 6502 y solo ellos fueron el tema de mi ejemplo que cuestionaste. Si está buscando una discusión sobre los NMI activados por el borde, vaya al chat para evitar un intercambio extendido de comentarios. Sin embargo, no estoy seguro de lo que puedo agregar. Gracias.
TonyM

No he visto los detalles de cómo funciona el Z80, pero de acuerdo con la hoja de datos 6502, NMI se muestrea una vez en cada reloj phi2. La hoja de datos no dice nada sobre los tiempos de muestreo / retención, pero por lo que he leído en otra parte, un pulso NMI que no está presente durante al menos tres muestras consecutivas no siempre se procesará.
supercat

1

El ISR basado en niveles admite Ack / Nak, que es útil cuando tiene muchas fuentes.

Si tiene muchos ISR y muchos rangos de prioridad tanto en SW como en HW externo con prioridades clasificadas.

Si todas las fuentes fueran de borde O, todavía tendría que sondear cada una para encontrar qué conjunto de fuentes y luego borrar la interrupción.

Por lo tanto, tanto edge como level tienen ventajas en diferentes arquitecturas.

Para evitar perder un Edge IRQ, debe habilitarse y luego probarse inmediatamente después del final del ISR.

Algunos IRQ de nivel pueden durar mucho más que el ISR y detectarse si se espera.


1

Es cuando se usa una "línea compartida", junto con un drenaje abierto o un colector abierto, cuando el modo de operación de nivel tiene más sentido.

En este caso, cada "parte" en la línea activa su salida cuando necesita "servicio". A medida que el software de manejo de interrupciones se apaga y sondea (y luego maneja) cada dispositivo en la línea compartida, estos dispositivos liberan su retención y quedan inactivos. Eventualmente, no quedan más interrupciones (de nivel), la línea de interrupción en sí misma queda inactiva y las interrupciones de manejo de software se vuelven "inactivas" nuevamente.


1
Si importa. ¿Qué pasa si el host recibe otro borde en otra línea cuando ya está manejando una interrupción? algunas opciones: 1) ignorar la interrupción entrante; 2) ponerlo en cola en el hardware; 3) interrumpa el controlador de interrupción actual y maneje el nuevo, ya sea manejarlo completamente o ponerlo en cola para más adelante. Con el disparador de nivel, simplemente lo deja allí y seguirá estando allí para que lo maneje una vez que haya terminado con el ISR actual.
user3528438

@ user3528438 Estoy abordando la pregunta sobre "por qué nivel". Así que simplemente eliminaré esa parte y evitaré el debate.
jonk

1
Incluso cuando se usan interrupciones dedicadas, sugeriría que las interrupciones activadas por el borde solo son mejores si uno está interesado en responder a un evento que puede haber ido y venido en el momento en que uno puede repararlo, e incluso allí usando un bloqueo de evento un dispositivo para controlar una interrupción sensible al nivel puede ser tan útil como usar una interrupción sensible al borde. Una interrupción activada por el borde puede guardar una instrucción que de otro modo sería necesaria para liberar el pestillo, pero generalmente no es un costo o ahorro significativo.
supercat

@supercat He reenfocado mi respuesta para responder directamente a la pregunta titulada, a fin de evitar participar en un capítulo y verso largo y sórdido. Mucho mas simple. (Sí, he estado usando todo tipo de métodos de interrupción desde ... 1974 ... así que he visto todas las razones, creo. Simplemente no quiero discutirlas hoy)
jonk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.