Interrupción de la misma prioridad en ARM Cortex M0

1

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 se produce la interrupción A, ISR_A se ejecuta ... ¿qué sucede si se produce la interrupción B mientras se ejecuta ISR_A? ¿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

    
pregunta hassan789

2 respuestas

2

La arquitectura ARM principal admite dos tipos diferentes de interrupciones: sensible al pulso y sensible al nivel. (Consulte el Manual de referencia de arquitectura ARMv6-M, Sección B3.4.1) En cualquier caso, si ocurren dos interrupciones al mismo tiempo, o si ocurre una de ellas mientras se procesa la primera interrupción, la segunda interrupción se procesará cuando la primera interrupción de servicio La rutina devuelve 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 borre. 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á un indicador 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 será atrapado. La rutina de servicio de interrupción debe borrar explícitamente la bandera.

No estoy seguro de lo que sucederá en el caso de que ocurran dos interrupciones sensibles al nivel al mismo tiempo y la rutina de servicio de interrupción haga algo con el periférico que confirme ambas interrupciones. Un ejemplo de esto sería un controlador USART que manejaba las interrupciones Rx y Tx. Creo que la segunda interrupción no se verá ya que ya no está activa cuando la interrupción se vuelve a habilitar. 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.

    
respondido por el tomontee
1

No soy un experto en ARM, pero en todas las otras MCU con las que he trabajado, las interrupciones activan un indicador y ese indicador se examina durante el ciclo de ejecución normal. Si se produce 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.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas