Interrumpir la pregunta ARM?

2

A menudo veo algo como esto void UART2_IRQHandler(void) __irq , y me pregunto por qué se usa __irq al declarar el controlador de interrupciones, ¿es necesario o el controlador puede funcionar sin él?

    
pregunta Lazar

3 respuestas

4

Básicamente, una rutina de servicio de interrupción escrita en C es simplemente una función que no toma argumentos y no devuelve nada void someKindOfIsr(void) .

__irq es una extensión de lenguaje C para su compilador que se utiliza para generar una entrada especial y / o salir de las instrucciones de ensamblaje para manejar las interrupciones. Por ejemplo, la instrucción de retorno puede ser diferente si regresa de una interrupción en lugar de una simple función para borrar algún tipo de registro de estado de interrupción.

Si es necesario o no depende de la arquitectura ARM con la que esté trabajando. Una forma rápida de averiguar si es necesario para su plataforma es examinar el ensamblaje producido con y sin la palabra clave __irq .

Incluso si el archivo del listado es exactamente el mismo con y sin la palabra clave __irq , es posible que desee considerar dejar la palabra clave __irq en su lugar para mayor claridad y portabilidad a alguna plataforma futura.

    
respondido por el semaj
5

Algunos microcontroladores requieren un manejo diferente de la pila y regresan para las funciones de manejo de interrupciones como para las funciones normales.

Para los controladores ARM, una entrada normal a una subrutina usa un PUSH para guardar cosas en la pila, y al salir de la subrutina, se recuperaría el estado guardado y se abandonaría la subrutina. ( ARM Assembly Reference page 65 )

Para un controlador de excepciones en las plataformas ARM modernas, el estado se inserta automáticamente en la pila, por lo que el compilador no necesita crear una instrucción PUSH en la entrada de la función. Además, la salida de un controlador de excepciones puede parecer diferente de la normal, la arquitectura ARMv7-M regresará de una excepción si POP / LDM, LDR o BX cargarán un valor de 0xFXXXXXXX en el contador del programa (PC).

Entonces, __irq le dice al compilador que esta entrada y salida de funciones puede requerir un tratamiento especial, y especial dependiendo del objetivo establecido (para 8051 creo que había RET para el retorno normal y RETI para el retorno de interrupción).

    
respondido por el Arsenal
-3

No, no puede funcionar sin _irq. Es un formato general. tienes que seguir esto de lo contrario no funcionará.

    
respondido por el Sampath

Lea otras preguntas en las etiquetas