11 votos

Habilita la interrupción pero no el ISR

Me gustaría saber qué ocurre si se activa una interrupción (por ejemplo: Interrupción por 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 la bandera de interrupción respectiva se pondrá en marcha, pero ya que 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 una interrupción de este tipo y por lo que el control pasará de nuevo a la rutina principal, y puedo restablecer la bandera de interrupción por el sondeo en la rutina principal (esto es lo que estoy pensando).

Cualquier solución sobre lo que puede pasar me puede ayudar mucho.

Gracias.

Actualización:

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

B       .
ENDP

Así que ya, si estás usando interrupciones, usa el ISR.

3 votos

No necesitas habilitar la interrupción para poder sondear las banderas en tu función principal. Si la condición que establece la bandera ocurre, esa bandera se establecerá independientemente de que hayas habilitado o no la interrupción asociada.

0 votos

¿Dices que la bandera de interrupción por pérdida de arbitraje del bus se activará incluso si no habilito la "interrupción por pérdida de arbitraje del bus" (aunque no hay ningún registro de estado que pueda indicar la pérdida de arbitraje del bus excepto el registro de estado de la interrupción)?

0 votos

Sí, en todas las MCU con las que he trabajado, las banderas de interrupción se activan siempre que se produce la condición que debería activarlas. La activación de la interrupción hace que el MCU vectorice al manejador cuando la bandera asociada se establece y la desactivación de la interrupción hace que se ignore la bandera y no se vectorice al manejador aunque la bandera esté activada . Desactivar/desactivar la interrupción sólo afecta al comportamiento de salto al gestor de la interrupción, no al comportamiento de establecimiento de la bandera.

18voto

Matt McMinn Puntos 6067

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 de "retorno de interrupción" (por ejemplo, RTI).

Aquí hay un desensamblaje 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 simplemente 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 perdido 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 es disparada por nivel en lugar de por flanco, entonces esto probablemente hará que la interrupción se dispare de nuevo, 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 una UART) se consideran activadas por nivel o por flanco. Las interrupciones externas normalmente se pueden configurar como una u otra.

También hay otro caso, a veces varias interrupciones se agrupan y utilizan el mismo vector. Esto ocurría sobre todo en los procesadores más antiguos, que podían tener sólo un par de interrupciones. En ese caso, la causa de la interrupción se determinaba sondeando el estado de los registros de interrupción, que es algo parecido a lo que propones.

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

2 votos

...., o puede ser indefinido.

0 votos

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

1 votos

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 sólo para identificar el error y no utilizar ningún ISR. Al simular el LPC1778 usando Keil, no obtuve ninguna excepción así que supongo que el uC debe estar usando la RTI como mencionaste

2voto

filo Puntos 1

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

Por mi experiencia:

  1. AVR - por defecto, si no se especifica un ISR, el vector de interrupción en la flash será 0x0000, lo que significa que tu aplicación saltará a reset cada vez que se produzca esta interrupción.

    Si realmente necesitas la interrupción, pero no necesitas el manejador (por ejemplo, usar el modo de apagado de bajo ruido del ADC y usar la interrupción sólo para despertar el MCU) debes usar el INTERRUPCIÓN_VACÍA macro

  2. NXP Kinetis (ARM) - todos los vectores por defecto apuntan a un manejador por defecto que tiene un breakpoint, la CPU simplemente se detendrá y se lo dirá a su depurador.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X