TEMA 8 GESTION DE LAS INTERRUPCIONES CURSO 2010/2011 GESTION DE LAS INTERRUPCIONES 1. Introducción 2. Latencias de las Interrupciones 3. Tabla de Vectores de Interrupción 4. Latch de Interrupciones (IRPTL) 5. Prioridades de las Interrupciones 6. Control y Enmascarado de las Interrupciones: Registro de Máscaras de Interrupciones (IMASK) Interrupciones Anidadas (IMASKP) 7. Pila de Estado (Salvar y Restaurar el Estado) 1
GESTION DE LAS INTERRUPCIONES 8. Interrupciones Software 9. Anidar la Interrupción Actual 10. Interrupciones Externas 11. Interrupciones en Entornos Multiprocesador INTRODUCCION Las interrupciones pueden ser originadas por una gran variedad de condiciones tanto internas como externas al procesador. Una interrupción da lugar a una llamada a una subrutina ubicada en una dirección predefinida: el vector de interrupción. Los procesadores de la familia ADSP-2106x asignan un único vector de interrupción a cada tipo de interrupción. Externamente los procesadores de la familia ADSP-2106x soportan tres interrupciones priorizadas e individualmente enmascarables, cada una de las cuales puede ser activa por nivel o por flanco. Estas interrupciones externas se producen cuando algún dispositivo externo activa una de las tres entradas de interrupción que tienen estos procesadores (IRQ 2-0 ). Entre las interrupciones generadas internamente están las provocadas por excepciones aritméticas, desbordamientos de pilas y desbordamientos de buffers de datos circulares. 2
INTRODUCCION INTRODUCCION Una petición de interrupción es considerada válida si no está enmascarada y si las interrupciones están globalmente habilitadas (Bit 12 del registro MODE1 a 1) y si una petición de interrupción con mayor prioridad no está pendiente. Las peticiones de interrupción válidas desencadenan el mecanismo de atención a interrupción, el cual provoca el salto a una determinada dirección reservada para cada interrupción. Cada vector de interrupción ocupa cuatro direcciones, en las cuales se almacenan cuatro instrucciones. Subrutinas de atención más largas pueden implementarse mediante saltos a otras zonas de memoria. La ejecución del programa retorna al punto en el que se activó la interrupción cuando se ejecuta la instrucción RTI (Retorno de Interrupción). El núcleo de los procesadores ADSP-2106x no puede atender una interrupción a menos que se encuentre ejecutando instrucciones o en estado IDLE. 3
INTRODUCCION Para procesar una interrupción, el secuenciador de programa de los procesadores ADSP-2106x realiza los siguientes pasos: Genera la dirección apropiada del vector de interrupción. Salva en la Pila del PC el valor actual del PC (dirección de retorno). Si la interrupción es una interrupción externa (IRQ 2-0 ), la interrupción interna asociada al timer o la interrupción del modo multiprocesador VIRPT, el secuenciador de programa salva en la Pila de Estado los valores actuales de los registros ASTAT y MODE1. Pone a 1 el bit apropiado en el latch de interrupciones (IRPTL). Modifica el puntero a la máscara de interrupciones (IMASKP) para que refleje el estado actual de anidamiento de las interrupciones. (El bit NESTM, modo de anidamiento, del registro MODE1 determina cuando todas las interrupciones o solamente las de menor prioridad están enmascaradas durante el servicio a una interrupción). INTRODUCCION Al final de la subrutina de atención a interrupción, la instrucción RTI realiza las siguientes acciones: Retorno a la dirección almacenada en la cima de la Pila del PC. Saca un dato de la Pila del PC. Restaura los valores de los registros ASTAT y MODE1 de la Pila de Estado si previamente han sido salvados (solamente en el caso de las interrupciones externas (IRQ 2-0 ), interrupción del timer e interrupción VIRPT. Borra el bit apropiado en el latch de interrupciones (IRPTL). Actualiza el puntero a la máscara de interrupciones (IMASKP). Todas las subrutinas de atención a interrupción, excepto la que atiende a la excepción de RESET, deben acabar con la instrucción RTI. (Después de un RESET la Pila del PC está vacía, no hay almacenada ninguna dirección de retorno, por tanto la última instrucción de la subrutina de atención al RESET debe ser un salto al comienzo del programa principal). 4
LATENCIAS DE LAS INTERRUPCIONES Los procesadores de la familia ADSP-2106x responden a las interrupciones en tres etapas: Sincronización y almacenar como pendiente (1 ciclo). Reconocimiento (1 ciclo). Salto al vector de interrupciones (2 ciclos). Si se fuerza una interrupción por programa, escribiendo en un bit del latch de interrupciones IRPTL, es reconocida en el siguiente ciclo y en los dos ciclos siguientes se produce el salto al vector de interrupción. Para la mayoría de las interrupciones, internas y externas, solamente se ejecuta una instrucción después de que ocurra la interrupción (y antes de las dos instrucciones abortadas) mientras el procesador busca y decodifica la primera instrucción de la subrutina de atención a la interrupción. LATENCIAS DE LAS INTERRUPCIONES 5
LATENCIAS DE LAS INTERRUPCIONES El número estándar de ciclos de latencia asociados con las interrupciones externas (IRQ 2-0 ) es de 3 ciclos y con la interrupción en modo multiprocesador de 6 ciclos. Cuando está habilitado el anidamiento, si una interrupción de mayor prioridad ocurre inmediatamente después de haberse producido una interrupción de menor prioridad, la atención a la interrupción de mayor prioridad se retrasa un ciclo adicional. Esto permite que la primera instrucción de la subrutina de atención a la de menor prioridad se ejecute antes de ser interrumpida la subrutina. Algunas operaciones realizadas por los procesadores de la familia ADSP- 2106x que duran más de un ciclo, aplazan el procesamiento de las interrupciones. Si ocurre alguna interrupción durante estas operaciones, la interrupción se sincroniza y almacena pero su procesamiento se retrasa. LATENCIAS DE LAS INTERRUPCIONES Los operaciones que retrasan el procesamiento de las interrupciones son las siguientes: Una bifurcación (salto, llamada y retorno de subrutina). El primero de los dos ciclos necesarios para realizar un acceso a datos en memoria de programa y una búsqueda de instrucción (cuando no está disponible en la caché). La antepenúltima iteración de un bucle de una instrucción. El primero de los ciclos que son necesarios para buscar y decodificar la primera instrucción de una subrutina de atención a interrupción. Estados de espera para los accesos a memoria externa. Cuando es necesario realizar un acceso a memoria externa y el procesador no tiene el control de los buses externos. 6
TABLA DE VECTORES DE INTERRUPCION La Tabla de Vectores de Interrupción muestra todas las fuentes de interrupción de los procesadores ADSP-2106x, ordenadas según su posición en los registros IRPTL e IMASK. En la tabla de vectores se muestran también las direcciones de los vectores de interrupción. Cada vector está separado por cuatro posiciones de memoria, en las que se pueden almacenar cuatro instrucciones. Las direcciones contenidas en la tabla de vectores representan el desplazamiento respecto de la dirección base. Para una tabla de vectores en memoria interna la dirección base es 0x00020000 (comienzo del bloque 0), mientras que para una tabla de vectores en memoria externa la dirección base es 0x00400000. La tercera columna de la tabla muestra el nombre simbólico para cada interrupción. Estos nombres se han asignado por comodidad, pero no son utilizados por el lenguaje ensamblador. TABLA DE VECTORES DE INTERRUPCION 7
TABLA DE VECTORES DE INTERRUPCION Si el contenido de la memoria interna se vuelca desde un dispositivo externo, la tabla de vectores de interrupción debe ubicarse en memoria interna. Si el procesador ADSP-2106x ejecuta el programa desde memoria externa, la tabla de vectores de interrupción se debe ubicar en memoria externa. Además si el volcado se realiza desde una EPROM externa u otro procesador (host), el bit 16 del registro IMASK (interrupción del canal 6 del DMA con el puerto externo) automáticamente se pone a 1 después del RESET, lo cual habilita la interrupción correspondiente del DMA. El registro IRPTL se inicializa con ceros después de RESET. LATCH DE INTERRUPCIONES (IRPTL) El latch de interrupciones (IRPTL) es un registro de 32 bits que almacena las interrupciones. Este registro indica todas las interrupciones que actualmente están siendo atendidas, así como también las que están pendientes de servicio. Puesto que este registro se puede leer y escribir, cualquier interrupción, excepto la de RESET, puede ser activada o borrada por software. No se debe escribir nunca el bit de RESET (bit 1) del registro IRPTL, puesto que esto coloca al procesador en un estado ilegal. Cuando ocurre una interrupción, el correspondiente bit del registro IRPTL se pone a 1. Durante la ejecución de la subrutina de servicio este bit se borra en cada ciclo para evitar que esta misma interrupción se almacene de nuevo mientras su subrutina de atención está todavía ejecutándose. Existe un método especial para abortar una interrupción mientras está siendo atendida. Este método es proporcionado por el modificador (CI) de la instrucción JUMP. Después de un RESET el registro IRPTL se inicializa con ceros y todos los bits de este registro se corresponden exactamente con los bits del registro IMASK. 8
LATCH DE INTERRUPCIONES (IRPTL) PRIORIDADES DE LAS INTERRUPCIONES Los bits del latch de interrupciones están ordenados por orden de prioridad: el bit 0 se corresponde con la prioridad más alta y el bit 31 con la prioridad más baja. La prioridad de una interrupción determina qué interrupción va a ser atendida primero cuando se activan más de una en el mismo ciclo. La prioridad también determina qué interrupciones pueden anidarse cuando el anidamiento está habilitado. Las interrupciones aritméticas (overflow en coma fija o en coma flotante, underflow, operación no válida) vienen determinadas por el estado de los flags del registro de adhesivos (STKY). Las rutinas de atención a estas interrupciones deben leer estos flags para determinar cual ha sido la causa que ha originado la interrupción y deben también borrarlos pues sino esta interrupción permanecerá activa después de que haya sido atendida. Cuando la cuenta del temporizador llega a cero se activan dos interrupciones (bit 4 y bit 23), esto permite que el programador elija la prioridad del timer. (Se debe desenmascarar la interrupción del timer que vayamos a utilizar y dejar enmascarada la otra). 9
ENMASCARADO DE LAS INTERRUPCIONES Todas las interrupciones, excepto la asociada al reset, pueden ser habilitadas e inhabilitadas mediante el bit 12 del registro MODE1 bit de habilitación global de las interrupciones (IRPTEN). Después de un reset este bit se inicializa con cero, por tanto, es necesario escribir un uno en este bit para habilitar las interrupciones. REGISTRO DE MASCARAS DE INTERRUPCIONES (IMASK) Todas las interrupciones, excepto la asociada al reset, están enmascaradas (enmascarada significa que aunque se active no se atiende). Las interrupciones enmascaradas, si se activan, se almacenan en el latch de interrupciones (IRPTL), por ello, si la interrupción es posteriormente desenmascarada, se procesa. El registro que controla las máscaras es el registro IMASK. Los bits del registro IMASK se corresponden exactamente con los bits del registro IRPTL (por ejemplo el bit 10 del registro IMASK enmascara o desenmascara la misma interrupción que se almacena en el bit 10 del registro IRPTL). ENMASCARADO DE LAS INTERRUPCIONES Cuando se escribe un 1 en un bit del registro IMASK la correspondiente interrupción está desenmascarada (habilitada) y cuando se escribe un 0 la correspondiente interrupción está enmascarada (inhabilitada). Después de un reset todas las interrupciones, excepto la asociada al reset y la interrupción EPOI asociada al canal 6 del DMA con el puerto externo (bit 16 del registro IMASK) están enmascaradas. La interrupción asociada al reset es siempre no enmascarable y la interrupción EPOI se desenmascara automáticamente después de reset si el programa del procesador ADSP-2106x va a ser volcado desde una memoria EPROM externa o desde otro procesador host. INTERRUPCIONES ANIDADAS (IMASKP) Los procesadores de la familia ADSP-2106x soportan el anidamiento de una subrutina de atención a interrupción dentro de otra, esto quiere decir que una subrutina de atención a interrupción puede ser interrumpida por otra interrupción de mayor prioridad. Esta característica es controlada por el bit de modo de anidamiento, bit 11 del registro MODE1 (NESTM). 10
ENMASCARADO DE LAS INTERRUPCIONES ENMASCARADO DE LAS INTERRUPCIONES Cuando el bit NESTM está a cero, una subrutina de atención a interrupción no puede ser interrumpida. Cualquier interrupción que ocurra será procesada después de que concluya la ejecución de la subrutina de atención. Cuando el bit NESTM vale 1, las interrupciones con mayor prioridad pueden interrumpir si no están enmascaradas. Las interrupciones con prioridad menor o igual a la que está siendo atendida no pueden interrumpir. El valor del bit NESTM solamente puede ser modificado fuera de una subrutina de atención a interrupción o durante la subrutina de atención al reset. Si se modifica dentro de una subrutina de atención a interrupción el anidamiento no funciona correctamente. Cuando está habilitado el anidamiento y una interrupción de mayor prioridad ocurre inmediatamente después de una interrupción de menor prioridad, la rutina de atención a la interrupción de mayor prioridad se retrasa en un ciclo. Esto permite que la primera instrucción de la subrutina de atención a la de menor prioridad se ejecute antes de que sea interrumpida. 11
ENMASCARADO DE LAS INTERRUPCIONES En el modo anidamiento, los procesadores ADSP-2106x utilizan el puntero a la máscara de interrupciones (IMASKP) para crear una máscara de interrupciones temporal para cada nivel de anidamiento. El valor de IMASK no se modifica. El procesador cambia IMASKP cada vez que una interrupción de mayor prioridad interrumpe a una rutina de atención de una interrupción de menor prioridad. Los bits del registro IMASKP se corresponden con las 32 fuentes de interrupción en orden de prioridad, exactamente igual que en los registros IRPTL e IMASK. Cuando ocurre una interrupción, su bit correspondiente se pone a 1 en IMASKP. Si está habilitado el anidamiento, se crea una nueva máscara de interrupciones temporal, enmascarando todas las interrupciones de igual o menor prioridad que la de mayor prioridad que está desenmascarada en el registro IMASKP, dejando las restantes interrupciones de mayor prioridad en el mismo estado (con el mismo valor que tienen en el registro IMASK). ENMASCARADO DE LAS INTERRUPCIONES Cuando se ejecuta el retorno de una subrutina de atención (RTI), el bit de mayor prioridad que vale 1 en IMASKP se borra y de nuevo se genera una máscara temporal enmascarando todas las interrupciones con prioridad menor o igual que el bit de mayor prioridad que vale 1 en IMASKP. El bit que vale 1 con mayor prioridad en IMASKP siempre se corresponde con la prioridad de la interrupción que está siendo atendida. Cuando el anidamiento no está habilitado, el procesador enmascara todas las interrupciones y el registro IMASKP no se tiene en cuenta (aunque se sigue actualizando para crear la máscara temporal). 12
PILA DE ESTADO Para minimizar el tiempo de respuesta a las interrupciones, los procesadores ADSP-2106x automáticamente salvan y recuperan el contexto (estado y modo) del programa interrumpido. Las tres interrupciones externas (IRQ 0-2 ), la interrupción del timer y la interrupción en modo multiprocesador (VIRPT) salvan en la pila de estado, que tiene 5 niveles, automáticamente el contenido de los registros ASTAT y MODE1. El contenido de estos registros es automáticamente recuperado de la pila de estado por la instrucción de retorno de interrupción (RTI) y también por la instrucción JUMP (CI). Solamente las interrupciones antes mencionadas utilizan la pila de estado. El resto de interrupciones requieren que el contenido de estos registros sea explícitamente salvado y recuperado, utilizando posiciones de memoria. Salvando en la pila el contenido de los registros de control y estado MODE1 y ASTAT, permitimos que las subrutinas de atención a interrupción modifiquen dichos registros cuyos valores originales serán automáticamente recuperados después del retorno. (NOTA: los flags del registro ASTAT (FLAG 3-0 ) no se ven afectados por las operaciones de salvar y recuperar en la pila de estado). INTERRUPCIONES SOFTWARE La familia de procesadores ADSP-2106x dispone de interrupciones software que emulan el comportamiento de las interrupciones pero que son activadas por programa, en lugar de ser activadas por hardware. Si ponemos a 1 alguno de los bits 28-31 del latch de interrupciones IRPTL con la instrucción BIT SET o escribiendo un valor en IRPTL, activamos una interrupción software. El procesador salta a la correspondiente subrutina de atención a interrupción si dicha interrupción no está enmascarada y las interrupciones están globalmente habilitadas. 13
ANIDAR LA INTERRUPCION ACTUAL Normalmente la familia de procesadores ADSP-2106x ignoran y no guardan como pendiente una interrupción que ocurra cuando se está ejecutando su subrutina de atención. Inicialmente cuando ocurre la interrupción, el correspondiente bit en el latch de interrupciones se pone a 1. Durante la ejecución de la subrutina de atención este bit es continuamente borrado (el procesador pone a 0 este bit en cada ciclo para evitar que la misma interrupción se guarde como pendiente mientras su subrutina de atención se está ya ejecutando). El modificador (CI) de la instrucción JUMP, sin embargo, permite atender una interrupción mientras su subrutina de servicio está siendo ejecutada. Esto puede ser útil en sistemas que requieren tiempos de respuesta rápidos y bajas latencias en la atención a interrupción. La instrucción JUMP (CI) debe ser colocada dentro de la subrutina de atención. JUMP (CI) borra el bit apropiado en el registro IRPTL y en el puntero a la máscara de interrupciones IMASKP, saca un valor de la pila de estado, sin abandonar la subrutina de atención a interrupción, transformando la subrutina de atención a interrupción en una subrutina software. INTERRUPCIONES EXTERNAS Cada una de las tres interrupciones externas IRQ 2-0 que tienen los procesadores ADSP-2106x pueden ser activas por flanco o por nivel. Los procesadores de la familia ADSP-2106x muestrean las interrupciones una vez en cada ciclo de la señal CLKIN. Las interrupciones activas por nivel son consideradas válidas si en el momento del muestreo valen cero. Una interrupción activa por nivel debe desactivarse (pasar a vale 1) antes de que el procesador retorne de la subrutina de atención a interrupción. Si dicha interrupción está aún activa, el procesador la trataría como una nueva petición de interrupción, ejecutando de nuevo su subrutina de atención sin retornar al programa principal (suponiendo que no hay otra interrupción con mayor prioridad activa). Las interrupciones activas por flanco son consideradas válidas si se muestrean a nivel alto en un ciclo y a nivel bajo en el siguiente. La interrupción puede estar activa indefinidamente. Para realizar la petición de nuevo es necesario que la línea pase a nivel alto y después a nivel bajo de nuevo. Las interrupciones activas por flanco requieren menos hardware externo comparadas con las interrupciones activas por nivel puesto que no es necesario desactivar la señal. 14
INTERRUPCIONES EXTERNAS INTERRUPCIONES EXTERNAS Sin embargo varios dispositivos capaces de generar interrupción pueden compartir una única entrada de interrupción (wired-or) si es activa por nivel, lo que permite una fácil expansión del sistema. En el registro MODE2 hay un bit para cada una de las tres entradas de interrupciones que configura el modo de activación de cada una de ellas: Las interrupciones externas pueden ser asíncronas respecto del reloj de los procesadores ADSP-2106x, esto quiere decir que una entrada de interrupción puede cambiar en cualquier momento. Una interrupción asíncrona se debe mantener a nivel bajo al menos un ciclo de la entrada CLKIN para garantizar que va a ser reconocida. 15
INTERRUPCIONES EXTERNAS INTERRUPCIONES MULTIPROCESADOR Estas interrupciones son usadas para ejecutar comandos entre procesadores en sistemas multiprocesador. Cuando un procesador externo escribe una dirección en el registro VIRPT se genera una interrupción de este tipo. El procesador externo puede ser otro procesador de la familia ADSP-2106x o un procesador host. Cuando se atiende una interrupción de este tipo, el procesador ADSP-2106x automáticamente salva el estado en la pila de estado y comienza a ejecutar la subrutina de atención a interrupción, localizada en la dirección especificada en el registro VIRPT. Los 24 menos significativos del registro VIRPT contienen la dirección; los 8 bits más significativos pueden opcionalmente usarse como un dato que debe ser leído por la subrutina de atención a interrupción. Después de reset el registro VIRPT se inicializa con la dirección estándar contenida en la tabla de vectores de interrupción. 16