thumb|El NEC D8259A usado en la tarjeta madre del IBM PC original. thumb|Pinout del controlador programable de interrupciones Intel 8259
El Intel 8259 o PIC 8259 es un controlador programable de interrupciones (PIC), diseñado para ser usado en un sistema que incorpore un microprocesador 8085 u 8086. Un posterior sufijo "A" fue compatible con los procesadores Intel 8086 y 8088. El 8259 combina múltiples entradas de interrupción en una simple salida de interrupción hacia el microprocesador, extendiendo los niveles de interrupción disponibles en un sistema más allá de los uno o dos niveles encontrados en el chip del procesador. El 8259A fue el controlador de interrupciones para el bus ISA en el IBM PC original y el IBM AT.
Historia
El 8259 fue introducido como parte de la familia Intel MCS 85 en 1976. El 8259A fue incluido en el PC original en 1981 y mantenido por el IBM XT cuando se introdujo en 1983. Un segundo 8259A fue añadido con la introducción del IBM AT. El 8259A ha coexistido con la arquitectura APIC de Intel, desde su introducción en los PC de multiprocesador simétrico. Los PC modernos ya han comenzado a eliminar por completo el uso del 8259A en favor del uso exclusivo de la arquitectura APIC de Intel. Sin embargo, aunque ya no es un chip separado, la interface del 8259A todavía es proporcionada por el chipset Southbridge en las modernas tarjetas x86.
Los conectores principales en un 8259 son los siguientes:
Ocho líneas de solicitud de interrupción de entrada con el nombre IRQ0 hasta IRQ7 Una salida de solicitud de interrupción llamada INTR Línea de reconocimiento de interrupción llamada INTA Líneas de datos de D0 hasta D7 para comunicar el nivel de interrupción o vector de desplazamiento Otros conectores incluyen CAS0 hasta CAS2 para cascada entre los 8259.
Hasta ocho 8259 esclavos pueden ser conectados en cascada a un 8259 maestro para proporcionar un máximo de 64 IRQ. Los 8259 son conectados en cascada conectando la línea de INT de un 8259 esclavo a una línea de IRQ de un 8259 maestro.
Hay tres registros internos en el 8259:
El Interrupt Mask Register (IMR) (Registro de enmascaramiento de interrupción), que mantiene una máscara de las interrupciones actuales pendientes de reconocimiento (acknowledgement) El Interrupt Request Register (IRR) (Registro de solicitud de interrupción), que mantiene una máscara de las interrupciones que están pendientes de fin de interrupción (EOI) El In-Service Register (ISR) (Registro de En-Servicio), que mantiene una máscara de interrupciones a las que no se les debe enviar un reconocimiento.
El 8259 soporta los modos de prioridad fijos y rotatorios.
La operaciones de Fin de interrupción (EOI) soportan EOI específico, EOI no específico, y auto-EOI. Un EOI específico indica el nivel de IRQ que está reconociendo en el ISR. Un EOI no específico resetea el nivel de IRQ en el ISR. El auto-EOI resetea el nievl de IRQ en el ISR inmediatamente después de que la interrupción es reconocida.
Los modos de disparo de interrupción por flanco y nivel son soportados por el 8259A. Los modos de prioridad fija y prioridad rotativa son soportados.
El 8259 puede ser configurado para trabajar con un 8080/8085 o un 8086/8088. En el 8086/8088, el controlador de interrupciones proporcionará un número de interrupción en el bus de datos cuando se produce una interrupción. El ciclo de interrupción en el 8080/8085 emitirá tres bytes en el bus de datos (que corresponde a una instrucción CALL en el conjunto de instrucciones del 8085).
Estructura del controlador La estructura del controlador está formada por un conjunto de registros internos que analizaremos a continuación.
IRR/ISR:: Registro de peticiones de interrupción/Registro de servicio de interrupción. Al activarse una o varias entradas IR quedán reflejadas en los bits correspondientes de IRR. Se usa para decidir a que interrupción atender.
IMR: Registro de máscaras de interrupción. Se delega la responsabilidad en el programador para enmascarar algunas interrupciones que ayuden al controlador a ignorar dichas interrupciones, aquí cada bit corresponde a una línea IRQ, e indica si está permitida una interrupción de ese nivel en ese momento.
Consideraciones de Programación
DOS y Windows
La programación de un 8259 en relación con el DOS y Microsoft Windows ha introducido una serie de cuestiones confusas en aras de la compatibilidad hacia atrás, que se extiende tan lejos como el PC original introducido en 1981.
La primera cuestión es más o menos la raíz de la segunda cuestión. Los controladores de dispositivos de DOS que espera para enviar un EOI no específico para el 8259s cuando terminan el servicio de su dispositivo. Esto evita el uso de cualquiera de los otros modos de EOI 8259 en DOS, y excluye la diferenciación entre el dispositivo que interrumpe en el cambio de itinerario del 8259 maestro al 8259 esclavo.
La segunda cuestión se refiere a la utilización de IRQ2 y IRQ9 de la introducción de un esclavo en 8259 el PC / AT. La línea INT del 8259 esclavo está conectado a IR2 del maestro. La línea de IRQ 2 del bus ISA, originalmente conectado a este IR2, fue desviado al IR1 del esclavo. Así, la línea IRQ2 viejo genera IRQ9 en la CPU. Para permitir la compatibilidad con controladores de dispositivos de DOS que aún puede configurar para IRQ2, un controlador es instalado por la BIOS para IRQ9, que redirige al controlador de interrupciones IRQ2 original.
Otros sistemas operativos Dado que la mayoría de otros sistemas operativos permiten cambios en las expectativas de controlador de dispositivo, otros modos de operación del 8259 , tales como Auto-EOI, se pueden utilizar. Esto es especialmente importante para hardware moderno x86 en la que una cantidad significativa de tiempo se puede gastardireccionando I / O en la comunicación con los 8259s. Esto también permite otras optimizaciones en la sincronización, tales como las secciones críticas, en un sistema con varios procesadores x86 con 8259s.
Modo disparado por nivel y modo disparado por flanco Dado que el bus ISA no es compatible con las interrupciones disparadas por nivel, este modo no se puede utilizar para las interrupciones conectados a los dispositivos ISA. En los sistemas MCA, los dispositivos usan interrupciones disparadas por nivel y el controlador de interrupciones es cableado para trabajar siempre en este modo. Los nuevos sistemas de EISA, PCI, y más tarde Edge/Level Control Registers (ELCRs) controlan el modo por la línea IRQ, haciendo el modo del irrelevante 8259 para sistemas con buses ISA. El ELCR es programado por la BIOS en el arranque del sistema para su correcto funcionamiento.
Los sistemas ELCR están ubicados en las posiciones 0x4d0 and 0x4d1 del espacio de direcciones de E/S del 8086. Hay 8-bits de ancho. Cada bit corresponde a una línea IRQ de los 8259s. Cuando un bit es establecido, la IRQ está en el modo disparado por nivel, de lo contrario, la IRQ está en modo disparado por flanco.
Interrupciones falsas
El 8259 genera interrupciones falsas en respuesta a una serie de condiciones.
La primera es una línea de IRQ se resetea antes de que sea reconocido. Esto puede ocurrir debido al ruido en la línea de IRQ. En el modo accionado por flanco, el ruido debe mantener la línea en el estado bajo de 100 ns. Cuando el ruido disminuye, devuelve una resistencia pull-up de la línea de IRQ a alta, generando así una falsa interrupción. En el nivel disparado modo, el ruido puede causar un nivel de señal de alta en los sistemas de INTR línea. Si el sistema envía una solicitud de reconocimiento, el 8259 no tiene nada que resolver y por lo tanto envía un IRQ7 en respuesta. Este primer caso se generan falsas de IRQ7.
Un caso similar puede ocurrir cuando el 8259 desenmascarar y la deassertion entrada de IRQ no se sincronizan correctamente. En muchos sistemas, la entrada de IRQ se deasserted por una E / S de escritura, y el procesador no esperar hasta que la escritura llega a la I / O. Si el procesador continúa y desenmascara la IRQ 8259 antes de la entrada de IRQ se deasserted, el 8259 va a valer más INTR. Por el tiempo que el procesador reconoce este INTR y un acuse de recibo para leer la IRQ del 8259, la entrada de IRQ puede ser deasserted, y el 8259 devuelve una falsa IRQ7.
El segundo es el maestro de 8259 IRQ2 es de alta actividad, cuando el esclavo 8.259 líneas de IRQ están inactivos en el flanco de bajada de un reconocimiento de la interrupción. Este segundo caso se generan falsas IRQ15, pero es muy raro.
Programación del 8259
El 8259 acepta dos tipos de comandos generados por la CPU: los ICW (Inicialization Command Word) que inicializan el 8259, y los OCW (Operation Command Word) que permiten programar la modalidad de funcionamiento. Antes de que los 8259 de un sistema comiencen a trabajar deben recibir una secuencia de ICW que los inicialice. Los ICW y OCW constan de secuencias de 2 a 4 comandos consecutivos que el 8259 espera recibir secuencialmente, unos tras otros, a través del bus de datos, según sea necesario (el propio 8259 se encarga de contarlos midiendo los pulsos de la línea -WR). Los OCW pueden ser enviados en cualquier momento, una vez realizada la inicialización.
La comunicación con el 8259 emplea las líneas -WR y -RW, así como A0. El hecho de que exista una sola línea de direcciones implica que el 8259 sólo ocupa dos direcciones de puerto de E/S en el espacio de entrada y salida del ordenador.
ICWS (Initialization Command Words)
En este apartado analizamos las diferentes secuencias de inicialización que podemos introducir al 8259 para su posterior funcionamiento.
ICW1: En esta primera orden de inicialización reseteamos el estado del 8259 y especificamos algunas características tales como si empleamos vectores de interrupción o especificamos las direcciones de comienzo de la RSI (lo cual depende de si estamos utilizando un 8086 u 8080/8085 como procesador). También indicaremos si las interrupciones serán activadas por flanco o bien por nivel. En caso de utilizar un 8080/8085 tendremos que indicar si el intervalo entre dos RSIs es de 4 u 8 bytes. Indicaremos si tenemos un único 8259 conectado a los distintos periféricos o si por el contrario utilizamos varios 8259 en cascada para ampliar el número de peticiones de interrupción que podemos tratar (modo cascada). Finalmente tendremos que especificar si enviaremos una cuarta señal de inicialización que tiene algunas configuraciones iniciales interesantes como ya veremos en ICW4. ICW2: Con este comando de configuración nos permite fijar los distintos vectores de interrupción para cada línea de petición de interrupción (cada nivel de prioridad). ICW3: Esta sentencia de inicialización solo se especificará en caso de que en ICW1 hayamos indicado que estamos trabajando con varios 8259 en cascada, en otro caso no será necesario su especificación. Con este comando configuraremos cada 8259 indicando quién es el maestro (a éste se le especificarán que líneas de petición de interrupción tiene ocupadas con otros 8259 que serán los esclavos). Para especificar que un 8259 es maestro bastará con poner a 1 la señal SP#/EN# o bien tener las señales BUF = 1 y M/S = 1 en caso de que queramos "abrir" el bufer triestado para comunicarnos con el bus de datos). A cada esclavo habrá que indicarle qué número identificativo tiene y éste se corresponde con el número de la "patilla" con el que se conecta al maestro.