Intel 8259 es una familia de controladores de interrupción programables (PIC) desarrollados por Intel para los microprocesadores Intel 8080 , Intel 8085 e Intel 8086 . La familia constaba originalmente de los modelos 8259, 8259A y 8259B, pero hasta la fecha otros fabricantes han creado muchos otros modelos compatibles. El 8259 actúa como multiplexor , combinando múltiples fuentes de interrupción en una sola fuente de interrupción para interrumpir otro dispositivo, para lo cual es más fácil manejar los niveles de prioridad de interrupción y su posible anidamiento.
La versión original del controlador estaba destinada solo para los procesadores 8080 y 8085. En la señal de reconocimiento de interrupción, emitía tres bytes en el bus, el primero correspondía al código de operación "Llamar a subrutina" (valor 0xCD en hexadecimal), luego dos bytes de la dirección de llamada de esta subrutina, que debía escribirse en los registros internos del controlador correspondientes a cada fuente de interrupción. El chip 8259A se lanzó para la familia de procesadores x86 porque el mecanismo de transferencia de control ha cambiado. Ahora se emitieron dos bytes secuencialmente al bus, el primero estaba "inactivo", el microprocesador ignoró su valor, el segundo byte contenía el número del vector de interrupción y la dirección a la que se debe transmitir la ejecución del programa se tomó de la tabla de vectores de interrupción. . Para los procesadores 8086, 80186 y 8088, ocupaba el kilobyte más bajo del espacio de direcciones de memoria. Con los posteriores, comenzando con 80286, la tabla de vectores de interrupción podría moverse a cualquier ubicación de memoria.
El 8259A se incluyó en la PC IBM original en 1980 y se retuvo en la arquitectura IBM PC/XT que se introdujo en 1983 . Con la introducción de IBM PC/AT llegó el segundo chip 8259A. Posteriormente, la familia 8259A se eliminó a favor de la arquitectura Intel APIC , diseñada originalmente para PC multiprocesador.
De hecho, desde principios de la década de 1990, el 8259A no se ha utilizado como un dispositivo independiente, sino que se ha convertido en parte del conjunto de chips, más tarde que Southbridge . Uno de los chips más famosos que integró completamente la funcionalidad de todos los controladores programables que estaban en la placa IBM PC-AT fue el chip 82C206, lanzado por Chips & Technologies en 1988.
En la URSS, el 8259 se produjo como KR580VN59 y el 8259A como un chip controlador programable para interrupciones prioritarias KR1810VN59A [1]
Las principales conclusiones utilizadas en 8259 son:
Se pueden conectar hasta 8 esclavos 8259 al maestro 8259, proporcionando hasta 64 interrupciones. Cuando se conecta en cascada, la salida INT del esclavo se conecta a una de las líneas IRQ del maestro 8259.
8259 tiene tres registros:
Las operaciones de terminación de interrupción (EOI) se clasifican como especificadas, no especificadas y automáticas. La operación específica de EOI especifica qué nivel de interrupción reconocer en el ISR (en realidad, qué bit borrar en el ISR). Un comando EOI no especificado restablece la línea IRQ de mayor prioridad que se está procesando. El modo EOI automático borra un bit en el ISR inmediatamente después de que se reconoce la interrupción.
Se admiten los modos de interrupción de borde y nivel.
Se admiten los modos de cambio de prioridad fija y cíclica.
El 8259A se puede configurar para trabajar con un 8088 o un 8086. Es decir, un bus de datos de 8 o 16 bits .
La programación del 8259A bajo DOS y Microsoft Windows causó una cantidad significativa de vergonzosos problemas de compatibilidad con versiones anteriores que se remontan a las primeras PC en 1981.
El primer problema es más o menos la fuente del segundo. Los controladores de dispositivos de DOS deben enviar un comando EOI no especificado cuando hayan terminado de reparar su dispositivo. Debido a esto, el uso de otros modos de terminación de interrupción es difícil (no siempre es posible garantizar que el nivel deseado no se restablecerá antes). También hace que sea imposible distinguir entre interrupciones redirigidas del maestro 8259 al esclavo.
El segundo problema surge al usar IRQ2 e IRQ9, que apareció cuando se introdujo el esclavo 8259A en el PC/AT. La salida INT del esclavo 8259 está conectada a la línea IRQ2 del maestro. La línea IRQ2 del bus ISA, previamente conectada a esta línea, ahora ha sido redirigida a la salida IRQ1 del esclavo. Así que ahora la interrupción de bus IRQ2 activa IRQ9. Para compatibilidad con controladores DOS que aún esperan IRQ2, se ha agregado un controlador que redirige IRQ9 al controlador IRQ2 original.
En el BIOS de la PC (y, por lo tanto, en DOS), tradicionalmente se asignan las solicitudes de interrupción del maestro 8259 (IRQ0-IRQ7) para interrumpir los vectores INT08-INT0F, respectivamente. Y solicitudes de esclavo 8259A (en PC/AT y más allá) IRQ8-IRQ15 a INT70-INT77. Esto se hizo a pesar de que los primeros 32 vectores de interrupción están reservados para interrupciones internas del procesador (por alguna razón, los diseñadores de arquitectura de PC ignoraron este hecho). Por lo tanto, la mayoría de los otros sistemas operativos asignan interrupciones (al menos para el maestro 8259) a un rango diferente de vectores de interrupción.
La mayoría de los otros sistemas operativos permiten otros modos de operación para el 8259A, como la terminación automática de interrupciones. Esto es especialmente importante para los sistemas modernos basados en x86 , donde se puede desperdiciar una cantidad significativa de tiempo en la latencia del espacio de E/S en las operaciones 8259. También permite que se introduzcan optimizaciones de tiempo adicionales, como secciones críticas, en dispositivos de sistemas multiprocesador 8259.
Debido a que el bus ISA no admite interrupciones de nivel, para los sistemas PC/XT, PC/AT y MCA, el 8259A debe configurarse de extremo a extremo. En los EISA , PCI y posteriores más nuevos, existen registros de control de borde/nivel (ELCR) que le permiten configurar el modo de operación para cada línea IRQ individualmente, eliminando efectivamente la necesidad de configurar el modo de operación 8259 para tales sistemas con bus ISA. .
Estos registros están ubicados en las direcciones 0x4d0 y 0x4d1 en el espacio de direcciones de E/S x86. Su dimensión es de 8 bits, cada bit corresponde a una de las líneas IRQ 8259A. Cuando se establece el bit, la línea IRQ se activa en el nivel, de lo contrario en el frente.
Bajo ciertas condiciones, el 8259A puede generar una interrupción espontánea, generalmente IRQ7 y, con mucha menos frecuencia, IRQ15.
En el primer caso, la línea IRQ se restablece antes de que se reconozca. Esto puede deberse al ruido en las líneas IRQ. En el modo borde a borde, el ruido debe mantener la línea alta durante 100 ns (el tiempo mínimo para escribir en un flip-flop IRR). Cuando el ruido desaparece, la resistencia pull-up bajará el nivel de IRQ, generando así una interrupción espuria. En operación nivelada, el ruido puede causar una condición alta en la línea INTR. Cuando el sistema emite una solicitud de confirmación de interrupción, el 8259 no tendrá los datos para habilitarla y emitirá IRQ7 (el valor predeterminado). Así es como pueden aparecer los IRQ7 falsos.
Un caso similar puede ocurrir cuando el desenmascaramiento del 8259A y el restablecimiento de la línea IRQ no están cuidadosamente sincronizados. En muchos sistemas, la línea IRQ se restablece mediante un comando de escritura del espacio de direcciones de E/S y el procesador no espera a que la instrucción llegue al dispositivo de E/S. Si el procesador continúa y desenmascara el nivel 8259A apropiado antes de que ocurra el restablecimiento de la línea IRQ desde el dispositivo, el 8259A emitirá una solicitud de interrupción INTR nuevamente. Para cuando el procesador reconozca esta solicitud INTR y emita un reconocimiento, la línea IRQ se puede restablecer y el 8259A devolverá una IRQ7 espontánea.
El segundo caso es similar al primero, excepto que la situación indicada se aplica al dispositivo esclavo, es decir, cuando la línea IRQ2 maestra está activa en el momento en que las líneas IRQ 8259 esclavas están inactivas por el flanco descendente del reconocimiento de interrupción (INTA). En este caso, se mostrará IRQ15 espontáneo, pero este es un caso extremadamente raro.
Por lo tanto, cuando se trabaja con IRQ7, se recomienda verificar al comienzo del controlador de interrupciones para ver si hay reingreso y verificar el registro ISR 8259A para determinar que no se trata de una interrupción espontánea, sino de una interrupción que en realidad proviene de la línea IRQ7.
La arquitectura IBM PC/XT tenía solo un controlador de interrupción 8259A y, comenzando con IBM PC/AT , los sistemas recibieron un segundo esclavo 8259A. Las líneas IRQ0...IRQ7 son las líneas IR0...IR7 del maestro 8259A, y las líneas IRQ8...IRQ15 son las líneas IR0...IR7 del esclavo 8259A. IRQ0…IRQ15 son las líneas de bus ISA a las que históricamente se ha conectado el 8259A.
Inicialmente, IRQ7 era la opción común para usar en tarjetas de sonido, pero luego se usó IRQ5 en esta función para evitar conflictos con el puerto de impresora LPT. Los puertos serie a menudo se deshabilitaban para liberar la línea IRQ para otro dispositivo.