Comprender la diferencia entre la dirección de interrupción y la dirección de vector de interrupción

4

En mis estudios universitarios, me enseñaron 8051 e, interrumpiendo, mi profesor había dicho que al interrumpir el SP apunta a la dirección que está codificada y el Programa va a seguir esas instrucciones. Pero entre dos direcciones es solo donde puedo escribir el código de manejo de interrupciones y escribí más de un byte disponible, sobreescribirá las siguientes instrucciones de interrupción.

Ahora, cuando veo Atmega o LPC2148 Hoja de datos, tiene una dirección de vector de interrupción y supongo que apunta a una dirección donde se escriben las instrucciones para las instrucciones de manejo de interrupciones (no exactamente en esas direcciones). ¿Mis suposiciones son correctas?

P.S Debido a que estoy en una red con poco ancho de banda, no puedo proporcionar enlaces a la Hoja de datos. Haría eso cuando regrese.

    
pregunta MaNyYaCk

3 respuestas

7

La rutina de servicio de interrupción (ISR) es el programa que se ejecutará cuando ocurra una interrupción.

Algunas arquitecturas de CPU tienen direcciones fijas a las que la CPU ejecutará una llamada de subrutina. Esto es cierto para el MCS-51 (8051). El ISR debe comenzar en esta dirección. No es raro que solo coloque una instrucción de salto en esta dirección que lleve a la CPU al resto del ISR en otra parte de la memoria.

Otras arquitecturas de CPU utilizan vectores de interrupción. El vector es una ubicación de memoria en la que se puede encontrar la dirección del ISR. La ubicación del vector es conocida por la CPU, ya sea por ser fija o junto con un registro especial de CPU / hardware. Cuando la CPU atiende la interrupción, lee un valor vectorial de la memoria y ejecuta una llamada de subrutina al valor vectorial. Esto es cierto para la familia ARM, 6502 y 68000. El hardware externo puede tener una mano en la especificación del vector en particular para usar dentro de una tabla de vectores, pero el principio sigue vigente.

Por lo tanto, el manejo de las interrupciones en la CPU 8051 y en la CPU ARM le parece diferente porque utilizan esquemas fundamentalmente diferentes para encontrar la dirección del ISR. Pero estos dos métodos (la dirección codificada en función del vector en la memoria) son prácticamente los únicos esquemas que encontrará en todas las CPU que verá.

(Existe la rareza ocasional, como el Z80 en modo Interrupción 0, donde espera leer una instrucción de hardware externo que lo llevará al ISR, pero no ensuciaría el agua con esas cosas mientras estás conseguir el truco de todo.)

    
respondido por el TonyM
0

Los vectores de interrupción son las direcciones en la MCU desde donde se cargaría la dirección de la rutina de servicio de interrupción al contador del Programa en caso de que ocurra un evento específico / previsto. Por ejemplo, el desbordamiento del contador del temporizador puede causar una interrupción si está configurado para eso. Si hay una rutina de servicio de interrupción (ISR) asociada con ese módulo de temporizador, se llamará a la misma como cualquier cambio de tarea normal (excepto algunas excepciones).

Tu entendimiento es parcialmente correcto, Cuando se produce una interrupción, se realiza una copia de seguridad del estado de ejecución actual en el puntero de la pila y el contador del programa se carga con la dirección del ISR que se almacena básicamente en la dirección del vector de interrupción.

    
respondido por el Duster2503
0

La dirección del programa para un vector de interrupción es la dirección del programa a la que salta la CPU cuando se activa una interrupción. Es igual que otras direcciones de programas. En el caso de AVR, los adyacentes solo difieren en 1 instrucción, lo que significa que solo puede poner 1 instrucción para cada vector de interrupción si desea usarlos todos. Por lo general, será una instrucción rjmp para el resto del programa que maneja la interrupción.

Si usa un lenguaje de alto nivel como C, puede decirle al compilador que ponga al programa a cargo de manejar la interrupción en el lugar correcto. A continuación le indicamos cómo: enlace

    
respondido por el v7d8dpo4

Lea otras preguntas en las etiquetas