ea869leopini/disciplinas/ea869/2018-1/... · 2018-05-03 · gerador de sinais de interrupÇÃo •...
TRANSCRIPT
EA869 INTRODUÇÃO A SISTEMAS DE COMPUTAÇÃO DIGITAL
2S2017
PED Tiago Novaes Angelo
INTERRUPÇÃO
Aulas 17 , 18 e 19
Objetivos
• Definir o conceito de interrupção
• Diferenciar Interrupção de Subrotinas
• Conhecer os mecanismos de interrupção do ARM
• Conhecer as diversas estratégias para implementar interrupções
• Aprender a instalar interrupções na memória
Recordando o que fizemos... • Na última aula vimos como desviar a execução de um programa através da
chamada de subrotinas
Quais condições podem acarretar a interrupção da
execução de um programa?
• Esta técnica é de especial importância para escrita de códigos otimizados, uma vez que permite eliminar redundâncias, reutilizar o mesmo código para diferentes entradas de dados e decompor problemas grandes em pequenas partes (modularizar)
• Porém, nem sempre a interrupção de um programa acontece de forma programada como é no caso da chamada de subrotinas
Mouse, teclado, sensores, telas touchscreen, sinais internos (reset) podem interromper a execução da CPU para o atendimento dos seus eventos!
Atendimento de eventos externos e internos!
Controlador
EXEMPLO Vamos supor que você está jogando CandyCrush no seu smartphone e alguém resolve ligar para você...
CPU MEM
PROG
GSI
• Gerador de Sequência de interrupção: é o hardware dentro do controlador que irá receber o sinal de interrupção, interromper a execução da instrução e desviar a execução do programa para a ROTINA DE SERVIÇO DE INTERRUPÇÃO (RSI), a qual atenderá o evento que gerou interrupção.
RSI
EXEMPLO
INTERRUPÇÃO
É a quebra da sequência de operação de forma a atender eventos especiais, tais como:
- Entrada de dados atendendo a solicitação de periféricos - Atendimento de sinal de sensor - Sinais internos
• DEFINIÇÃO:
Como eu informo a CPU que um evento quer interrompê-la?
Via um sinal de interrupção
enviado ao GSI por linhas de interrupção
Cada linha de interrupção têm associada a ela um dispositivo (ou conjunto
deles) que enviam o sinal de interrupção quando desejam ser atendidos.
EXEMPLO • Vejamos agora o atendimento de uma interrupção mais detalhadamente:
MOV R0, #200
MOV R0, #100
MOV R0, #300
MOV (R0), R3
MOV R1, (R0)+
MOV R2, (R0)+ ADD R3, R1, R2
MOV R1, (R0)+
MOV R2, (R0)+ ADD R3, R1, R2
MOV (R0), R3
MOV (R0), R3 RTI
RSI: MOV R1, (R0)+ MOV R2, (R0)+ ADD R3, R1, R2
BUSCA EXECUÇÃO
SINAL DE INTERRUPÇÃO
• 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, o endereço de retorno e desvia 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 retorna a execução do programa principal.
O que vai acontecer?
para que tudo isto ocorra, quais
microoperações o GSI deve realizar?
GERADOR DE SINAIS DE INTERRUPÇÃO
• O QUE É? É um dispositivo do controlador que, ao receber um sinal de interrupção, salva o estado atual do processador (Registrador de Estado ou PSW), o endereço de retorno e desvia a execução do programa para Rotina de Serviço de Interrupção (RSI).
• ARQUITETURA:
D Q
CLR Q
EXECUÇÃO BUSCA
GERADOR DE SEQUÊNCIA
DE INTERRUPÇÃO
PARTIDA
... ...
...
sinais de controle sinais de controle
sinal do fim da
sequência de micro-
comandos
sinal do fim
da sequência
de micro-
comandos
C.O. sinal de
interrupção
Flip-Flop
de
Interrupção sinais de controle
ATENDIMENTO DE UMA INTERRUPÇÃO
• Relembrando os passos para o atendimento de uma interrupção:
1. Armazenar o conteúdo do PC para posterior retorno à execução interrompida (Endereço de retorno);
2. Armazenar o estado corrente do processador, para restaurar, no retorno, a situação no momento à interrupção; 3. Desviar o controle de execução para Rotina de Serviço de Interrupção;
Onde iremos armazenas essas
informações? PILHA!
SINAIS DE CONTROLE DO GSI
PUSH PC PUSH PSW JUMP RSI
Pilha ← (PC) Pilha ← (PSW) PC ← End da RSI
End de retorno
Estado corrente do processador
GERADOR DE SINAIS DE INTERRUPÇÃO
Desvia a execução para RSI
RETORNO DA INTERRUPÇÃO
• Semelhante ao retorno da subrotina, o retorno da interrupção se dá por uma instrução ao final da Rotina de Serviço de Interrupção:
POP PSW
POP PC
PSW ← Estado anterior à Interrupção
PC ← Endereço de retorno
MOV (R0), R3 RTI
RS1: MOV R1, (R0)+ MOV R2, (R0)+ ADD R3, R1, R2
Quais operações a instrução RTI deve executar?
NOTE QUE O RETORNO DEVE SER PROGRAMADO NA RSI ELE NÃO É EXECUTADO PELO GSI!
GERADOR DE SINAIS DE INTERRUPÇÃO
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 um sinal de interrupção, o GSI deve conhecer qual o endereço da RSI
• Existem 3 formas de informar o GSI 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 onde foi ligado o dispositivo
L1
Mapeamento
RS1 MEM
L2 RS2
CPU
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 um sinal de interrupção, o GSI deve conhecer qual o endereço da RSI
• Existem 3 formas de informar o GSI qual é este endereço
Mapeamento Externo à CPU
• Neste caso, temos um hardware chamado “Controlador de Interrupções” que informa ao GSI qual é o endereço da interrupção;
• Porém, antes de executar o JUMP para a RS, a CPU precisa ler este endereço enviado pelo controlador
L1 end
MEM
L2
CPU
Controlador de
Interrupções GSI
PUSH PC PUSH PSW
JUMP RSI
IN CONTRL
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 um sinal de interrupção, o GSI deve conhecer qual o endereço da RSI
• Existem 3 formas de informar o GSI 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.
LI
MEM CPU
GSI
RS: IN STATUS1 Jcond RS1 IN STATUS2 Jcond RS2 ... IN STATUSn Jcond RSn
INTERRUPÇÃO • Resumindo o que vimos até agora...
• 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: O atendimento da interrupção desvia a execução da CPU para uma Rotina de Serviço de Interrupção. Uma vez finalizado, as condições anteriores do processador são restauradas
• 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
• Hardware: Uma área dentro do controlador, o Gerador de Sinais de Interrupção, é responsável por atender a interrupção. O retorno é executado por uma instrução (RTI) ao final da RSI
Onde se encontram as Rotinas de Serviço de
Interrupção?
Possibilidade 1:
Nos endereços associadas às linhas
de interrupção
L1 → RS1
L2 → RS2
L3 → RS3 ...
(1) Em posições não contíguas de memória
L1 END1
L2 END2
Ln ENDn
RS1 “mouse”
MEMÓRIA
RS1 “mouse”
RS2 “teclado”
RS2 “teclado”
Invadiu a área reservada para a RSI
de outra linha de interrupção!
Solução?
Desviar a execução para uma área livre da memória
ENDX RS2 “teclado” – P2
RS2 “teclado” – P1
...
JUMP ENDX
Nesta forma de organização, cada
endereço associado à linha
de interrupção possui um
conjunto de palavras para instalação das
RSIs.
SINAIS DO GSI
PUSH PC PUSH PSW JUMP ENDi
PC ← ENDi
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
Existe uma solução mais “elegante” para instalar as RSIs?
VETORES DE INTERRUPÇÃO!
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
(2) Em vetores (interrupção vetorizada)
L1 END1
L2 END2
Ln ENDn
MEMÓRIA
Nesta forma de organização, os endereços associados à cada linha de interrupção
estão em posições contíguas da memória...
...
Desta forma, os endereços de interrupção
conterão apenas os endereços das RSI apropriadas.
RS1
RS2
RS3
• 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
Isto implica não haver espaço para a instalação da RSI...
SINAIS DO GSI
PUSH PC PUSH PSW JUMP (ENDi)
PC ← (ENDi) = RSIi
VETOR DE INTERRUPÇÕES
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
ORGANIZAÇÃO DOS 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, 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)
REGISTRADOR DE ESTADO (PSW)
- Uma forma de implementação é associar bits do PSW à linhas de interrupção. Se bit = 1, a linha correspondente ao bit pode interromper a execução. Se bit = 0, não pode interromper.
L1 L2 L3
Se, antes de executar a RSI eu seto 001 no PSW, quem poderá
interrompê-la?
0 0 1
A este valor que setamos no PSW chamamos de
MÁSCARA DE INTERRUPÇÃO
Apenas a Linha 1!
Muitas vezes faz-se necessário passar uma máscara para o Registrador de Estado antes de iniciar a
execução da RSI.
Como faremos isso?
(3) Em vetores (interrupção vetorizada) com PSW (estado)
L1 END1
L2 END2
Li ENDi
MEMÓRIA
Uma forma de alterar o estado do processador,
adequando-o para execução da RSI, é
enviando uma máscara do desvio
PUSH PC PUSH PSW
JUMP (ENDi + 1)
PSW ← (ENDi) = pswi
...
Esta máscara pode ser alocada no Vetor de
Interrupções, em uma posição antes do endereço da RSI.
mask1
RS1
RS2
mask2
maski
RSi
MOV ENDi, PSW PC ← (ENDi + 1) = RSIi
Qual outra forma de enviar a máscara para
o PSW?
VETOR DE INTERRUPÇÕES
(com PSW)
Através da primeira linha da RSI:
RS1: MOVE mask1, PSW ...
RTI
SINAIS DO GSI
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
INTERRUPÇÃO X SUBROTINAS
INTERRUPÇÃO ATENDIMENTO Síncrono
(programa) Assíncrono
(sinal externo)
END DA ROTINA DE SERVIÇO
Própria Instrução Vetor de
Interrupções
DESVIO DA EXECUÇÃO
Salva PC e PSW Salva PC
Restaura PC e PSW Restaura PC RETORNO AO PROGRAMA
QUEM EXECUTA O DESVIO PARA RS
Controlador ao executar CALL
GSI
QUEM EXECUTA O RETORNO
Controlador ao executar RTS
Controlador ao executar RTI
Diferença entre Interrupção e
Subrotina?
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 aprender como se escreve um programa Assembly para implementar interrupções. Vamos começar com um exemplo prático:
Seja uma arquitetura onde 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
L2 END2
L3 END3
RS1
RS2
RS3
0
1
2
300
400
500
Antes de continuar, vamos falar mais um pouco sobre pseudo-instruções...
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 pseudo-instruçã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”
INSTALANDO RSIs
Instalando o VI:
ORG 0 ADR RS1 ou DW 300
Instalando as RSIs:
ADR RS2 ADR RS3
ou DW 400 ou DW 500
ORG 300 RS1: ...
... RTI ORG 400
RS2: ... ... RTI ORG 400
RS2: ... ... RTI
• Agora que sabemos os mecanismos de funcionamento da interrupção e onde se localizam os endereços e as rotinas de serviço, vamos aprender como se escreve um programa Assembly para implementar interrupções. Vamos começar com um exemplo prático:
Seja uma arquitetura onde 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
L2 END2
L3 END3
RS1
RS2
RS3
0
1
2
300
400
500
INSTALANDO RSIs
Seja agora uma arquitetura onde as linhas L1, L2 e L3 estão associadas a um Vetor de Interrupções de endereços contíguos e com PSW. O V.I. começa na posição 0 de memória e as RSIs estão, respectivamente, nas posições 150, 350 e 400. Cada linha pode ser interrompida pelas outras, menos por si mesma e os 3 bits menos significativos do PSW habilitam e desabilitam as interrupções nas linhas. Escreva um programa Assembly que implemente esta situação, lembrando que os sinais de controle gerados pelo GSI são: PUSH PC
PUSH PSW
JUMP (ENDi + 1)
MOV ENDi, PSW
INSTALANDO RSIs
Seja agora uma arquitetura onde as linhas L1, L2 e L3 estão associadas a um Vetor de Interrupções de endereços contíguos e com PSW. O V.I. começa na posição 0 de memória e as RSIs estão, respectivamente, nas posições 150, 350 e 400. Cada linha pode ser interrompida pelas outras, menos por si mesma e os 3 bits menos significativos do PSW habilitam e desabilitam as interrupções nas linhas. Escreva um programa Assembly que implemente esta situação, lembrando que os sinais de controle gerados pelo GSI são:
Instalando o VI:
ORG 0
ADR RS1 ou DW 150
Instalando as RSIs: ORG 150 RS1: ...
... RTI ORG 350
RS2: ... ... RTI ORG 400
RS2: ... ... RTI
Definindo as máscaras:
psw1: PSW
L3 L2 L1
psw2:
psw3:
1102
1012
0112
DW 110
ADR RS2 ou DW 350 DW 101
ADR RS1 ou DW 400 DW 011
PUSH PC
PUSH PSW
JUMP (ENDi + 1)
MOV ENDi, PSW
INSTALANDO RSIs
. PRIORIDADE POR NÍVEL . PRIORIZAR ATENDIMENTO DE INTERRUPÇÕES SIMULTÂNEAS . Fixa . por Varredura . EXCEÇÕES INTERNAS . EXCEÇÕES PROGRAMADAS
QUESTÕES ADICIONAIS
Interrupções são uma sub-classe das EXCEÇÕES
Exceções
Exceções ocorrem quando o fluxo normal de um programa precisa ser temporariamente interrompido.
São geradas por fontes internas ou externas ao programa em execução
Estado do processador antes da exceção é sempre preservado
ARM possui 7 tipos de exceções. Cada uma relacionada a um modo de operação
Pode ocorrer mais do que uma exceção ao mesmo tempo (atendimento prioritário)
Eventos
Pino de Reset do processador ativado
Pino de Interrupção rápida (FIQ) foi ativado
Pino de Interrupções (IRQ) foi ativado
Executar um Breakpoint
Executar uma instrução em um endereço de memória inválido (prefetch abort)
Instrução de transferência de dados à memória tentou acesso a um endereço inválido (Data Abort)
Executar uma interrupção de software (SWI)
Processador não reconhece instrução corrente (Undefined Instruction)
Quais eventos são capazes de gerar uma exceção?
Prioridade de Atendimento
Exceções
Prioridade Exceção
1 (máxima) Reset
2 Data Abort
3 FIQ
4 IRQ
5 Prefetch Abort
6 SWI
6 UI
Atendimento da Exceção
1. Ao receber uma exceção, o processador termina de executar a instrução atual, interrompe o programa e muda o modo de operação para o modo correspondente ao evento.
2. O estado da máquina e alguns registradores são colocados na pilha • 8 registradores são salvos: PC, R0-R3, R12, LR e SPSR
3. Endereço da exceção é buscado no Vetor de Interrupção
4. Registrador LR recebe o endereço de retorno
5. Primeira instrução da Rotina de Exceção é executada • SPSR recebe a máscara de Interrupção (Ver slide 386) • Instruções especiais (MRS/MSR) para definir campos específicos do SPSR
6. Rotina de Exceção é executada
7. Retorno da Exceção é realizado pela instrução MOVS PC, LR (“equivalente” ao RTI)
8. Estado anterior à execução e os 8 registradores são recuperados da pilha
IRQ
Data Abort
Prefetch Abort
SWI
UI
Reset
0x1C
0x18
0x14
0x10
0x0C
0x08
0x04
0x00
16 + N
…
16
FIQ
Int Ext. 0
RESERVED
…
Int Ext. N 0x40 + 4*N
…
0x40
7-10
6
5
4
3
2
1
N/A
End
Vetor de Int.#
…
Vetor de Interrupção
• Permite até 496 interrupções externas - Implementação definida pelo usuário
• Contém os endereços das Exceções
• Vetor pode ser realocado caso seja necessário
- Usar um registrador offset para isso
• Cada exceção possui um número correspondente para ser feito o mapeamento
• - Valor usado pelo Registrador de Estado e Controlador de Interrupções
Interrupções Externas
• São atendidas através de duas linhas de interrupção: FIQ e IRQ
• São controladas por um Controlador Externo de Interrupções (Nested Vectored Interrupt Controller - NVIC)
…
Cortex-Mx Processor Core
INTISR[0] … INTISR[N]
INTNMI
NVIC
Cortex-Mx Integration Layer
• Prioridade programada pelo usuário
• Suporta até 496 interrupções
• Suporta uma interrupção não-mascarada
Interrupções
• Podem ser habilitadas ou desabilitadas através do Registrador de Estado
Core Execution
Higher Priority
Base CPU
IRQ2
IRQ1
Foreground ISR2 ISR1 ISR2 Foreground
Time
IRQ3
ISR3
Exemplo: Atendimento prioritário
Interrupções de Software
• “Exceções Programadas”
• Instruções que equivalem ao atendimento de um sinal de interrupção
• Reproduzem operações de I/O
• #ArmSim: Exemplo - LEDs
CONCLUSÕES • Interrupção é a quebra da sequência de operação de forma a atender eventos
especiais (entrada de dados atendendo solicitações de periféricos, sinal de sensor, sinais internos, etc
• O GSI (Gerador de Sinais de Interrupção) é o hardware responsável por atender as solicitações de interrupção e desviar a execução do programa para a Rotina de Serviço de Interrupção (RSI)
• Ao desviar a execução do programa, o GSI armazena o endereço de retorno (PC) e o estado atual (PSW) do processador. Ao retornar, restaura estas condições
• Em geral, os endereços das RSI ficam armazenados em um Vetor de Interrupções
• As vezes faz-se necessário estabelecer um novo estado (PSW) para o processador enquanto ele executa a RSI com o objetivo de controlar quem pode interromper essa rotina
• Este novo PSW pode estar no próprio Vetor de Interrupções ou na primeira linha da RSI
• Por fim, o projeto das interrupções é um compromisso entre o hardware e o programador, já que este é quem escreverá os programas de instalação das Interrupções
INTERRUPÇÃO COM VETOR DE INTERRUPÇÃO SEM MASCARAMENTO
PUSH PC
PUSH PSW
JUMP (ENDi )
Seja uma arquitetura onde as linhas L1, L2 e L3 estão associadas a um
Vetor de Interrupções de endereços contíguos. O V.I. começa na
posição 0 de memória e as RSIs estão, respectivamente, nas posições
100, 300 e 400. Cada linha pode ser interrompida apenas por si mesma
e os 3 bits menos significativos do PSW habilitam e desabilitam as
interrupções nas linhas.
Escreva um programa Assembly que implemente esta situação, sendo os
sinais de controle gerados pelo GSI:
INTERRUPÇÃO POR NÍVEL
PUSH PC
PUSH PSW
JUMP (ENDi )
Seja uma arquitetura com três linhas de interrupção. O programa
principal está armazenado na posição 1000 de memória. As rotinas de
serviço, nas posições 100, 200 e 300. Cada rotina de serviço poderá ser
interrompida pelas outras linhas mas não pela própria linha. A arquitetura
usa máscara de interrupção nos bits menos significativos da PSW.
Suponha que os endereços dos vetores de interrupção sejam 1, 10 e 20
e que o GSI gere os seguinte sinais de controle:
a) Seria possível implementar o funcionamento proposto em uma
arquitetura de mascaramento por nível?
b) Caso seja possível, qual condição necessita.