Controlador de interrupções 8259

Controlador de interrupções 8259

Nenhum computador pode atender as solicitações dos dispositivos de entrada e saída sem implementar um conjunto de interrupções de hardware. Um modo simples de compreender o funcionamento das interrupções de hardware é fazer a analogia com recepção de uma chamada telefónica. Assim quando se pretende comunicar com uma pessoa podemos faze-lo por telefone, pensando nas linhas telefónicas como sendo as linhas que ligam os dispositivos de entrada e saída ao processador, um computador sem interrupções é pois como um telefone sem campainha, pois assim nunca se sabe quando o telefone toca, e teríamos que estar sempre a atender o telefone para verificarmos se alguém quer falar connosco, do mesmo modo se o computador não possuir interrupções o CPU tem estar sempre a verificar se algum dispositivo pretende comunicar com ele. No telefone com campainha podemos estar a fazer varias coisas e só atendemos o telefone quando ele toca, nessa altura falamos com a outra pessoa, no caso do CPU, este realiza outras tarefas sem se preocupar com os dispositivos. Estes só vão ser atendidos quando solicitarem um pedido de interrupção

Ainda continuando com a mesma analogia com o telefone, suponhamos que estamos a ler um livro e o telefone toca, marcamos a página do livro e vamos atender o telefone, falamos com o nosso interlocutor, depois voltamos a continuar a leitura do livro na posição em que estávamos quando o telefone tocou. O CPU responde às interrupções da mesma maneira, quando está a executar um programa e é solicitado um pedido de interrupção, guarda o endereço da posição de memória que está a executar na pilha e vai executar a interrupção, quando acaba de executar a interrupção vai buscar da pilha o endereço da instrução seguinte à que estava a executar quando aconteceu o pedido da interrupção.

O CPU para o pedido de interrupções externo só tem uma linha para todos os dispositivos. Existindo então um controlador de interrupções, este faz a interface com o processador dos pedidos de interrupção feitos pelos diferentes dispositivos de entrada/saída. Quando o CPU recebe o pedido de interrupção, verifica com o controlador de interrupções que dispositivo causou o pedido de interrupções e então efectua o atendimento apropriado à interrupção

1.CONTROLADOR DE INTERRUPÇÕES 8259

O controlador de interrupções usado no original IBM PC, era um 8259 ( Programmable Interrupt Control - PIC) da Intel, só assim é possível o atendimento de várias fontes de interrupções. Quando do surgimento do PC-AT, a capacidade de atendimento de interrupções foram estendidas, tendo sido incorporado mais um 8259, duplicando a capacidade de atendimento das interrupções.

De modo a manter a compatibilidade com o PC-AT, os construtores de computadores foram incorporando no Chiptset da motherboard o equivalente a um par de 8259. O que interessa de facto é que o modo de efectuar a configuração é como se efectivamente existissem os dois 8259.

Figura 1- Registos do controlador de interrupções 8259.

Figura 2- Controlador de interrupções 8259.

O bloco básico da constituição da PIC é mostrado na figura 1. Possui 8 linhas de pedidos de interrupções de dispositivos externos, referenciadas como IR0, IR1 a IR7 que passam em primeiro lugar por um registo denominado IMR (Interrupt Mask Register), que verifica se a interrupção em causa está ou não mascarada i.e. inibida. Se a interrupção está mascarada esta não executada, não existindo mais nenhum procedimento. Se a interrupção em causa não estiver mascarada vai ser processada no IRR (Interrupt Request Register).

O IRR guarda os pedidos de interrupção até que estes sejam efectivamente atendidos pelo processador, existindo um outro registo denominado Priority Resolver, que vai seleccionar qual a interrupção de maior prioridade isto no caso de existirem vários pedidos em simultâneo. A interrupção de maior prioridade é a linha de IR0, seguido pela linha IR1, sucessivamente até IRQ7, este de menor prioridade.

Depois de o PIC determinar qual a IRQ a processar, tem de comunicar ao processador para que seja executada a correspondente rotina d serviço à interrupção. Este processo é feito enviando um INT para o processador, é feito pela linha de INT-linha é activada pelo PIC o que é interpretado pelo processador como um pedido de interrupção, O processador termina a instrução corrente que está a executar, e responde ao PIC com um sinal de confirmação (Acknowledge) pela linha de INTA - é um pulso negativo.

Após a confirmação pela linha de INTA, o IRQ que o PIC está a processar é guardado no ISR ( In Service Rotine) , indica qual a interrupção que está a ser processada.

Um outro pulso negativo é enviado pelo processador para indicar ao PIC para colocar no barramento de dados (8 linhas menos significativas) o numero da interrupção, no caso de existirem dois PIC, sendo neste caso um configurado como MASTER e o outro configurado como SLAVE, e se o pedido de IRQ for do slave, então neste caso o master indica ao slave para enviar o vector da interrupção.

O envio do numero da interrupção faz com que o processador executa a correspondente rotina de serviço à interrupção, que no fim da sua execução deverá enviar uma indicacão de fim de interrupção EOI (End of Interrupt) para o PIC, que tem como função fazer o reset ao registo ISR, se neste momento não tem mais nenhuma interrupção pendente, fica em espera até que seja solicitado uma nova interrupção.

Redireccionamento de IRQ2/IRQ9

O redireccionamento de IRQ 2 causa por vezes alguma confusão, no original XT, só existia um PIC, então como tal eram atendidas 8 pedidos de interrupções. Com o surgimento do PC-AT, acrescentaram mais um controlador. Como houve a necessidade de manter a compatibilidade com o hardware mais antigo , a nova configuração foi implementada utilizando a IRQ 2 como entrada da linha de INT do PIC slave.

O CPU só tem uma linha de interrupção INT, pelo que o segundo controlador tem de ser ligado ao primeiro, numa configuração master/slave. A linha de IRQ 2, foi a seleccionada, utilizando a IRQ 2 para o segundo dispositivo, mais nenhum dispositivo a pode utilizar. Os dispositivos que utilizavam a IRQ2 foram desviados para a IRQ 9.

Figura 2- Dois PICs ligado em modo Master/Slave

Inicialização do PIC

O passo inicial de qualquer operação com o 8259 é pelo envio das palavras de controlo enviadas para os portos de localização endereço base+0 e endereço base+1. Estas palavras de controlo dividem-se em duas categorias palavras de controlo de inicialização (ICW) e palavras de controlo de operação (OCW). Antes da inicialização do 8259 tem de ser definido o contexto em que o 8259 vai opera e com que processador vai fazer de interface. Existem no total 4 palavras de inicialização que podem ser enviadas para o PIC, para definir o modo de funcionamento. Uma vez inicializado três palavras de controlo são disponíveis para gerir o processo das interrupções

Sequência de inicialização

Se uma palavra de comando é escrita no endereço base+0 e o bit 4 está a 1, o 8259 automaticamente reconhece a palavra como ICW1, entra em modo de inicialização, quando a inicialização começa, o 8259 efectua as seguintes operações:

1. As linhas de entrada IR0 a IR7 são desabilitada, qualquer entrada nestas linhas é ignorada

2. Efectuado reset ao IMR (colocado a zeros)

3. Atribuição de prioridades IR0- prioridade mais alta, IR7-prioridade mais baixa

4. Endereço do modo slave é colocado a 7

5. Registo de mascara é colocado a zeros

6. A leitura do estado de OCW3 é direccionada para o IRR.

7. Se o bit 0 no ICW1 está a zero então ICW4 não faz parte da sequência de inicialização

Fluxograma 1- Sequência de inicialização do PIC.

0CW1 – palavra de controlo 1, (endereço base+1)

Também conhecido como IMR Interrupt Mask register. OCW1 permite seleccionar qual das entradas IR no 8259 podem ser habilitadas.

Palavras de controlo

0CW1 – palavra de controlo 1, (endereço base+1)

Também conhecido como IMR Interrupt Mask register. OCW1 permite seleccionar qual das entradas IR no 8259 podem ser habilitadas.

É a palavra a ser enviada para o PIC para indicar o fim da rotina de serviço à interrupção, para o 8259 nos PC’s o valor é 20H.

0CW3 – palavra de controlo 3, (endereço base+0)

AS INTERRUPÇÕES NO x86

Os processadores da família do x86 permitem 256 interrupções, muitas destas são apenas de utilização por software, que não vão ser referidas neste capítulo. A tabela de vectores de interrupção, contem o endereço da correspondente rotina de serviço à interrupção, em que cada interrupção ocupa nesta tabela 4 bytes, pois a representação dos endereços é de forma segmentada (CS:IP). Com cada vector de interrupção a ocupar 4 bytes, com 256 tipos de interrupção, significa que o tamanho da tabela é de 1024 bytes, o que corresponde às primeiras 1,024 posições de memória.

Os PC’s disponibilizam 15 linhas de interrupção por hardware, referenciadas como IRQ0 a IRQ15, sendo implementado por dois controladores de interrupção. Um atende as IRQ’s de 0 a 7 e o outro as IRQ’s de 8 a 15. O segundo PIC é ligado em cascata ao primeiro utilizando a IRQ 2

O microprocessador 8086 tem duas entradas de interrupção: uma entrada de interrupção

Não Mascarada (NMI) e uma entrada de interrupção Mascarada (INTR). Como NMI é uma interrupção sem máscara, é usada uma lógica externa para gerar uma máscara para esta interrupção. Nos primeiros PC,um controlador de interrupção (8259) é ligado à entrada de interrupção mascarada. O controlador de interrupção 8259 permite aumentar as interrupções mascaradas para 8 entradas de interrupção. Nos micros mais modernos, dois 8259 fornecem 15 linhas de interrupção. O 8086 tem uma Tabela de Vetor de Interrupção situada em 0000:0000 até 0000:0400, isto é num total de 1024 bytes. A tabela de vetor de interrupção guarda o endereço da Rotina atendimento da Interrupção (ISR), em 4 bytes. Isto possibilita Ter 256 vetores de interrupção. O PC tem 15 interrupções mascaradas e mais uma interrupção não mascarada usadas pelo Hardware. O resto dos vetores de interrupção são usados por interrupção de software e atendimento a exceções. Atendimento a exceções são rotinas de atendimento a interrupções que são chamadas quando ocorre um erro em algum um resultado. Por exemplo, o primeiro vetor de interrupção guarda o endereço da rotina que irá atender à divisão por zero. Quando uma divisão por zero ocorre o microprocessador irá no endereço 0000:0000, buscará os 4 bytes localizados a partir deste endereço e irá executar a rotina definida por este endereço

Tabela 1– Tabela dos vectores de interrupção no x86

Comentários