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.
fuente
Respuestas:
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.
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
fuente
Depende de su MCU, compilador y resto del código.
Por mi experiencia:
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
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.
fuente