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.
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.
La PC ahora está vectorizada al índice de la tabla de vectores de interrupción correspondiente para ejecutar la rutina ISR.
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.
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.
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?
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.
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?
Las interrupciones enmascarables son aquellas en las que podemos deshabilitar la interrupción escribiendo instrucciones como establecer el bit "Habilitar interrupción" en cero.
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.
¿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?
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.
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.
Tagli
Reinderien
broma