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.
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 rjmp
instrucció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
mateo
oscuro
Tony Estuardo EE75
manyyack
manyyack
oscuro