Sie sind auf Seite 1von 7

Arquitectura e Sistemas de Computadores I

Interrupes no 80x86. Programao de entradas/sadas na porta srie usando interrupes.


Objectivos: Este texto introduz o mecanismo de interrupes para as arquitecturas i80x86, em particular para o tratamento de I/O. A porta srie usada como exemplo.

1 O mecanismo de interrupes do Intel 80x86


Vector de interrupes Os processadores 80x86 assumem que as primeiras posies da memria fsica contm um vector de 256 posies vector de interrupes. Cada uma destas posies corresponde a um tipo de interrupo e ocupa 4 bytes. Estes bytes contm um endereo com 32 bits da rotina a ser chamada quando ocorre uma interrupo desse tipo. Este tipo de rotina designado por rotina de tratamento, de servio, ou de atendimento da interrupo. Parte do vector de interrupes apresentado na figura 1, tal como existe nos IBM/PC e compatveis. n da Int. 0 1 2 3 ... 11 12 ... 33 (21h) ... 255 Causa diviso por zero exec. passo a passo N.M.I. debug ... COM2 (IRQ3) COM1 (IRQ4) ... chamada ao DOS ... ... Tipo Interna Interna Externa Interna ... Externa Externa ... Software ... ... End. memria
000h 004h 008h 00ch ... 02ch 030h ... 084h ... 3fch 003h 007h 00bh 010h

- 02fh - 033h - 087h - 3ffh

Figura 1: Parte do vector de interrupes

Tipos de interrupes As interrupes podem ter diversas origens: interrupo por software (usando a instruo INT; ex: INT 21h); condio excepcional na execuo de uma instruo (por exemplo uma diviso por zero quando executa a instruo DIV); uma interrupo exterior ao processador. Existem duas linhas externas de interrupo do processador (ver figura 2): a linha NMI (Non Maskable Interrupt) e a linha INTR (Interrupt Request) proveniente do controlador de interrupes (PIC Programmable Interrupt Controler). A interrupo NMI indica a ocorrncia de erros no hardware, e as interrupes recebidas por essa linha no podem ser inibidas

Dep. Informtica, Fac. de Cincias e Tecnologia, Universidade Nova de Lisboa

(i.e. no podem ser ignoradas). Pelo contrrio, as interrupes submetidas pela linha INTR podem ser ignoradas pelo CPU.

8259A 80 x86 CPU B us D ados (8 b it s ) IN T R IN TA P IC M ASTER

IR Q 0 IR Q 1 IR Q 2 IR Q 3 IR Q 4 IR Q 5

R e l g io Tecla d o P I C S L A V E (O u t r o s p e r if r ic o s ) COM 2 COM 1 LPT2 D iske tte LPT1

IN T

IR Q 6 IR Q 7

NM I

Figura 2: Controlador de Interrupes e CPU

Ignorar/permitir interrupes pela linha INTR A instruo assembly cli faz com que o CPU ignore as interrupes externas provenientes do PIC. Aps a instruo assembly sti o CPU passa de novo a atender as interrupes submetidas pela linha INTR. Nmero da interrupo Nas interrupes por software, o nmero (ou cdigo) da interrupo dado explicitamente na instruo (p. ex. int 21h). No caso das condies excepcionais existe um cdigo pr-definido para cada caso (p.ex. a interrupo nmero zero ocorre na execuo de DIV se o divisor for zero). A interrupo NMI tem o nmero 2. No caso das interrupes externas (linha INTR), o cdigo (ou nmero) indicado pelo PIC atravs do bus de dados. Atendimento da interrupo A aceitao de uma interrupo pelo CPU equivalente sequncia:
1. as flags so guardadas na pilha 2. todas as interrupes so inibidas (passam a ser ignoradas) 3. efectuado um call usando o endereo que est no vector de interrupes na posio correspondente ao nmero da interrupo (endereo: 4xnum.intr.)

A instruo iret (interrupt return) tem de ser usada para o retorno de uma rotina de tratamento de interrupes, pois alm de desempilhar o endereo de retorno (deslocamento e segmento), tambm necessrio repor o registo das flags usando a cpia que est na pilha. Como se pode observar desta descrio, sempre que o CPU atende uma interrupo desliga as interrupes externas. Para permitir de novo a ocorrncia desse tipo de interrupes a interrupt flag deve ser colocada a 1: a) com a instruo sti (por exemplo quando se quer continuar a atender essas interrupes, mesmo que a rotina de atendimento ainda no tenha terminado); b) com a instruo iret que, ao repr o estado anterior das flags, volta a permitir a aceitao de interrupes.

DI.FCT.UNL

-2-

2 Interrupes externas
Nveis de interrupo O controlador de interrupes (PIC) um dos componentes centrais do IBM-PC e permite que os vrios perifricos interrompam o CPU. O PIC associa a cada uma das suas linhas de entrada (IRQ) um cdigo de interrupo (o nmero da interrupo) que transmitido ao processador atravs do bus de dados. As vrias linhas de entrada possuem diferentes prioridades, tambm chamadas de nveis de interrupo, sendo o IRQ 0 o mais prioritrio e o IRQ 7 o menos. O controlador s envia novas interrupes ao CPU quando este no est a tratar nenhuma interrupo de prioridade igual ou superior. Mesmo que dentro de uma rotina de tratamento se liguem as interrupes (sti), esta rotina s ser interrompida por outras de nvel superior, ou seja de IRQ menor. Para que o PIC saiba que o tratamento de uma interrupo terminou tem de ser explicitamente informado dando-lhe um comando (ver mais frente). Programao do controlador PIC O PIC ocupa os endereos 0020h-23h do mapa de I/O (ver figura 1 do enunciado do trabalho 4) e a sua utilizao1 envolve dois tipos de comandos: Comandos de inicializao, que definem o modo de operao do PIC, incluindo a associao entre os nveis de interrupo (IRQs) e cdigos de interrupo. Estes comandos so executados pela BIOS, durante o arranque da mquina e no vo ser discutidos. Comandos de operao, usados durante o normal funcionamento do computador.

Este ltimo tipo de comandos permite assinalar ao controlador que a interrupo foi tratada e mascarar ou desmascarar (ligar ou desligar) certas entradas de IRQ. Para tal so usados 2 portos de I/O: Registo de comandos no endereo 20H Registo de mscara no endereo 21H No registo de comandos apenas se pode escrever. O nico comando que interessa referir o EOI (End Of Interrupt, valor 20h) que assinala ao controlador que a interrupo pendente foi tratada, para voltar a permitir ao PIC a emisso de novas interrupes de qualquer prioridade ou nvel. O registo de mscara pode ser lido e escrito e permite inibir ou activar certos nveis de interrupo (IRQs); um bit a 1 indica que esse nvel est inibido (desligado). Por exemplo: se o registo de mscara tem o valor 10111110, isto significa que o PIC apenas vai aceitar interrupes de IRQ 6 e IRQ 0. Se se pretender modificar o estado em relao a um destes nveis recomendvel desligar as interrupes (atravs da instruo cli) sempre que se efectua uma operao de escrita neste registo, e voltar a ligar (sti) logo de seguida.

Os IBM/PC e compatveis possuem dois PIC em cascata para permitir mais de 8 fontes de interrupo. Neste documento s nos referimos ao que se encontra directamente ligado ao CPU (o master)
1

DI.FCT.UNL

-3-

3 Interrupes da porta srie


Na UART, alm dos registos j referidos no documento anterior, h outros registos relacionados com a forma como o controlador da porta srie pode interromper o CPU: A colocao a 1 do bit 3 do registo MCR indica que a UART deve gerar interrupes. O registo IER especifica em que situaes a UART deve interromper o CPU: bit 0 interrupo de recepo (chegou um carcter) bit 1 interrupo de transmisso (THR ficou vazio) Quando ocorre uma interrupo, podemos consultar o registo IIR para identificar a causa da interrupo (quando ambas esto ligadas no IER): bit 0 Esta porta srie causou uma interrupo que aguarda tratamento. bits 1-2 A causa da interrupo: 01B - registo de transmisso (THR) vazio; 10B carcter disponvel no registo de recepo (RBR); 11B erro na recepo (consultar LSR para saber o motivo). Para ver a relao entre IRQs, nmeros de interrupo (ou cdigos) e a porta srie, consultar as figuras 1 e 2.

4 O Turbo C e as interrupes
Apresentam-se agora algumas das extenses linguagem C que so suportadas por este compilador, e algumas funes das bibliotecas do Turbo C que so teis neste trabalho. Rotina de tratamento de interrupo O compilador Turbo C permite a utilizao de uma palavra chave interrupt para indicar que determinada funo vai ser chamada atravs de uma interrupo em vez de ser chamada pelo programa. Esta palavra chave diz ao compilador para salvaguardar todos os registos no inicio e para terminar a funo com a instruo iret em vez da tradicional instruo ret usada nas funes normais. Exemplo:
void interrupt f(void) { ... }

Esta ser traduzida pelo compilador em algo equivalente a:


f proc far push ax push bx push ... ... pop ... pop bx pop ax ; salva todos os registos

; repe todos os registos

DI.FCT.UNL

-4-

iret f endp

; interrupt return

Nota: Tenha em ateno que, para a compilao correcta de cdigo C com rotinas de atendimento interrupes, ambas as opes Use register variables (em Options>Compiler->Optimization) e Stack warning (em Options->Linker) tm de estar a OFF. Definir ou alterar a rotina de atendimento de interrupo O Turbo C permite efectuar chamadas s funes no MS-DOS. Entre estas encontram-se as que permitem consultar e alterar os valores no vector de interrupes e podem ser acedidas pelas seguintes funes C:
void setvect(int interruptno, void interrupt (*isr)()); void interrupt (*getvect(int interruptno))();

Estas encontram-se declaradas no header dos.h e correspondem, respectivamente, s funes 25h e 35h do MS-DOS (int 21h). Lembre-se que em C podemos obter o endereo de uma funo usando simplesmente o seu nome, sem a invocar. Por exemplo, para alterar o tratamento de uma interrupo:
#include <dos.h> void interrupt f(void) { .../* nova funo */ ... } . . . void interrupt (*old_isr)(); . . . old_isr = getvect(numInt); setvect(numInt, f);

Ligar e desligar as interrupes No header dos.h encontram-se tambm os prottipos de rotinas C correspondentes s instrues assembly cli e sti:
void disable ( void ); void enable ( void ); /* cli- Desliga as interrupes. */ /* sti- Liga as interrupes. */

5 Uso de interrupes na recepo de caracteres


Esta seco discute de que forma que o mecanismo de interrupes pode ser usado na recepo de caracteres. Os caracteres recebidos sero guardados num buffer temporrio para tratamento de forma assncrona pelo programa principal. Evita-se assim que se percam os caracteres que cheguem enquanto o programa est a realizar outra actividade.

DI.FCT.UNL

-5-

5.1 Recepo por interrupes


Agora a funcionalidade de receber o carcter da porta srie passa a ser assegurada pela rotina de tratamento de interrupes, em vez do modelo de espera activa onde se ficava a verificar a chegada de mais um carcter. O carcter recebido deve ser colocado num buffer circular, e funo do programa principal retirar de l os caracteres e escrev-los no ficheiro.

5.2 Um buffer circular


Um buffer circular uma estrutura de dados que implementa um reservatrio temporrio de dados, onde podem ser colocados e retirados elementos, usando uma poltica FIFO (First In First Out). Este pode ser implementado atravs de um vector e, pelo menos, dois ndices um indica a posio do primeiro elemento a sair (e que foi o primeiro a entrar) e outro que indica a posio onde vai entrar o prximo elemento (ou onde se encontra o ltimo que entrou). Opcionalmente podemos manter o nmero de caracteres no buffer, para que seja mais fcil saber quando ele est cheio ou vazio. Se tivermos a seguinte definio em C:
typedef struct { char buffer[MAX]; int count; /* Nmero de caracteres no buffer */ int head; /* Prximo carcter a ser retirado */ int tail; /* Posio onde se colocar um novo caracter */ } queue;

Uma imagem do buffer para MAX=16, pode ser encontrada na figura seguinte. A ser o prximo carcter a ser retirado e o prximo carcter que entrar, ser colocado na posio 1.
MAX=16 H tail=1 A B head=9 C D E F G

count=8

Figura 3: Exemplo de um buffer de 16 elementos

Repare que pode acontecer que este buffer fique cheio ou vazio, dependendo da velocidade relativa entre quem coloca e quem retira elementos.

6 Componentes para a implementao da recepo com interrupes


6.1 Preparao para a recepo por interrupes
A preparao para a recepo com interrupes inclui os seguintes passos: a. programao do controlador de interrupes (PIC) para aceitar interrupes da porta srie usada. Quando esta programao feita as interrupes devem estar desligadas no CPU.
DI.FCT.UNL -6-

b. programao do controlador da porta srie (UART) para gerar interrupes no caso da recepo de um carcter; c. incluso do processamento da chegada de um carcter numa rotina de tratamento de interrupes e seu registo no vector de interrupes . Antes de mudar o contedo de uma entrada do vector de interrupes o valor que l se encontra deve ser salvaguardado; quando o seu programa acaba este valor salvaguardado deve ser reposto no vector. guarde sempre o estado das interrupes antes de cada uma destas alteraes e de modo a que esse estado possa ser reposto no fim do seu programa;

6.2 Programao do buffer circular


Tero de ser definidas as seguintes operaes sobre o buffer circular: inicializao do buffer; insero de um elemento no buffer; suponha que quando esta rotina chamada o buffer no est cheio; remoo de um elemento do buffer; suponha que quando esta rotina chamada o buffer no est vazio; testa se o buffer est vazio testa se o buffer est cheio.

7 Anexo: Inline Assembly


[LEITURA OPCIONAL] No Turbo C tambm podemos usar cdigo assembly embutido (inline) no cdigo C desde que: o pragma inline esteja previamente definido; cada linha assembly seja precedida da instruo asm; Assim, caso quisesse incluir as instrues assembly cli (clear interrupts) e sti (set interrupts), em vez de utilizar as funes C correspondentes (disable() e enable() ), faria: #pragma inline
void DisableInterrupts(void) { asm cli; } void EnableInterrupts(void) { asm sti; }

DI.FCT.UNL

-7-

Das könnte Ihnen auch gefallen