Controlador Programable de Interrupciones i8259 FUNCIONES - Inicio

datos un valor de 8 bits que indica el número de vector de interrupción (type code. = offset o base de interrupciones del PIC + nº de IRQ). La CPU multiplica este.
251KB Größe 174 Downloads 334 vistas
Controlador Programable de Interrupciones i8259 (PIC 8259 ≡ programmable interrupt controller)

• • • • • • • •

Funciones Estructura externa (esquema de conexión) Estructura interna Secuencia de reconocimiento de una interrupción Conexión en cascada entre varios i8259 Programación del i8259 Modos de operación Ejemplo de programación del i8259

Arquitectura de Computadores (51)

PIC 8259 ≡ programmable interrupt controller

FUNCIONES • Este controlador de interrupciones permite: – Que un ordenador pueda atender interrupciones de hasta 64 periféricos diferentes a través de una sola línea de interrupción Æ especialmente pensado para procesadores i80x86. – Atender a todas las interrupciones de una manera flexible mediante un esquema de interrupciones multinivel.

Arquitectura de Computadores (52)

1

PIC 8259 ≡ programmable interrupt controller

ESTRUCTURA EXTERNA (esquema de conexión) • IRQ0 – IRQ7: peticiones de interrupción de los periféricos, de mayor a menor prioridad. • INT: petición de interrupción al procesador gestionada por el i8259. • INTA (Interrupt Acknowledgement): reconocimento/aceptación de la interrupción por parte del procesador. • CS (chip select): para leer y escribir en los registros del PIC Æ utilizada para programar PIC.

Arquitectura de Computadores (53)

PIC 8259 ≡ programmable interrupt controller

ESTRUCTURA EXTERNA (Descripción de Señales) • CAS2 – CAS0: líneas para la conexión en cascada de varios i8259. Actúan como salida del PIC maestro y como entrada de los PIC esclavos. • EN: indica si el PIC actúa como maestro o como esclavo cuando hay varios encadenados (en cascada). • RD, RW (read, write): permiten leer o escribir en los registros de control del i8259. • A0: única línea del bus direcciones usada para seleccionar los registros de control. • Bus de datos: intercambio de datos entre el PIC y el resto de componentes de un computador (memoria y procesador).

Arquitectura de Computadores (54)

2

PIC 8259 ≡ programmable interrupt controller

ESTRUCTURA INTERNA

Arquitectura de Computadores (55)

ESTRUCTURA INTERNA Registros Internos • Todos los registros del PIC son de ocho bits: – IRR (Interrupt Request Register): cada uno de los bits de este registro está asociado con una de las líneas de petición de interrupción. Estos bits almacenan las peticiones de interrupción pendientes. – ISR (In-Service Register): cada uno de los bits se asocia con una línea de petición de interrupción. En este caso sólo se activa el bit que corresponde a la interrupción que se está procesando en un momento dado. – IMR (Interrupt Mask Register): registro de enmascaramiento de interrupciones. Arquitectura de Computadores (56)

3

ESTRUCTURA INTERNA – Lógica de gestión de prioridad: determina qué interrupción, de las solicitadas en el IRR, debe ser atendida primero. – Buffer del bus de datos: conecta el 8259 con el bus de datos de la placa principal del ordenador. – Lógica de lectura y escritura: acepta los comandos que envía la CPU; transfiere el estado del 8259 hacia el bus de datos. – Buffer de cascada/comparador: almacena y compara las identificaciones de todos los 8259 del sistema.

Arquitectura de Computadores (57)

PIC 8259 ≡ programmable interrupt controller Secuencia de Reconocimiento de una Interrupción 1.

Una o más líneas IRQ son activadas por los periféricos conectados al PIC y esto activa los correspondientes bits del IRR.

2.

El 8259 evalúa la prioridad de estas interrupciones (mediante el codificador de prioridad) y solicita una interrupción a la CPU activando la línea INT.

3.

Cuando la CPU reconoce la interrupción envía la señal INTA.

4.

Entonces el PIC, recibida la señal INTA, activa el bit correspondiente a la interrupción de mayor prioridad (la que va a ser procesada) en el ISR y borra ese mismo bit en el IRR. En este ciclo, el 8259 aún no controla el bus de datos.

5.

Cuando la CPU envía un segundo ciclo INTA, el 8259 deposita en el bus de datos un valor de 8 bits que indica el número de vector de interrupción (type code = offset o base de interrupciones del PIC + nº de IRQ). La CPU multiplica este valor por 4 para buscar en esa dirección de memoria la dirección de comienzo de la RTI.

6.

En el modo AEOI del PIC, el bit de la interrupción en el ISR es borrado automáticamente nada más acabar el segundo pulso INTA. En caso contrario, este bit permanece activo hasta que la CPU envíe el mandato (comand) EOI (End of Interrupt) al final de la rutina que trata la interrupción (esto es lo más normal). Arquitectura de Computadores (58)

4

PIC 8259 ≡ programmable interrupt controller Conexión en cascada entre varios i8259 (I) • Cuando es necesario atender a las peticiones de interrupción de más de ocho periféricos se pueden conectar varios PIC’s en cascada. • Se utilizan dos niveles de controladores: en el primero tenemos al PIC master, y en el segundo entre 1 y 8 esclavos. Sólo la salida INT del master está conectada a la entrada INTR del procesador. • Para conectar un PIC en configuración de cascada se conecta su salida INT a una de las entradas IRQ del PIC master y sus entradas CAS a las salidas CAS del master. • Además, la entrada EN debe ser coherente con la función de cada uno de los microcontroladores: debe valer 0 para los esclavos y 1 para el master.

Arquitectura de Computadores (59)

Conexión en cascada entre varios i8259 (II)



La secuencia de reconocimiento de una petición de interrupción en las líneas del master es la misma que ya se ha explicado. Si la petición de interrupción es en una de las líneas de un esclavo, entonces:

1. El PIC esclavo detecta la petición de interrupción por una de sus líneas y activa la señal INT. 2. El PIC master detecta la petición de interrupción por la línea a la que se conecta Arquitectura de Computadores (60) ese esclavo. Activa el correspondiente bit del

5

Conexión en cascada entre varios i8259 (III)

6.

Con el segundo pulso de INTA, el esclavo vuelca en el bus de datos el número del vector de interrupción.

7.

En el modo AEOI, los bits de los registros ISR del master y el esclavo se limpian automáticamente cuando termina el segundo ciclo de INTA. Si no se trabaja en este modo, el procesador deberá enviar dos mandatos de EOI, uno al master y otro al esclavo. Para que esto funcione así, la RTI debe saber en cada caso si está atendiendo a una interrupción gestionada directamente por el master o a través de una pareja master-esclavo. Esto es necesario para que envíe uno o dos comandos EOI respectivamente.

8.

Se debe tener en cuenta que la conexión de un PIC esclavo al PIC master origina una reestructuración del esquema de prioridades de los niveles de interrupción del computador: se intercalan ocho nuevos niveles entre los que ya tuviera el master conectados. Arquitectura de Computadores (61)

PIC 8259 ≡ programmable interrupt controller Programación del i8259 (I) •

El 8259 acepta dos tipos de comandos generados por la CPU: 1. 2.

ICW (Inicialization Command Word): inicializa el 8259. OCW (Operation Command Word): programa la modalidad de funcionamiento.



La comunicación con el 8259 emplea las líneas WR y RD, así como la A0 y el bus de datos.



El hecho de que exista una sola línea de direcciones (la A0) implica que el PIC sólo ocupa dos direcciones de puerto en el espacio de E/S del ordenador (normalmente 20h y 21h).



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.



Los ICW deben mandarse antes de que el sistema comience a trabajar. Posteriormente los OCW pueden ser enviados en cualquier momento, una vez realizada la inicialización. Arquitectura de Computadores (62)

6

Programación del i8259 (II) ICWS (Inicialization Command Words) •ICW1 (primera palabra de inicialización)

• Cuando un mandato es enviado con A0=0 y D4=1, el PIC lo interpreta como la primera palabra de la inicialización e inicia la secuencia de inicialización. •Se inicializan (reset) todos los circuitos, se limpia el IMR y se asignan los niveles de prioridad. •Los bits más importantes de este comando son: – SNGL: Si vale 0 (modo simple, no es necesario ICW3); 1 (en cascada). – IC4: Si vale 0, significa que tampoco es necesario el comando ICW4 (Todas las funciones que programa esta palabra se ponen a cero). – LTIM: Indica si las líneas de petición de interrupción funcionan por nivel (1) o por flancos (0). Arquitectura de Computadores (63)

Programación del i8259 (III) ICWS (Inicialization Command Words) • ICW2: se envía con A0=1, siempre a continuación de ICW1. Programa el Offset (base) del vector de interrupciones. • ICW3: se envía con A0=1 sólo si existe más de un 8259 en el sistema (señal SNGL de ICW1 a 1), en caso contrario en su lugar se enviaría ICW4 (si procede). Hay que distinguir entre maestro y esclavo: – En el caso del PIC maestro, cada bit del comando indica si hay un PIC conectado a la correspondiente línea de petición de interrupción. Por ejemplo, si S6 vale 1 significa que a la línea IRQ6 tenemos conectado un 8259 en lugar de un periférico. – Para los PIC esclavos, este mandato sirve para indicar la línea del PIC maestro a la que se conectan el PIC esclavo (que siempre estará entre 0 y 7).

Arquitectura de Computadores (64)

7

Programación del i8259 (IV) ICWS (Inicialization Command Words) •

ICW4 (A0 = 1): se envía cuando se quiere que el PIC trabaje en un modo de operación diferente al establecido por defecto. (previamente hay que poner el bit IC4 de ICW1 a 1). – – – – –

• • •

SFNM: Bit que activa el Special Fully Nested Mode. BUF: Bit que activa el Buffered Mode. M/S: l cuando se trata del NC maestro, y 0 cuando se trata de un NC esclavo. AEOI: Bit que activa el modo auto EOI. MD: Bit que señala si trabajamos con el modo del PIC para el 8086.

Fully Nested Mode, modo por defecto, que ordena las IR por prioridades (IR0, máxima – IR7, mínima). Equivale a enviar ICW4 con todos sus bits a cero. Buffered Mode, el 8259 tiene una serie de buffers internos para almacenar los datos antes de volcarlos al bus. Modos de EOI, bajar el bit del registro ISR al final de la señal INTA (AEOI) o para que no se baje de forma manual usando OCW2. Arquitectura de Computadores (65)

Programación del i8259 (I) OCWS (Operation Command Words) Existen tres comandos básicos, OCW1 (con A0=l), OCW2 y OCW3 (estos dos últimos con A0=0). Permiten realizar operaciones de: – – –

habilitar/deshabilitar niveles de interrupción, modificar las prioridades de estos niveles, enviar órdenes de EOI cuando no se trabaja en modo automático,...

OCW1. Los bits a 1 inhiben (enmascaran) la correspondiente IR y los que están a 0 habilitan (desenmascaran) la IR.

Arquitectura de Computadores (66)

8

Programación del i8259 (II) OCWS (Operation Command Words)

OCW2. Varias funciones. •Permite configurar un sistema de rotaciones de prioridades: la última IR atendida pasa a ser la IR de menor prioridad. •Permite el envío del EOI manual por parte del procesador.

Arquitectura de Computadores (67)

Programación del i8259 (III) OCWS (Operation Command Words)

OCW3: Varias funciones. • Permite leer los registros IRR e ISR. • Permite mediante el bit POLL gestionar las interrupciones por software (poco utilizado) inhibiendo la salida INT y posteriormente leyendo el registro ISR. • También permite trabajar con el modo de operación Special Mask.

Arquitectura de Computadores (68)

9

PIC 8259 ≡ programmable interrupt controller Modos de operación (I) • Fully Nested Mode (modo de anidamiento completo): el i8259 opera, por defecto, en esta modalidad. – En este modo, tras la secuencia de inicialización, las interrupciones quedan ordenadas, por prioridades, de mayor (IRQ0) a menor (IRQ7). Este orden puede modificarse en la modalidad de prioridad rotatoria o con el mandato de asignación de prioridad.

Cuando se produce un reconocimiento de interrupción por parte de la CPU, el i8259 evalúa cuál es la interrupción pendiente de mayor prioridad, coloca su número de vector en el bus y activa su bit correspondiente en el ISR. Este bit permanece activo hasta que el 8259 recibe el mandato EOI (fin de interrupción) por parte del procesador. Mientras el bit del ISR esté activo, todas las interrupciones de igual o menor prioridad que lleguen permanecen inhibidas; Sin embargo, las de mayor prioridad podrán interrumpir. Arquitectura de Computadores (69)

PIC 8259 ≡ programmable interrupt controller Modos de operación (II) • Special Fully Nested Mode (modo de anidamiento completo especial): – se emplea en sistemas que tienen varios PIC conectados. Sólo el i8259 maestro es programado en este modo. – Las diferencias respecto al Fully Nested Mode normal son:

– Cuando se atiende una interrupción de un 8259 esclavo, si viene otra de mayor prioridad de ese mismo 8259 esclavo, se provoca una interrupción al maestro (normalmente, el 8259 esclavo estaría enmascarado mientras se procesa una de sus interrupciones). – Cuando acaba la rutina de servicio de interrupción, hay que enviar un EOI al 8259 esclavo. Además hay que leer a continuación su ISR y comprobar si es cero. En ese caso, hay que enviar además otro EOI al 8259 maestro (si no es cero significa que aún hay interrupciones en proceso en el 8259 esclavo).

Arquitectura de Computadores (70)

10

PIC 8259 ≡ programmable interrupt controller Modos de operación: Modos de EOI (III) • • •



El EOI (End Of lnterrupt) sirve para bajar el bit del ISR que representa la interrupción que está siendo procesada. El EOI puede producirse automáticamente (AEOI) al final de la última señal INTA que envía la CPU. Como la mayoría de los sistemas requieren una gestión de prioridades en las interrupciones, es mejor que el EOI lo envíe el propio procesador al 8259 a través de OCW2 cuando termine la RTI (rutina de tratamiento de la interrupción). En un sistema con varios PIC, el EOI debe ser enviado al 8259 esclavo y también al maestro. Hay dos modalidades de EOI: – No especifico: el 8259 borra el bit más significativo que esté activo en el registro ISR, que se supone que es el correspondiente a la última interrupción producida (la de mayor prioridad y que está siendo procesada). Esto es suficiente para un sistema donde se respeta el Fully Nested Mode. – Especifico: si el 8259 es incapaz de determinar cuál fue el último nivel de interrupción procesado (no se respeta el Fully Nested Mode), la RTI debe enviar un EOI específico al PIC indicándole qué bit hay que borrar en el ISR. Arquitectura de Computadores (71)

PIC 8259 ≡ programmable interrupt controller Modos de operación (IV) • Rotación de prioridades. Hay sistemas en que varios periféricos tienen el mismo nivel de prioridad, en los que no interesa mantener un orden de prioridades en las líneas IR. • La solución consiste en asignar el menor nivel de prioridad a la interrupción recién atendida para permitir que las demás pendientes se procesen también. • Para ello se envía un EOI que rote las prioridades. Por ejemplo, si se había procesado una IRQ3, entonces IRQ3 pasará a tener el menor nivel de prioridad e IRQ4 el mayor. Existe también una asignación específica de prioridades a través de OCW2. • Special Mask Mode. Hay ocasiones en las que mientras se ejecuta una RTI es necesario permitir que se produzcan ciertas interrupciones de menor prioridad. Esto implica alterar la estructura normal de prioridades activando el Special Mask Mode con OCW3 durante la RTI (es importante inhibirlo de nuevo al final). Una vez activado este modo, el registro IMR indica qué interrupciones están permitidas (bit a 0) y cuáles inhibidas (bit a 1). Al final hay que enviar un EOI especifico, ya que este modo de trabajo altera el Fully Nested Mode. Arquitectura de Computadores (72)

11

PIC 8259 ≡ programmable interrupt controller Ejemplo de programación del i8259 (I) En un PC existen dos i8259, uno actúa como maestro y el otro como esclavo. Ambos son inicializados por la BIOS al arrancar el ordenador. Generalmente la inicialización de la BIOS se hace usando código ensamblador. El 8259 está conectado al puerto (dirección) de E/S 20h y el esclavo al puerto A0h. En este código escrito en C se propone una posible inicialización. /* Declaración de constantes */ #define BASE_INT_MASTER #define PORT_MASTER_8259_0 #define PORT_MASTER_8259_1

8h 20h 21h

#define BASE_INT_SLAVE #define PORT_SLAVE_8259_0 #define PORT_SLAVE_8259_1

70h 0A0h 0A1h

Arquitectura de Computadores (73)

PIC 8259 ≡ programmable interrupt controller Ejemplo de programación del i8259 (II) /* Rutina de inicialización */ void INICIALIZAR_SISTEMA () { disable (); /* Inhibición de las interrupciones */ ... /* Como se trabaja con 8259-s en cascada, se precisan al menos las tres ICW iniciales. No obstante se hará uso también de la ICW4 */ /*** INICIALIZACIÓN MAESTRO ***/ /* ICW1: activación por flancos, modo en cascada, si ICW4 */ outportb (PORT_MASTER _8259_0, 0x11); /* 0b 0001 0001 */ /* ICW2 : base interrupciones */ outportb (PORT_MASTER_8259_1, BASE_INT_MASTER); /* ICW3 : se conecta un 8259 esclavo en la IR2 del maestro por ejemplo */ outportb (PORT_MASTER_8259_1, 0x04); /* ICW4 : establecer modos de funcionamiento iniciales: “special fully nested” desactivado, “buffered mode” activado, auto EOI (AEOI) */ outportb (PORT_MASTER_8259_1, 0x0F); /* 0b 0000 1111 */

Arquitectura de Computadores (74)

12

PIC 8259 ≡ programmable interrupt controller Ejemplo de programación del i8259 (III) /*** INICIALIZACIÓN ESCLAVO ***/ /* ICW1: activación por flancos, modo en cascada, si ICW4 */ outportb (PORT_SLAVE_8259_0, 0x11); /* 0b 0001 0001 */ /* ICW2 : base interrupciones */ outportb (PORT_SLAVE_8259_1, BASE_INT_SLAVE); /* ICW3 : es el 8259 esclavo conectado a la IR2 del maestro */ outportb (PORT_SLAVE_8259_1, 0x02); /* ICW4 : establecer modos de funcionamiento iniciales: “fully nested” desactivado, “buffered mode” activado, auto EOI (AEOI) */ outportb (PORT_SLAVE_8259_1, 0x0B); /* 0b 0000 1011 */

Arquitectura de Computadores (75)

PIC 8259 ≡ programmable interrupt controller Ejemplo de programación del i8259 (IV) /* Ahora mediante las OCW se pueden gestionar o reconfigurar los 8259. Generalmente las OCW2 y OCW3 se usan en las rutinas de atención de las interrupciones para poder hacer un uso más personal y controlado de estas. */ /* OCW1 : habilitar sólo las IR0, IR1, IR2, IR3 y enmascarar resto en el esclavo */ outportb (PORT_MASTER_8259_1, 0x00) ; outportb (PORT_SLAVE_8259_1, 0xF0); /* OCW2 : activar en ambos rotación de prioridades con AEOI */ outportb (PORT_MASTER_8259_0, 0x80); /* 0b 1000 0000 */ outportb (PORT_SLAVE_8259_0, 0x80); /* 0b 1000 0000 */ /* OCW3 : no se necesita todavía leer ISR ó IRR ni habilitar el modo "special mask” y por lo tanto en la inicialización no se usa este mandato. Se podría incluir en una rutina de atención para inhibir o desinhibir momentáneamente algunas interrupciones determinadas. */ … enable (); /* Habilitación de interrupciones */ }; Arquitectura de Computadores (76)

13