Beruflich Dokumente
Kultur Dokumente
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
(i.e. no podem ser ignoradas). Pelo contrrio, as interrupes submetidas pela linha INTR podem ser ignoradas pelo CPU.
IR Q 0 IR Q 1 IR Q 2 IR Q 3 IR Q 4 IR Q 5
IN T
IR Q 6 IR Q 7
NM I
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-
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) { ... }
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. */
DI.FCT.UNL
-5-
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
Repare que pode acontecer que este buffer fique cheio ou vazio, dependendo da velocidade relativa entre quem coloca e quem retira elementos.
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;
DI.FCT.UNL
-7-