Habilitar interrupción pero no ISR

10

Me gustaría saber qué sucede si una Interrupción está habilitada (por ejemplo, Interrupción Perdida de Arbitraje en el módulo CAN de 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 desplazamiento del vector de interrupción almacenada para la transferencia de control para dicha interrupción, por lo que el control volverá a la rutina principal, y puedo restablecer el indicador de interrupción al sondearlo en la rutina principal (esto es lo que pienso). ¿Habrá alguna latencia cuando la CPU descubra que no hay un ISR al que saltar? / p>

Cualquier solución sobre lo que pueda suceder realmente puede ayudarme.

Gracias.

  

Actualización:

He habilitado CAN Interrumpir en mi uC, pero no he definido un ISR. Cuando realicé una prueba interna de bucle invertido, el código ingresó en un bucle infinito. Aquí está el código de desmontaje del bucle infinito que se está ejecutando en LPC1778:

B       .
ENDP

Entonces, si estás usando interrupciones, usa el ISR.

    

2 respuestas

16

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 principio del programa o puede contener una instrucción "volver de interrupción" (por ejemplo, RTI).

Aquí se muestra el desmontaje de una tabla de interrupciones para un procesador ATMega 16 que muestra tres interrupciones no utilizadas vectorizadas a una rutina que maneja estos casos (puede que se convierta 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á de la arquitectura del microcontrolador y 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 desencadena por nivel en lugar de por borde, es probable que esto provoque que la interrupción se vuelva a activar, por lo que terminará en un bucle infinito.

Creo que puede depender de la arquitectura del chip si las interrupciones internas (por ejemplo, un carácter recibido por un UART) se consideran activadas por nivel o por borde. Las interrupciones externas generalmente se pueden configurar como una o la 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ó al sondear el estado de los registros de interrupción, que es algo así como lo que usted propone.

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

    
respondido por el tcrosley
1

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

Desde mi experiencia:

  1. AVR: de forma predeterminada, si no especifica un ISR, entonces el vector de interrupción en flash será 0x0000, lo que significa que su aplicación se reiniciará cuando ocurra esta interrupción.

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

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

respondido por el filo

Lea otras preguntas en las etiquetas