¿Qué sucede en STM32 cuando se activan múltiples Interrupciones (UART) al mismo tiempo? ¿hay una pila de interrupción?

5

Estoy implementando un esquema de comunicación en cadena de uart con un Cortex M4. Cuando un nodo recibe un byte sobre un UART, se genera una interrupción ( RXNE ) y el byte se escribe sobre otro UART, ya que uso un búfer de envío y recepción, esto coloca el byte en el búfer de envío y habilita el TXE de interrupción que debe activarse posteriormente.

Esto significa que por cada byte recibido, se activan dos interrupciones.

Ahora ambas UART pueden recibir y transmitir, y es muy posible que ambas UART reciban un byte al mismo tiempo; ahora ambas recibirán una interrupción RXNE y activarán una interrupción TXE en la otra UART.

Pero solo se puede procesar un ISR al mismo tiempo, ¿qué sucede con los otros?

¿Hay una pila de interrupciones que se llene o que se interrumpa simplemente con la llamada hasta que se borren todos los bits de interrupción correspondientes?

El problema es que mi aplicación tiende a bloquearse en la situación descrita anteriormente (con múltiples bytes recibidos). Sin embargo, no cuando los UART se configuran a una velocidad más baja (esto parece contrario a la intuición) o cuando solo hay un lado conectado.

    
pregunta user1273684

3 respuestas

3

Lo que estás haciendo es bastante normal y debería ser posible que funcione correctamente.

Los procesadores M4 tienen varias docenas de fuentes de interrupción y es muy común que 2 o más solicitudes de interrupción (IRQ) se activen al mismo tiempo. Los IRQ están "bloqueados" por la lógica de interrupción y el controlador de interrupción decide en función de la prioridad de cuál procesar primero (por vectorización al controlador de interrupción). La segunda IRQ todavía está bloqueada y se denomina "interrupción pendiente". En términos sencillos, cuando un controlador de interrupciones ha completado su procesamiento, debe ejecutar una instrucción especial llamada "retorno de interrupción" que le permite al controlador de interrupciones procesar la siguiente IRQ pendiente.

Aunque a veces hablamos de "interrupciones apiladas" en una situación como la suya, no se guardan en una "pila" como tal, y por lo tanto no pueden quedarse sin espacio y perder la IRQ. En general, los IRQ permanecen bloqueados hasta que el bit de IRQ correspondiente es borrado por el software.

Es difícil saber exactamente por qué su sistema se está bloqueando, es posible que deba proporcionar más detalles. Un par de cosas para ver:

  1. ¿Su controlador de interrupciones siempre está borrando el indicador IRQ correspondiente? Si no se borra la bandera, el procesador puede bloquearse en un bucle que se transmite constantemente al controlador y no permite que se ejecuten otras cosas.

  2. ¿Su controlador de interrupciones siempre sale correctamente ejecutando una instrucción especial de "retorno de interrupción"? Si no lo hace, entonces no permitirá que el controlador de interrupciones maneje otra IRQ en el mismo nivel de prioridad, y parecerá que su procesador ya no responde a estas interrupciones.

respondido por el Steve G
1

Por lo general, en el sistema CPU / MCU tiene una configuración de prioridad cuya interrupción se procesará antes. Cuando se desencadena la interrupción, se coloca en la lista de colas. STM32 tiene un controlador de interrupción vectorial anidado NVIC, tal vez debería leer un manual primero.

    
respondido por el Marko Buršič
1

Debe leer sobre el NVIC (Controlador de interrupción vectorial anidado) que usa stm32. Lo que suceda dependerá de cómo haya configurado las prioridades asociadas a cada interrupción en el NVIC, deberá leer RM0090 (manual de referencia de STM32F4) en detalle.

Las interrupciones se procesan en la pila de llamadas al igual que las llamadas a funciones. Si una interrupción se encuentra en medio de la ejecución cuando se produce una interrupción de mayor prioridad, la segunda interrupción se apila encima de la primera y comienza su ejecución. Cuando se completa la segunda interrupción, la CPU retrocede y finaliza la primera, y luego vuelve al hilo de nivel de usuario.

Si configura sus interrupciones UART para que tengan la misma prioridad, entonces se permitirá que la primera llamada finalice antes de que la segunda comience a ejecutarse.

Sí, puedes quedarte sin espacio en la pila, pero es la pila de llamadas no una pila de interrupción especial. Tenga en cuenta que la CPU tiene dos punteros de pila, y debe tener cuidado con en qué pila se encuentra, porque eso puede cambiar en una interrupción.

    
respondido por el William Brodie-Tyrrell

Lea otras preguntas en las etiquetas