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

12

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?

Swanand
fuente

Respuestas:

13

Lo que falta es que el núcleo hace más que solo ejecutar códigos de operación que se obtienen de la memoria. Tiene 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, por lo general, una instrucción especial se atasca en el núcleo que nunca se recuperó de la memoria. En la mayoría de los casos, esta es una instrucción CALL para 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 trata de descartar instrucciones precargadas y similares.

La lógica especial de toma 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 el próximo ciclo. Los diferentes procesadores tienen diferentes formas de manejar esto. Lo 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 interrupciones. Otros procesadores tienen un nivel de prioridad de interrupción. Este nivel aumenta 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 LLAMADA, y se restaura cuando el código regresa de la interrupción.

Olin Lathrop
fuente
1
A menudo, no es una CALLinstrucción ordinaria , ya que las interrupciones se terminan de una manera diferente (cf. RETvs. RETI).
glglgl
1
¿Puedo suponer con seguridad que cuando ese hardware de detección de interrupción activa la señal, en lugar de memoria, la CPU recibe instrucciones de otro lugar para saltar ... como un interruptor tal vez ... cuando el interruptor está apagado, obtenga instrucciones de la memoria y cuando el interruptor está encendido , Ejecutar esta instrucción?
Swanand
3

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 0a 1(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. La CoreCPU 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.

Eugene Sh.
fuente
2

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.

Michael Karas
fuente
2

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