Estoy hablando de cosas en el nivel central.
Por lo que yo entiendo, el núcleo del controlador solo ejecuta instrucciones que se obtienen de la memoria (Fetch - Decode - Execute). Cuando llega una interrupción, ¿cómo decide el núcleo / ALU saltar al ISR?
Debido a que nosotros, o el compilador, no agregamos ninguna instrucción para sondear el estado de la interrupción, entonces, ¿cómo sabe que se debe atender una interrupción?
fuente
CALL
instrucción ordinaria , ya que las interrupciones se terminan de una manera diferente (cf.RET
vs.RETI
).Comúnmente en los microcontroladores modernos hay una unidad de controlador de interrupción (IC) dedicada que se encarga de gestionar las interrupciones. Además cada componente periférico tiene una salida (s) de interrupción que va desde
0
a1
(o viceversa) si alguna condición se aplica (por ejemplo este periférico completado algún trabajo). Esta salida está conectada al controlador de interrupción. LaCore
CPU puede decirle al CI que ignore esta interrupción específica (enmascararla) o que notifique a la MCU cada vez que ocurre mediante la activación de señales específicas, y luego la MCU decide qué hacer con ella. La forma común es hacer que el IC le diga a MCU qué interrupción sucedió y saltar al código de manejo correspondiente.fuente
Hay hardware en el núcleo de la computadora que atasca un nuevo valor en el contador del programa que corresponde a la interrupción particular que se ha activado. Para recordar a dónde regresar después de completar la rutina de interrupción, el valor actual en el contador del programa se introduce en la pila antes de que el hardware interrumpa la dirección de interrupción en el contador del programa. Cuando se completa la rutina de interrupción, el valor original del contador del programa se restablece fuera de la pila.
Los valores para atascarse en el contador del programa en el tiempo de interrupción generalmente están determinados por uno de los dos esquemas. Un enfoque atasca una dirección fija para cada tipo de interrupción en el contador del programa y el núcleo de la computadora comienza a ejecutarse desde esa ubicación fija. El espacio en la ubicación fija a menudo tiene un tamaño limitado, por lo que es común codificar una instrucción de salto en las direcciones fijas que pasan a la ubicación real del servicio de interrupción. El otro esquema usa algo llamado una tabla de vectores de interrupción. Aquí el hardware genera un desplazamiento de dirección fija en la tabla de vectores según el tipo de interrupción. El hardware luego extrae el contenido en esa ubicación de la tabla y usa ese valor como una dirección para atascarse en el contador del programa.
fuente
El controlador tiene un registro para el contador del programa que realiza un seguimiento de la dirección donde se almacena la siguiente instrucción a ejecutar. (Este registro también se escribe cuando se ejecuta un salto).
El controlador tiene un vector de interrupción (o, a veces, más de uno, dependiendo del tipo de interrupción), que es la dirección donde se almacena el ISR. Esta dirección es siempre la misma: es como el vector de reinicio, donde se inicia el programa.
(A menudo, hay una instrucción de salto almacenada en este vector que salta al código real para ejecutar, ya que el espacio en el vector no es suficiente para almacenar todo el procedimiento. Sin embargo, lo importante es que el ISR siempre se encuentra en el mismo posición.)
Cuando ocurre una interrupción, hay un hardware dedicado en el controlador que escribe el contador del programa con el vector de interrupción. Luego, cuando el controlador alcanza el siguiente ciclo de instrucciones, obtiene la instrucción de la dirección que señala el contador del programa (por lo tanto, el vector de interrupción).
(En un ciclo de instrucciones del controlador hay diferentes tareas que realiza: obtiene la siguiente instrucción de la dirección señalada por el contador del programa; aumenta el contador del programa; decodifica la instrucción y la ejecuta).
fuente