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 while
o 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.
fuente
Respuestas:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente