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

7

Siempre que he buscado acerca de la implementación práctica de la interrupción basada en nivel, he encontrado una sola sugerencia que la gente ha dado, es decir, deshabilitar la interrupción tan pronto como ingresa a ISR para que no vuelva a activarse.

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

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

Entonces, ¿hay algo que me esté perdiendo cuando se trata de entender 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.

    
pregunta MaNyYaCk

5 respuestas

10

Las interrupciones basadas en niveles pueden compartirse y conectarse en cascada de manera segura y confiable; por el contrario, compartir interrupciones activadas por el borde de manera confiable suele ser difícil y, a veces, imposible.

Cuando se usan interrupciones basadas en niveles, un manejador de interrupciones puede simplemente preguntar cada posible fuente de interrupción por turno "¿Necesita atención", y darle servicio si es así? Una vez hecho esto, el manejador puede volver. Si una fuente de interrupción que fue interrogada al principio de la secuencia decide que necesita atención mientras se está revisando una fuente posterior, el procesador notará que el pin IRQ todavía está activo y vuelve a activar el controlador de interrupciones, permitiendo así que la interrupción que llega tarde ser reparado.

Cuando se utilizan interrupciones activadas por flanco no en cascada, las cosas se complican. Después de que un manejador de interrupciones haya revisado y atendido a todos, debe revisar y encuestar a todos para averiguar si un dispositivo previamente sondeado ha decidido que necesita servicio. Solo después de que cada dispositivo haya reportado 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 "necesita servicio", volver de un controlador de interrupción en un momento en que un dispositivo necesita servicio puede hacer que esa interrupción sea permanentemente inútil.

Puede ser útil que un pin de E / S tenga alguna lógica de captura de borde que, cuando llega un borde, establece un pestillo y emite una indicación de "servicio de necesidad" 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 descendente, es mejor que la lógica de interrupción exija que se realice el servicio de una interrupción en todo momento cuando no se satisfaga ningún punto ascendente.

    
respondido por el supercat
6

Una situación obvia en la que las interrupciones basadas en niveles son útiles es para la situación en la que la señal ya se encuentra 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 el funcionamiento normal ..

Obviamente, esta señal podría bajar en cualquier momento, ya sea porque estamos generando demasiado calor o porque la caja está instalada en una ubicación caliente.

Obviamente, en el encendido esa línea podría estar en cualquiera de las dos condiciones. Supongamos por un momento que el código de encendido no solo se ve, sino que se basa en la interrupción. Si la interrupción se activa por flanco y la señal ya es baja, cuando se habilite la interrupción, no se ejecutará el código apropiado . Las interrupciones sensibles al nivel serían prudentes aquí.

De forma similar, si el procesador se pone en suspensión y no está configurado para activarse en esa interrupción, esa línea puede bajar en cualquier momento. Cuando ocurra lo que sea que lo despierte, quiere que la interrupción se dispare en ese momento.

De hecho, podría decirse que, con la prevalencia de los procesadores en 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 "despellejar a un gato". Si no usa el nivel basado en, el código de activación debe ir a 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, ya que el código debe manejarse sabiendo que ya ha manejado la condición, etc.

    
respondido por el Trevor_G
2

El soporte de ISR basado en niveles Ack / Nak, que es útil cuando tienes muchas fuentes.

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

Si todas las fuentes fueran de borde O, todavía tendría que sondear cada una para encontrar la fuente establecida y luego eliminar la interrupción.

Por lo tanto, tanto el borde como el nivel tienen ventajas en diferentes arquitecturas.

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

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

    
respondido por el Tony EE rocketscientist
2

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

Las interrupciones activadas por el borde son más susceptibles a los picos de ruido y más difíciles de filtrar. Entonces, son más arriesgados correr cables fuera del tablero. La fuente no puede retirar la interrupción.

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 en casi cualquier forma que desee, solo está aumentando el tiempo de respuesta de la 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 activadas por el borde se usaron para NMI en CPU como la Z80 y 6502, mientras que las interrupciones enmascarables utilizaron el nivel activado. Los NMI utilizaron activadores de borde simplemente para evitar que un pin atascado o un circuito de conducción atascado impida que la CPU vuelva a ingresar al ISR de NMI para siempre. El NMI debe mostrar actividad para obtener otro.

La respuesta, por supuesto, es que ambos tienen sus aplicaciones. Pero el nivel de activación por nivel es el punto de inicio y el de activación por flanco porque hay un caso especial.

    
respondido por el TonyM
1

Es cuando se usa una "línea de fiesta", junto con el drenaje abierto o el 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 sale y sondea (y luego maneja) cada dispositivo en la línea compartida, estos dispositivos liberan su retención y se vuelven inactivos. Finalmente, ya no quedan más interrupciones (de nivel), la línea de interrupción en sí queda inactiva y las interrupciones en el manejo del software vuelven a estar "inactivas".

    
respondido por el jonk

Lea otras preguntas en las etiquetas