¿Cómo funcionan las interrupciones en los sistemas embebidos? necesito una vista general

Estoy tratando de entender las interrupciones en los sistemas integrados. Por favor, corrígeme donde me equivoco. A continuación se muestra mi entendimiento.

Esto podría ayudarme a mí y a otros que están tratando de entender las interrupciones.

  1. Las interrupciones son las señales generadas por un periférico para solicitar al microprocesador que realice una tarea. Cuando ocurre una interrupción, la CPU ejecuta la instrucción de ejecución actual y luego almacena el puntero de pila necesario y la información del contador de programa (PC) en algún lugar de la RAM asignada para la función actual.

  2. La PC ahora está vectorizada al índice de la tabla de vectores de interrupción correspondiente para ejecutar la rutina ISR.

  3. A todas las interrupciones se les asignan bits de habilitación individuales que deben escribirse como uno lógico junto con el bit de habilitación de interrupción global en el registro de estado para habilitar la interrupción.

  4. Cuando ocurre una interrupción, su indicador de interrupción se establece y la rutina ISR correspondiente lee este indicador dentro de ellos. Para algunos periféricos, estos pueden borrarse automáticamente leyendo el bit indicador de interrupción y el registro de datos, mientras que para algunos periféricos necesitamos escribir explícitamente uno lógico para borrar el bit indicador de interrupción.

  5. Si el bit de indicador de interrupción correspondiente no se borra, no puede volver a interrumpir los eventos correspondientes (por ejemplo, cuando ocurrió la interrupción A y su indicador de interrupción se establece hasta que, a menos que borre el indicador de interrupción, el procesador no será notificado sobre el próximo evento de A, ) asegúrese de leer el registro necesario antes de borrarlos. ¿Estoy en lo correcto?

  6. Cuando ocurre una interrupción, dentro de su rutina ISR podemos deshabilitar la interrupción ya sea configurando el bit de habilitación de interrupción individual a cero o configurando el bit de interrupción global a cero. No se recomienda hacer esto porque impide que se produzcan interrupciones anidadas, por lo que se perderá parte de la información.

  7. Cuando las interrupciones anidadas están habilitadas, una prioridad baja puede ser reemplazada por una interrupción de prioridad alta. La rutina ISR de la interrupción de prioridad baja se guardará y se ejecutará la prioridad alta. Si ambos tienen la misma prioridad, se ejecutará la interrupción con la subprioridad más baja. ¿Quién asigna esta sub-prioridad?

  8. Las interrupciones enmascarables son aquellas en las que podemos deshabilitar la interrupción escribiendo instrucciones como establecer el bit "Habilitar interrupción" en cero.

  9. Las interrupciones vectorizadas son aquellas en las que ya sabemos la dirección a saltar para el ISR, como la tabla de vectores de interrupción con dirección y prioridad, por ejemplo, la interrupción SPI, I2C, UART, temporizador.

  10. ¿Qué son las interrupciones no vectoriales? Sé que no tenemos una dirección predefinida, pero ¿qué se supone que significa eso? ¿Alguien puede dar un ejemplo?

Los uC PIC16 (al menos los más antiguos) son ejemplos bien conocidos de dispositivos que tienen interrupciones no vectoriales. Todas las interrupciones comparten el mismo vector, por lo que terminan en la misma función ISR. El software necesita sondear banderas para determinar qué interrupción se ha producido.
@Tagli ish. Dependiendo del PIC, puede haber más de un vector según la prioridad. No estoy seguro si el PIC16 tiene esto, pero el PIC18 (por ejemplo) sí
Si quiere que su cerebro se enrede, vea el método DEC 21064 (Alpha) para manejar interrupciones. No se ajusta bien a sus descripciones. Si bien se completan las instrucciones anteriores a la interrupción, el hardware no se ocupa de los cambios de estado provocados por las instrucciones posteriores a la interrupción. Eso se deja a la rutina de interrupción para hacer frente. Es un dolor serio envolver tu mente. ¿Línea de fondo? Hay tantas formas de gestionar las interrupciones en el hardware que es muy difícil llegar a una definición única.

Respuestas (2)

Lo que ha escrito es correcto en sí mismo, pero no estoy seguro de para qué sirve.

Está en un nivel demasiado bajo para comprender cuándo necesita usar interrupciones o qué hacen por usted. No se puede ver el bosque por los árboles.

Sin embargo, es un nivel demasiado alto y no lo suficientemente detallado como para implementar interrupciones en una máquina en particular, ya que tendrán diferentes direcciones específicas para sus vectores o números de bits para sus máscaras, por lo que debe profundizar en la documentación detallada para cualquier objetivo en particular para usalos, usalos a ellos. Casi no tiene sentido hablar de ellos hasta que intentas programar una máquina en particular.

En el nivel más simple, las interrupciones permiten que una computadora o controlador responda en tiempo real a un evento en particular que sucede.

Sin interrupciones, una computadora sondearía las diversas entradas y, dependiendo de qué tan rápido fuera el ciclo de sondeo y cuánto tardara en atender otro evento, podría esperar mucho tiempo para atender su evento. Si todas sus rutinas de servicio son cortas, si todos sus eventos toleran esa espera antes del servicio, entonces no hay necesidad de interrupciones.

Un modelo simple común que a menudo implemento en los microcontroladores es pensar en él como dos máquinas, una máquina en tiempo real y una máquina en segundo plano, que comparten un chip. Luego tengo una interrupción rápida (más o menos) en ejecución, cada 1 ms o 10 us más o menos, que hace lo que debe hacerse ahora , por ejemplo, cargar un registro periférico o leer un ADC. Luego tengo un proceso en segundo plano que maneja cosas complicadas pero más lentas, como analizar mensajes entrantes o escribir archivos en la tarjeta SD.

Eso es muy simple. Para sistemas más complicados, necesitará un control más preciso. Si las interrupciones pueden interrumpir otras rutinas de interrupción depende de su importancia y tiempo de ejecución, que es algo específico de la aplicación. Los bits de máscara, las banderas ISR, etc., son solo recursos que le permiten controlar qué puede interrumpir qué y cuándo. Si las interrupciones tienen que generar la respuesta en 10 ciclos de reloj o 1000, afecta si debe usar una interrupción vectorizada o si puede esperar una no vectorizada para averiguar por qué se invocó, y nuevamente es muy específico de la aplicación.

Ese es el mismo modelo que suelo usar.
No estoy de acuerdo. La explicación del OP es correcta y útil y proporciona una idea de cómo el chip realmente maneja las cosas, lo que sucede físicamente.
Tu modelo puede ser un método válido para pensar en tus problemas a tu manera, pero no proporciona ninguna idea del funcionamiento. Podría tener 27 interrupciones, todas priorizadas y ejecutándose juntas, o simplemente podría tener una MCU que no haga nada más que ejecutar código en una sola interrupción.

Su comprensión es generalmente correcta. Ha mencionado algunas cosas que son específicas del dispositivo hasta cierto punto, como escribir 1 y 0 para habilitar y deshabilitar las interrupciones, ya que algunas arquitecturas funcionan de manera ligeramente diferente y no todos los procesadores permiten interrupciones anidadas.