Habilitar interrupción pero no ISR


10

Me gustaría saber qué sucede si se habilita una interrupción (por ejemplo: interrupción de pérdida de arbitraje en el módulo CAN del LPC1778 de NXP), pero no se ha definido ningún ISR para la interrupción.

Cuando se produce una interrupción de este tipo, sé que se establecerá el indicador de interrupción respectivo, pero como no he definido ningún ISR, no habrá ninguna dirección de compensación de vector de interrupción almacenada para la transferencia de control para dicha interrupción y, por lo tanto, el control volverá a pasar a la rutina principal, y puedo restablecer el indicador de interrupción sondeándolo en la rutina principal (esto es lo que estoy pensando). ¿Habrá alguna latencia cuando la CPU descubra que no hay ISR a la que saltar?

Cualquier solución sobre lo que podría suceder realmente me puede ayudar.

Gracias.

Actualizar:

Habilité CAN Interrupt en mi uC, pero no definí un ISR. Cuando realicé una prueba de bucle interno, el código ingresó en un bucle infinito. Aquí está el código de desensamblaje del bucle infinito que se ejecuta en LPC1778:

B       .
ENDP

Entonces, si está usando interrupciones, use el ISR.


3
No necesita habilitar la interrupción para poder sondear las banderas en su función principal. Si se produce la condición que establece el indicador, ese indicador se establecerá independientemente de si ha habilitado o no la interrupción asociada.
Brhans

¿Estás diciendo que se establecerá una bandera de interrupción de Arbitraje de autobús perdido incluso si no habilito la "interrupción de Arbitraje de autobús perdido" (aunque no hay un registro de estado que pueda indicar la pérdida de Arbitraje de autobús excepto el registro de estado de Interrupción)?
AlphaGoku

Si. En cada MCU con la que he trabajado, los indicadores de interrupción se establecen siempre que se produce la condición que debería establecerlos. Al habilitar la interrupción, la MCU se vectoriza al controlador cuando se establece el indicador asociado y la desactivación de la interrupción hace que ignore el indicador y no se vectorice al controlador aunque el indicador esté establecido . Desactivar / habilitar la interrupción solo afecta el comportamiento del controlador de salto a interrupción, no el comportamiento de establecimiento de la bandera.
Brhans

Wow, eso es algo que no sabía. Muchas gracias. Por lo tanto, cada controlador debe verificar periódicamente los registros de estado de interrupción y restablecerlos a pesar de que las interrupciones no se hayan habilitado :)
AlphaGoku

@AkshayImmanuelD solo si es importante. Si la interrupción siempre está deshabilitada, y nada más se preocupa por el indicador, entonces si está configurado o borrado es irrelevante.
hobbs

Respuestas:


17

Si no hay un ISR definido, la ubicación de la instrucción de salto en el vector de interrupción será nula, puede ser un salto a una rutina de excepción, puede saltar al comienzo del programa o puede contener un "retorno de interrumpir "(por ejemplo, RTI) instrucción.

Aquí hay un desensamblaje de una tabla de interrupciones para un procesador ATMega 16 que muestra tres interrupciones no utilizadas en una rutina que maneja tales casos (puede entrar en un bucle infinito) y un vector legítimo.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

Cuál de los métodos descritos anteriormente para manejar un ISR faltante dependerá tanto de la arquitectura del microcontrolador como del compilador. En el caso de una instrucción RTI o equivalente, volverá inmediatamente a la aplicación. Sin embargo, si la interrupción se dispara a nivel en lugar de dispararse al borde, esto probablemente hará que la interrupción se dispare nuevamente, por lo que terminará en un bucle infinito.

Creo que puede depender de la arquitectura del chip si las interrupciones internas (por ejemplo, un personaje que recibe un UART) se considera disparado por nivel o disparado por borde. Las interrupciones externas generalmente se pueden configurar como una u otra.

También hay otro caso, a veces varias interrupciones se agrupan y usan el mismo vector. Esto fue particularmente cierto para los procesadores más antiguos que podrían haber tenido solo un par de interrupciones. En ese caso, la causa de la interrupción se determinó sondeando el estado de los registros de interrupción, que es algo parecido a lo que usted propone.

Pero es una mala práctica en cualquier caso tener interrupciones en un sistema y no hay ISR definido. No lo hagas


2
...., o puede ser indefinido.
Wouter van Ooijen

@WoutervanOoijen a eso me refería con que el vector de interrupción era nulo.
tcrosley

1
Los registros de estado no pueden indicar algunos errores como el que he mencionado anteriormente. Pero tales errores tienen una interrupción. Por lo tanto, pensé en habilitar la interrupción solo para identificar el error y no usar ningún ISR. Mientras simulaba el LPC1778 usando Keil, no obtuve ninguna excepción, así que supongo que el uC debe estar usando el RTI como mencionaste
AlphaGoku

1
Algo a tener en cuenta: si habilita una interrupción, pero su controlador no borra la bandera (o no hay un controlador y el comportamiento predeterminado es un simple retorno), lo más probable es que su MCU termine para siempre atrapado en un bucle de interrupción.
Brhans

1
Las interrupciones de PIO en el ATSAM3X8E pueden activarse por flanco, pero la condición de interrupción una vez establecida no se borrará hasta que lea el ISR (registro de estado de interrupción) en el controlador de interrupciones, lo que da como resultado el bucle @brhans mencionado.
Simon Wright

1

Depende de su MCU, compilador y resto del código.

Por mi experiencia:

  1. AVR: de forma predeterminada, si no especifica un ISR, el vector de interrupción en flash será 0x0000, lo que significa que su aplicación saltará a reinicio cada vez que ocurra esta interrupción.

    Si realmente necesita la interrupción, pero no necesita el controlador (por ejemplo, use el modo de apagado de bajo ruido ADC y use la interrupción solo para activar la MCU), debe usar la macro EMPTY_INTERRUPT

  2. NXP Kinetis (ARM): todos los vectores apuntan de manera predeterminada a un controlador predeterminado que tiene un punto de interrupción, la CPU simplemente se detendrá y se lo dirá a su depurador.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.