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

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

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

PD Debido a que estoy en una red de bajo ancho de banda, no puedo proporcionar enlaces a la hoja de datos. Haría eso cuando regrese.

Creo que tu suposición es correcta.
En su oración "SP apunta a ..." Probablemente quiso decir "PC", ¿verdad?
cada arquitectura de CPU puede no ser la misma. Existen al menos tres métodos diferentes. Algunos usan una dirección de PC codificada, otros usan una tabla de salto de 1 byte o 2 bytes, etc. o una tabla de búsqueda ISR o una dirección de salto dinámica. ISR., la documentación de IRQ define cuál se utiliza.
@dim ¿No apunta el puntero de la pila a la dirección que se va a cargar en la PC?
@TonyStewart.EEsince'75 Esas direcciones de salto son lo que llaman tabla de vectores de interrupción y las codificadas son direcciones de interrupción en términos de terminología o ¿cada arquitectura tiene la suya propia?
@MaNyYaCk No, el puntero de pila (SP) es la dirección desde la que se insertan o extraen los valores de registro de propósito general. No está relacionado con el contador de programa (PC), que indica la dirección de la siguiente instrucción a buscar.

Respuestas (3)

La rutina de servicio de interrupción (ISR) es el programa que debe ejecutarse cuando ocurre 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 colocar una instrucción de salto en esta dirección que lleve la CPU al resto del ISR en otra parte de la memoria.

Otras arquitecturas de CPU usan vectores de interrupción. El vector es una ubicación de memoria en la que se puede encontrar la dirección de la ISR. La CPU conoce la ubicación del vector, ya sea por ser fijo o en conjunto con un registro especial de CPU/hardware. Cuando la CPU atiende la interrupción, lee un valor de vector de la memoria y ejecuta una llamada de subrutina al valor de vector. Este es el caso de la familia ARM, 6502 y 68000. El hardware externo puede ayudar a especificar el vector particular que se usará dentro de una tabla de vectores, pero el principio sigue en pie.

Entonces, el manejo de las interrupciones en la CPU 8051 y en la CPU ARM le parece diferente porque usan esquemas fundamentalmente diferentes para encontrar la dirección de la ISR. Pero estos dos métodos (dirección codificada versus 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 el modo de interrupción 0, donde espera leer una instrucción del hardware externo que lo llevará al ISR, pero no te enturbiaría el agua con esas cosas mientras te acostumbras de todo.)

Los vectores de interrupción son las direcciones en la MCU desde donde la dirección de la rutina de servicio de interrupción se cargaría en el contador del programa ante la ocurrencia de 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 igual que cualquier cambio de tarea normal (excepto algunas excepciones).

Su comprensión es parcialmente correcta. Cuando ocurre una interrupción, el estado de ejecución actual se respalda en el puntero de la pila y el contador del programa se carga con la dirección del ISR que básicamente se almacena en la dirección del vector de interrupción.

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 como otras direcciones de programas. En el caso de AVR, los adyacentes solo difieren en 1 instrucción, lo que significa que solo puede colocar 1 instrucción para cada vector de interrupción si desea utilizarlos todos. Por lo general, será una rjmpinstrucción 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 el programa a cargo de manejar la interrupción en el lugar correcto. He aquí cómo: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Lo que me deja perplejo en este caso es que la documentación de AVR establece claramente que "Tenga en cuenta que el Registro de estado no se almacena automáticamente al ingresar a una rutina de interrupción, y no se restaura al regresar de una rutina de interrupción. Esto debe ser manejado por el programa de aplicación ". Por lo tanto, necesito almacenar el estado, saltar a donde está el ISR, restaurar el estado y RETI. ¿Cómo hace todo eso en una sola instrucción?
"¿Cómo hace todo eso en una sola instrucción?" - no lo hace Debe guardar y restaurar manualmente el estado, y dado que eso implica leer y escribir una ubicación de E/S, necesita guardar y restaurar al menos otro registro (a menos que lo dedique solo al uso de ISR). Esto requiere varias instrucciones, por lo que la única instrucción útil que puede poner en la dirección del vector es un salto (a menos que no se usen los vectores subsiguientes, entonces puede dejar que el código los sobrepase).