Misma interrupción de prioridad en ARM Cortex M0

Tengo dos dos interrupciones de la misma prioridad; cada uno tiene su propia rutina de servicio de interrupción: ISR_A e ISR_B.

Cuando ocurre la interrupción A, ISR_A se ejecuta... ¿qué sucede si ocurre la interrupción B mientras ISR_A se está ejecutando? ¿Se ejecutará ISR_B después de que ISR_A haya terminado? o ISR_B nunca se ejecutará?

Estoy usando un Freescale KL25z Arm Cortex M0+ con GCC

Respuestas (2)

La arquitectura central ARM admite dos tipos diferentes de interrupciones: sensibles a pulsos y sensibles a niveles. (Consulte el Manual de referencia de la arquitectura ARMv6-M, Sección B3.4.1) En cualquier caso, si ocurren dos interrupciones al mismo tiempo, o una de ellas ocurre mientras se procesa la primera interrupción, la segunda interrupción se procesará cuando el servicio de la primera interrupción. la rutina regresa y vuelve a habilitar las interrupciones.

La fuente de una interrupción sensible al nivel permanecerá activa hasta que la rutina de servicio de interrupción la elimine. Si la rutina de servicio de interrupción no borra la fuente de interrupción, se generará una segunda interrupción tan pronto como se vuelvan a habilitar las interrupciones. La fuente se puede borrar leyendo un registro de datos, por ejemplo, o en algunos casos borrando explícitamente una bandera.

La interrupción sensible al pulso establecerá una bandera que generará la interrupción, sin embargo, el pulso debe ser lo suficientemente largo para que el procesador lo atrape. Si el pulso no es lo suficientemente largo, no se detectará. La rutina de servicio de interrupción necesita borrar explícitamente la bandera.

No estoy seguro de lo que sucederá en el caso de que ocurran interrupciones sensibles de dos niveles al mismo tiempo y la rutina de servicio de interrupción haga algo con el periférico que reconozca ambas interrupciones. Un ejemplo de esto sería un controlador USART que estuviera manejando interrupciones Rx y Tx. Creo que la segunda interrupción no se verá ya que ya no está activa cuando se vuelven a habilitar las interrupciones. Estoy justo en medio de un proyecto ARM y, a menos que alguien publique la respuesta, haré algunas pruebas y editaré esta respuesta con los resultados.

No soy un experto en ARM, pero en todas las demás MCU en las que he trabajado, las interrupciones establecen un indicador, y ese indicador se examina durante el ciclo de ejecución normal. Si ocurre una interrupción mientras se está ejecutando otra, el indicador aún se establece y se examina cuando finaliza el ISR actual, iniciando así el siguiente ISR.