¿Cómo sabe el controlador cuándo saltar al ISR?

Estoy hablando de cosas en el nivel central.

Según tengo entendido, el núcleo del controlador solo ejecuta instrucciones que se obtienen de la memoria (Obtener - Decodificar - Ejecutar). 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?

Respuestas (4)

Lo que se está perdiendo es que el núcleo hace más que simplemente ejecutar códigos de operación que se obtienen de la memoria. Tiene una lógica específica para implementar interrupciones.

Cuando el hardware de detección de interrupciones afirma la señal que dice que es hora de tomar una interrupción, generalmente se atasca una instrucción especial en el núcleo que nunca se extrajo de la memoria. En la mayoría de los casos, esta es una instrucción CALL a la dirección del vector de interrupción. Esto utiliza el mecanismo de ejecución de instrucciones existente para guardar la PC actual en la pila de llamadas y cambiarla a la dirección del vector de interrupción. También se ocupa de descartar instrucciones precargadas y similares.

La lógica especial de recepción de interrupciones también tiene que deshabilitar las interrupciones de tal manera que la misma condición de interrupción no provoque otra llamada a la dirección del vector de interrupción en el siguiente ciclo. Los diferentes procesadores tienen diferentes formas de manejar esto. El más simple es deshabilitar globalmente las interrupciones, lo que requiere que el software las vuelva a habilitar al final de la rutina del servicio de interrupción. Otros procesadores tienen un nivel de prioridad de interrupción. Este nivel se eleva para que solo las condiciones de interrupción de mayor prioridad puedan causar una nueva interrupción. La prioridad de interrupción es entonces algo que se guarda automáticamente junto con la dirección de retorno de CALL y se restaura cuando el código regresa de la interrupción.

A menudo, no es una CALLinstrucción ordinaria, ya que las interrupciones se terminan de forma diferente (cf. RETvs. RETI).
¿Puedo asumir con seguridad que cuando el hardware de detección de interrupciones afirma la señal, en lugar de la memoria, la CPU recibe instrucciones de otro lugar para saltar... Tal vez como un interruptor... Cuando el interruptor está APAGADO, obtiene instrucciones de la memoria y cuando el interruptor está ENCENDIDO , ¿Ejecutar esta instrucción?

Comúnmente, en los microcontroladores modernos hay una unidad de controlador de interrupción (IC) dedicada que está a cargo de administrar las interrupciones. Además, cada componente periférico tiene una(s) salida(s) de interrupción que van de 0a 1(o viceversa) si se aplica alguna condición (por ejemplo, este periférico completó algún trabajo). Esta salida está conectada al controlador de interrupción. La CoreCPU puede decirle al IC que ignore esta interrupción específica (enmascararla) o que notifique a la MCU cada vez que ocurra activando 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 la MCU qué interrupción ocurrió y salte al código de manejo correspondiente.

Hay hardware en el núcleo de la computadora que mete un nuevo valor en el contador del programa que corresponde a la interrupción particular que se ha disparado. Para recordar adónde regresar después de que se complete la rutina de interrupción, el valor actual en el contador del programa se inserta en la pila antes de que el hardware atasque 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 recupera de la pila.

Los valores que se atascan en el contador del programa en el momento de la interrupción generalmente se determinan mediante uno de 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 van a la ubicación real del servicio de interrupción. El otro esquema usa algo llamado 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. Luego, el hardware 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.

El controlador tiene un registro para el contador de programa que realiza un seguimiento de la dirección donde se almacena la siguiente instrucción que se ejecutará. (Este registro también se escribe cuando se ejecuta un salto).

El controlador tiene un vector de interrupción (oa veces más de uno, dependiendo del tipo de interrupción), que es la dirección donde se almacena la ISR. Esta dirección es siempre la misma: es como el vector de reinicio, donde comienza 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 algún hardware dedicado en el controlador que escribe el contador del programa con el vector de interrupción. Luego, cuando el controlador llega al siguiente ciclo de instrucción, obtiene la instrucción de la dirección a la que apunta el contador del programa (es decir, el vector de interrupción).

(En un ciclo de instrucción 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).