EA869 Interrupção Faculdade de Engenharia Elétrica e de Computação (FEEC) Universidade Estadual de Campinas (UNICAMP) Prof. Levy Boccato 1 Objetivos Definir o conceito de interrupção. Diferenciar interrupções de subrotinas. Conhecer as diversas estratégias para implementar interrupções. Aprender a instalar interrupções na memória. 2 Recordando No tópico anterior, vimos como desviar a execução de um programa através de chamadas de subrotinas. Utilidades: (1) eliminar redundâncias, (2) reutilização de código para diferentes entradas de dados, (3) decompor problemas grandes em pequenas partes (modularização), entre outras. Entretanto, nem sempre a mudança do fluxo normal de execução de um programa acontece de forma programada, como ocorre no caso de subrotinas. Quais condições podem acarretar a interrupção da execução de um programa? Atendimento de eventos externos e internos Mouse, teclado, sensores, telas touchscreen, ou sinais internos (reset) podem interromper a execução da CPU para o atendimento dos seus eventos. 3 Exemplo Vamos supor que você esteja jogando 2048 no seu smartphone e alguém resolve ligar para você. MEM CPU PROG Controlador GSI RSI Gerador de Sequência de interrupção: é o hardware dentro do controlador que irá receber o sinal de interrupção, interromper a execução do programa e desviar para a ROTINA DE SERVIÇO DE INTERRUPÇÃO (RSI), a qual é responsável por atender e tratar o evento que gerou a interrupção. 4 Interrupção Definição: INTERRUPÇÃO É a quebra da sequência normal de operação de forma a atender eventos especiais, tais como: Entrada de dados vindos de periféricos. Atendimento de sinal de sensor. Sinais internos. Como o processador descobre que um evento quer interrompê-lo? Através de um sinal de interrupção enviado ao GSI por linhas de interrupção Cada linha de interrupção está associada a um dispositivo (ou a um conjunto deles) que envia o sinal de interrupção quando deseja ser atendido. 5 Interrupção Vejamos agora o atendimento de uma interrupção: O que vai acontecer? MOV R0, #100 MOV R1, (R0)+ MOV R2, (R0)+ ADD R3, R1, R2 MOV (R0), R3 MOV R0, #200 MOV R1, (R0)+ MOV R2, (R0)+ ADD R3, R1, R2 MOV (R0), R3 MOV R0, #300 BUSCA SINAL DE INTERRUPÇÃO EXECUÇÃO RSI: MOV (R0)+ Para queR1, tudo isto MOV R2, (R0)+ ocorra, quais ADD R3, R1, R2o microoperações MOV (R0), R3 GSI deve realizar? RTI Ao aparecer um sinal de interrupção: 1. Controlador termina de executar a instrução corrente. 2. GSI salva o estado atual da máquina e o endereço de retorno, desviando, então, a execução do programa para a rotina de serviço de interrupção (RSI). 3. Ao terminar de executar a RSI, o controlador restaura o estado anterior à interrupção e volta a executar o programa principal. 6 Interrupção Gerador de sinais de interrupção (GSI): É um dispositivo do controlador que, ao receber um sinal de interrupção, salva o estado atual do processador (Registrador de Estado ou PSW), assim como o endereço de retorno, e desvia a execução do programa para a rotina de serviço de interrupção (RSI). Arquitetura: sinais de controle sinal de interrupção ... C.O. sinais de controle BUSCA D ... EXECUÇÃO sinal do fim da sequência de microcomandos Q PARTIDA CLR Q Flip-Flop de Interrupção GERADOR DE SEQUÊNCIA DE INTERRUPÇÃO sinais de controle sinal do fim da sequência de microcomandos ... 7 Interrupção Atendimento de uma interrupção: Armazenar o conteúdo do PC para posterior retorno ao programa interrompido (endereço de retorno). Armazenar o estado corrente do processador para restaurar, após o retorno, a situação (o cenário) existente no momento da interrupção. Desviar o controle de execução para a rotina de serviço de interrupção (RSI). Onde iremos armazenas essas informações? PILHA! SINAIS DE CONTROLE DO GSI PUSH PC PUSH PSW JUMP RSI Pilha ← (PC) Endereço de retorno Pilha ← (PSW) Estado corrente do processador PC ← Endereço da RSI Desvia a execução para RSI 8 Interrupção Retorno de uma interrupção: À semelhança do retorno de subrotina, temos uma instrução especial ao final da RSI. RS1: MOV R1, (R0)+ MOV R2, (R0)+ ADD R3, R1, R2 MOV (R0), R3 RTI Quais operações a instrução RTI deve executar? POP PSW POP PC PSW ← Estado anterior à Interrupção PC ← Endereço de retorno Note que o retorno deve ser programado na RSI. Ele não é automaticamente executado pelo GSI. 9 Rotinas de Serviço de Interrupção Qual é o endereço da Rotina de Serviço de Interrupção? Antes de executar os sinais de controle para o atendimento de uma interrupção, o GSI deve conhecer o endereço da RSI. Existem 3 formas de informar qual é este endereço. Mapeamento Interno à CPU Neste caso, cada linha de interrupção está associada a um endereço de memória. O programador deve instalar a RSI no endereço de interrupção associado ao pino de interrupção no qual foi conectado o dispositivo. CPU RS1 L1 L2 MEM Mapeamento RS2 10 Rotinas de Serviço de Interrupção Qual é o endereço da Rotina de Serviço de Interrupção? Antes de executar os sinais de controle para o atendimento de uma interrupção, o GSI deve conhecer o endereço da RSI. Existem 3 formas de informar qual é este endereço. Mapeamento Externo à CPU Neste caso, temos um hardware chamado “Controlador que informa ao GSI qual é o endereço da interrupção. Antes de executar o JUMP para a RSI, a CPU precisa enviado pelo controlador. CPU MEM L1 Controlador de end GSI Interrupçõe L2 s de Interrupções” ler este endereço PUSH PC PUSH PSW IN CONTRL JUMP RSI 11 Rotinas de Serviço de Interrupção Qual é o endereço da Rotina de Serviço de Interrupção? Antes de executar os sinais de controle para o atendimento de uma interrupção, o GSI deve conhecer o endereço da RSI. Existem 3 formas de informar qual é este endereço. Polling Neste caso, temos uma Rotina de Serviço que lê o status de todos os dispositivos conectados à linha de interrupção. Caso algum dispositivo tenha emitido um sinal de interrupção, acontece o desvio para RSI correspondente. RS: IN STATUS2 Jcond RS1 CPU MEM IN STATUS2 Jcond RS1 LI GSI ... IN STATUSn 12 Jcond RSn Resumindo Definição: uma interrupção nada mais é do que a quebra da sequência de operação para o atendimento de um evento interno ou externo. Atendimento: desvio a execução da CPU para uma Rotina de Serviço de Interrupção. Uma vez finalizada, as condições anteriores do processador são restauradas. Hardware: uma área dentro do controlador, o Gerador de Sinais de Interrupção (GSI), é responsável por atender a interrupção. O retorno é executado por uma instrução (RTI) ao final da RSI. Endereço: o sinal de interrupção é enviado pelo dispositivo através de uma linha de interrupção. Cada linha de interrupção tem associada a si um endereço da memória. Onde se encontram as Rotinas de Serviço de Interrupção? Possibilidade 1: Nos endereços associados às linhas de interrupção L1 → RS1 L2 → RS2 ... L3 → RS3 13 Endereços de Interrupção (1) Em posições não-contíguas de memória MEMÓRIA L1 END1 RS1 “mouse” L2 Nesta forma de organização, cada endereço associado à linha de interrupção possui um conjunto de palavras para instalação das RSIs. RS2 END2 Existe uma solução mais “teclado” – P1 elegante para instalar as RSIs? Ln SINAIS DO GSI PUSH PC PUSH PSW JUMP ENDi PC ← ENDi RS1 “mouse” RS2 RS2 ... “teclado” “teclado” VETORES DE INTERRUPÇÃO! JUMP ENDX ENDn ENDX RS2 “teclado” – P2 Invadiu a área reservada para a RSI de outra linha de interrupção! Desviar a execução para uma área livre da memória Solução? 14 Endereços de Interrupção (2) Em vetores (interrupção vetorizada) L1 END1 L2 END2 MEMÓRIA RS1 RS2 ... Ln Nesta forma de organização, os endereços associados a cada linha de interrupção estão em posições contíguas da memória... ENDn Isto implica não haver espaço para a instalação da RSI... VETOR DE INTERRUPÇÕES RS3 Desta forma, os endereços de interrupção conterão apenas os endereços das RSI apropriadas. SINAIS DO GSI PUSH PC PUSH PSW JUMP (ENDi) PC ← (ENDi) = RSIi Processadores mais modernos (por exemplo, ARM) possuem uma área da memória reservada para os endereços das RSIs. Essa área é chamada de “Vetor de Interrupções” e geralmente localiza-se no início do espaço de memória, a partir do endereço 0. A vantagem desta estratégia é que as RSIs podem ser instaladas em qualquer área livre da memória sem restrição de tamanho. 15 Endereços de Interrupção • • Em algumas circunstâncias, para que a Rotina de Serviço de Interrupção seja executada corretamente, podem ser necessárias algumas condições especiais. Por exemplo, considere o evento “reiniciar”: Ao pressionar o botão “reiniciar”, o programa corrente é interrompido e a execução é desviada para uma RSI que inicializa o Sistema Operacional. Durante esta inicialização, nenhum sinal de interrupção pode interromper a RSI. Para que nenhuma interrupção aconteça, precisamos desabilitá-las no Registrador de Estado (PSW); Uma forma de implementação é associar bits do PSW às linhas de interrupção. Se bit = 1, a linha correspondente ao bit pode interromper a execução. Se bit = 0, não pode interromper. REGISTRADOR DE ESTADO (PSW) Se, antes de executar a RSI eu coloco 001 no PSW, quem poderá interrompê-la? Apenas a Linha 1! L3 L2 L1 0 0 1 O valor colocado no registrador PSW é chamado de máscara de interrupção. Muitas vezes, é necessário passar uma máscara para o Registrador de Estado antes de iniciar a execução da RSI. 16 Como faremos isso? Endereços de Interrupção (3) Em vetores (interrupção vetorizada) com PSW (estado) L1 L2 END1 MEMÓRIA mask1 RS1 END2 mask2 Qual a diferença RS2entre a Interrupção e Subrotina? ... Li Uma forma de alterar o estado do processador, adequando-o para a execução da RSI, é enviando-lhe uma máscara de interrupção. ENDi VETOR DE INTERRUPÇÕES (com PSW) maski RSi Esta máscara pode ser alocada no Vetor de Interrupções, em uma posição antes do endereço da RSI. Qual outra forma de enviar a máscara para o PSW? SINAIS DO GSI PUSH PC PUSH PSW MOV ENDi, PSW JUMP (ENDi + 1) Através da primeira linha da RSI: PSW ← (ENDi) = pswi PC ← (ENDi + 1) = RSIi RS1: MOVE mask1, PSW ... RTI 17 Interrupções versus Subrotinas ATENDIMENTO ENDEREÇO DA ROTINA DE SERVIÇO DESVIO DA EXECUÇÃO QUEM EXECUTA O DESVIO PARA RS SUBROTINAS INTERRUPÇÃO Síncrono (programa) Assíncrono (sinal externo) Própria Instrução Salva PC Controlador ao executar CALL RETORNO AO PROGRAMA Restaura PC QUEM EXECUTA O RETORNO Controlador ao executar RTS Vetor de Interrupções Salva PC e PSW GSI Restaura PC e PSW Controlador ao executar RTI 18 Instalando RSIs • • Agora que sabemos os mecanismos de funcionamento da interrupção e onde se localizam os endereços e as rotinas de serviço, vamos analisar como se escreve um programa Assembly para implementar interrupções. Exemplo: Considere uma arquitetura na qual as linhas de interrupção L1, L2 e L3 estão associadas a um Vetor de Interrupções de endereços contíguos e sem PSW. O Vetor de Interrupções começa na posição 0 de memória e as RSIs estão, respectivamente, nas posições 300, 400 e 500. Escreva um programa que implemente estas condições. L1 END1 RS1 0 300 L2 END2 RS2 1 400 L3 END3 RS3 2 500 Antes de continuar, vamos falar mais um pouco sobre pseudo-instruções... 19 Instalando RSIs Pseudo-instruções É um tipo especial de instrução não executável, que insere valores em posições de memória, reserva espaço e organiza na memória o local de instalação das instruções. Quem lê e “executa” as pseudo-instruções é o montador ao alocar o programa Assembly na memória. Em resumo, pseudo-instruções são regras que ajudam o montador a definir o conteúdo de cada posição da memória ao instalar um programa. DS X Reserva X palavras da memória a partir da posição da pseudo-instrução. DW V Posição de memória desta pseudoinstrução recebe o valor V. ORG Y A próxima instrução é alocada na posição Y de memória. ADR rótulo Posição recebe o endereço de “rótulo”. 20 Instalando RSIs • • Agora que sabemos os mecanismos de funcionamento da interrupção e onde se localizam os endereços e as rotinas de serviço, vamos analisar como se escreve um programa Assembly para implementar interrupções. Exemplo: Considere uma arquitetura na qual as linhas de interrupção L1, L2 e L3 estão associadas a um Vetor de Interrupções de endereços contíguos e sem PSW. O Vetor de Interrupções começa na posição 0 de memória e as RSIs estão, respectivamente, nas posições 300, 400 e 500. Escreva um programa que implemente estas condições. L1 END1 RS1 0 300 L2 END2 RS2 1 400 L3 END3 RS3 2 500 Definindo o vetor de interrupções: ORG 0 ADR RS1 ou DW 300 ADR RS2 ou DW 400 ADR RS3 ou DW 500 ORG 300 Instalando as RSIs: RS1: ... RTI ORG 400 RS2: ... RTI ORG 500 RS3: ... RTI 21 Instalando RSIs Considere agora uma arquitetura na qual as linhas L1, L2 e L3 estão associadas a um vetor de interrupções de endereços contíguos e com PSW. O vetor de interrupções começa na posição 0 da memória e as RSIs estão, respectivamente, nas posições 150, 350 e 400. Cada linha pode ser interrompida pelas outras, exceto por si mesma. Os 3 bits menos significativos do PSW habilitam e desabilitam as interrupções nas linhas. Vamos, então, escrever um programa Assembly que implemente esta situação, lembrando que os sinais de controle gerados pelo GSI correspondem às operações: PUSH PC PUSH PSW MOV ENDi, PSW JUMP (ENDi + 1) 22 Instalando RSIs Solução: Definindo as máscaras: psw1: 1102 psw2: 1012 L3 L2 L1 PSW psw3: 0112 Instalando o vetor de interrupções: ORG 0 DW 110 ADR RS1 ou DW 150 DW 101 ADR RS2 ou DW 350 DW 011 ADR RS3 ou DW 400 Instalando as RSIs: ORG 150 RS1: ... ... RTI ORG 350 RS2: ... ... RTI ORG 400 RS3: ... RTI 23 Créditos Este material está baseado nas notas de aula elaboradas pelo Prof. Léo Pini e pelo aluno de doutorado Tiago Novaes. 24