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

12

Estoy hablando de cosas en el nivel central.

Según tengo entendido, el núcleo del controlador simplemente ejecuta las instrucciones que se extraen 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 una interrupción necesita ser atendida?

    
pregunta Swanand

4 respuestas

13

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

Cuando el hardware de detección de interrupciones hace valer la señal que dice que es hora de tomar una interrupción, generalmente una instrucción especial se atasca en el núcleo que nunca se recuperó de la memoria. En la mayoría de los casos, se trata de 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 ocupa de descartar instrucciones pre-buscadas 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 cause otra llamada a la dirección del vector de interrupción del siguiente ciclo. Diferentes procesadores tienen diferentes maneras de manejar esto. Lo más simple es simplemente deshabilitar las interrupciones de manera global, requiriendo que el software las vuelva a habilitar al final de la rutina de servicio de interrupción. Otros procesadores tienen un nivel de prioridad de interrupción. Este nivel se incrementa de modo que solo las condiciones de interrupción de mayor prioridad pueden 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.

    
respondido por el Olin Lathrop
3

Comúnmente en los microcontroladores modernos hay una unidad dedicada de controlador de interrupción (IC) que se encarga de administrar las interrupciones. Además, cada componente periférico tiene una (s) salida (s) de interrupción que van desde 0 a 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. El Core CPU puede decirle al IC que ignore esta interrupción específica (enmascararla) o que le notifique a la MCU siempre que suceda mediante el disparo de señales específicas, y luego la MCU decide qué hacer con ella. La forma común es que el IC le diga a MCU qué interrupción ocurrió y salta al código de manejo correspondiente.

    
respondido por el Eugene Sh.
2

Hay hardware en el núcleo de la computadora que introduce un nuevo valor en el contador del programa que corresponde a la interrupción particular que se ha activado. Para recordar dónde volver 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 introduzca la dirección de la interrupción en el contador del programa. Cuando se completa la rutina de interrupción, el valor original del contador del programa se restaura fuera de la pila.

Los valores a atascar en el contador del programa en el tiempo de interrupción generalmente están determinados por uno de dos esquemas. Un enfoque bloquea 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 fijo en la tabla de vectores en función del tipo de interrupción. El hardware luego extrae el contenido en esa ubicación de la tabla y utiliza ese valor como una dirección para atascarse en el contador del programa. Las direcciones en la tabla, por supuesto, se han cargado allí de acuerdo con la ubicación de las rutinas de servicio de interrupción en la memoria.

    
respondido por el Michael Karas
2

El controlador tiene un registro para el contador de programas 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 algunas veces más de uno, según el 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 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 la misma posición.)

Cuando se produce 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, recupera las instrucciones de la dirección a la que apunta el contador del programa (es decir, el vector de interrupción).

(En un ciclo de instrucciones del controlador, realiza diferentes tareas: obtiene la siguiente instrucción de la dirección a la que apunta el contador del programa; aumenta el contador del programa; descodifica la instrucción y la ejecuta .)

    
respondido por el Keelan

Lea otras preguntas en las etiquetas