You are on page 1of 39

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 as diversas estratégias para implementar


interrupções

• Aprender a instalar interrupções na memória

• Conhecer os mecanismos de interrupção do ARM


Recordando o que fizemos...
• Na última aula vimos como desviar a execução de um programa através da
chamada de subrotinas
• 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

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, sinais internos (reset) podem


interromper a execução da CPU para o atendimento dos seus eventos!
EXEMPLO
Vamos supor que você está jogando CandyCrush no seu smartphone e alguém resolve
ligar para você...

CPU MEM

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 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.
EXEMPLO
• DEFINIÇÃO:

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

Como eu informo a
CPU que um evento Cada linha de interrupção
quer interrompê-la? têm associada a ela um
dispositivo (ou conjunto
deles) que enviam o sinal
Via um sinal de de interrupção quando
interrupção desejam ser atendidos.
enviado ao GSI por
linhas de interrupção
EXEMPLO
• Vejamos agora o atendimento de uma interrupção mais detalhadamente:
SINAL DE
INTERRUPÇÃO
O que vai
acontecer?
BUSCA EXECUÇÃO

MOV R0, #100 RSI: MOV R1, (R0)+


MOV R1, (R0)+ MOV R2, (R0)+
MOV R2, (R0)+ ADD R3, R1, R2
ADD R3, R1, R2 para que tudo isto
MOV (R0), R3 ocorra, quais
MOV (R0), R3 RTI
MOV R0, #200 microoperações o
MOV R1, (R0)+ GSI deve realizar?
• Ao aparecer um sinal de interrupção:
MOV R2, (R0)+
1. Controlador termina de executar a instrução
ADD R3, R1, R2 corrente
MOV (R0), R3
2. GSI salva o estado atual da máquina, o endereço
MOV R0, #300 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.
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:

sinal de sinais de controle C.O. sinais de controle


interrupção   ...       ... 
sinal do fim da
sequência de micro-
BUSCA EXECUÇÃO comandos

D Q
PARTIDA
CLR Q sinal do fim
GERADOR DE SEQUÊNCIA da sequência
Flip-Flop DE INTERRUPÇÃO de micro-
de comandos
   ...
Interrupção
sinais de controle
GERADOR DE SINAIS DE INTERRUPÇÃO
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 PILHA!
informações?

SINAIS DE CONTROLE DO GSI

PUSH PC Pilha ← (PC) End de retorno


PUSH PSW Pilha ← (PSW) Estado corrente do processador
JUMP RSI PC ← End da RSI Desvia a execução para RSI
GERADOR DE SINAIS DE INTERRUPÇÃO
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:

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 PSW ← Estado anterior à Interrupção


POP PC PC ← Endereço de retorno

NOTE QUE O RETORNO DEVE SER PROGRAMADO NA RSI


ELE NÃO É EXECUTADO PELO GSI!
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

CPU MEM
L1 RS1
Mapeamento
L2 RS2
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

CPU MEM
L1 PUSH PC
Controlador
end PUSH PSW
de GSI
L2 Interrupções IN CONTRL
JUMP RSI
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.
RS: IN STATUS1
CPU MEM Jcond RS1
IN STATUS2
Jcond RS2
LI GSI
...
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
• 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
• 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
Possibilidade 1:
Nos endereços
Onde se encontram as associadas às linhas
Rotinas de Serviço de de interrupção
Interrupção?
L1 → RS1
L2 → RS2
...
L3 → RS3
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
(1) Em posições não contíguas de memória

MEMÓRIA
L1
END1
RS1 RS1
“mouse” “mouse”
L2 RS2
END2
“teclado” – P1
RS2 RS2
...
“teclado” “teclado”
JUMP ENDX
Ln
ENDn

Nesta forma de
organização, cada Invadiu a área
endereço SINAIS DO GSI ENDX RS2 reservada para a RSI
associado à linha
de interrupção PUSH PC “teclado” – P2 de outra linha de
possui um interrupção!
PUSH PSW Desviar a
conjunto de
palavras para
JUMP ENDi execução para
PC ← ENDi
instalação das uma área livre Solução?
RSIs. da memória
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)

MEMÓRIA
L1
END1 RS1
L2 END2 RS2 VETOR DE
... INTERRUPÇÕES
Ln RS3
ENDn

Desta forma, os SINAIS DO GSI


Nesta forma de organização,
os endereços associados à Isto implica não endereços de PUSH PC
cada linha de interrupção haver espaço para a interrupção
conterão apenas PUSH PSW
estão em posições contíguas instalação da RSI...
da memória... os endereços das JUMP (ENDi)
PC ← (ENDi) = RSIi
RSI apropriadas.

• 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
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)
- 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.
REGISTRADOR DE ESTADO (PSW) L3 L2 L1
0 0 1

A este valor que setamos no PSW


Se, antes de executar a chamamos de
RSI eu seto 001 no MÁSCARA DE INTERRUPÇÃO
PSW, quem poderá
interrompê-la? Muitas vezes faz-se necessário passar uma máscara
para o Registrador de Estado antes de iniciar a
execução da RSI.
Apenas a Linha 1! Como faremos isso?
ORGANIZAÇÃO DOS ENDEREÇOS DE INTERRUPÇÃO
(3) Em vetores (interrupção vetorizada) com PSW (estado)
MEMÓRIA
L1
END1 mask1
RS1
L2
END2 mask2
RS2 VETOR DE
... INTERRUPÇÕES
Li (com PSW)
ENDi maski
RSi
SINAIS DO GSI
Uma forma de alterar o
Esta máscara pode ser PUSH PC
estado do processador,
alocada no Vetor de
adequando-o para
Interrupções, em uma
PUSH PSW
execução da RSI, é MOV ENDi, PSW PSW ← (ENDi) = pswi
posição antes do
enviando uma máscara
do desvio
endereço da RSI. JUMP (ENDi + 1) PC ← (ENDi + 1) = RSIi

Qual outra forma de RS1: MOVE mask1, PSW


enviar a máscara para
Através da primeira
linha da RSI: ...
o PSW?
RTI
INTERRUPÇÃO
Diferença entre
X SUBROTINAS
Interrupção e
Subrotina?
ATENDIMENTO Síncrono Assíncrono
(programa) INTERRUPÇÃO
(sinal externo)

END DA Vetor de
Própria Instrução
ROTINA DE SERVIÇO Interrupções

DESVIO DA
Salva PC Salva PC e PSW
EXECUÇÃO

QUEM EXECUTA O Controlador ao


GSI
DESVIO PARA RS executar CALL

RETORNO AO Restaura PC Restaura PC e PSW


PROGRAMA

QUEM EXECUTA O Controlador ao Controlador ao


RETORNO executar RTS executar RTI
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 0
END1 RS1 300
L2 RS2 1 400
END2
L3 END3 RS3 2 500

Antes de continuar, vamos falar mais um


pouco sobre pseudo-instruções...
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 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
• 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 0
END1 RS1 300
L2 RS2 1 400
END2
L3 END3 RS3 2 500
Instalando as RSIs: ORG 300
Instalando o VI: RS1: ...
...
ORG 0 RTI
ADR RS1 ou DW 300 ORG 400
ADR RS2 ou DW 400 RS2: ...
ADR RS3 ou DW 500 ...
RTI
ORG 400
RS2: ...
...
RTI
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
MOV ENDi, PSW
JUMP (ENDi + 1)
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
MOV ENDi, PSW
JUMP (ENDi + 1)

psw1: 1102 L3 L2 L1
Definindo as máscaras: psw2: 1012 PSW
psw3: 0112
Instalando o VI: Instalando as RSIs: ORG 150
ORG 0 RS1: ...
DW 110 ...
ADR RS1 ou DW 150 RTI
DW 101 ORG 350
ADR RS2 ou DW 350 RS2: ...
DW 011 ...
ADR RS1 ou DW 400 RTI
ORG 400
RS2: ...
...
RTI
QUESTÕES ADICIONAIS

. PRIORIDADE POR NÍVEL

. PRIORIZAR ATENDIMENTO DE INTERRUPÇÕES SIMULTÂNEAS


. Fixa
. por Varredura

. EXCEÇÕES INTERNAS

. EXCEÇÕES PROGRAMADAS
Interrupção
Interrupções são uma sub-classe das
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
Exceções Estado do processador antes da
exceção é sempre preservado
Pode ocorrer mais do que uma exceção
ao mesmo tempo (atendimento
prioritário)
ARM possui 7 tipos de exceções. Cada
uma relacionada a um modo de operação
Quais eventos são capazes de gerar uma exceção?

Pino de Reset do processador ativado


Instrução de transferência de dados à
memória tentou acesso a um endereço
inválido (Data Abort)
Pino de Interrupção rápida (FIQ) foi ativado
Eventos
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)
Executar uma interrupção de software (SWI)

Processador não reconhece instrução corrente


(Undefined Instruction)
Exceções

Prioridade de Atendimento

Prioridade Exceção

1 (máxima) Reset
2 Data Abort
3 FIQ
4 IRQ
5 Prefetch Abort
6 SWI
6 UI
Exceções

Atendimento

Programa Principal

3
1 Rotina de Exceção

2
Vetor de Endereço
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
Vetor de Interrupção

Vetor
• Contém os endereços das Exceções End de Int.#
0x40 + 4*N Int Ext. N 16 + N
• Permite até 496 interrupções externas … … …
- Implementação definida pelo usuário
0x40 Int Ext. 0 16
• Vetor pode ser realocado caso seja …
necessário 0x1C FIQ 7-10
- Usar um registrador offset para isso
0x18 IRQ 6
• Cada exceção possui um número 0x14 RESERVED 5
correspondente para ser feito o 0x10 Data Abort 4
mapeamento
• - Valor usado pelo Registrador de Estado 0x0C Prefetch Abort 3
e Controlador de Interrupções 0x08 SWI 2
0x04 UI 1
0x00 Reset N/A
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)

INTNMI • Prioridade programada


INTISR[0] NVIC pelo usuário

Cortex-Mx
INTISR[N] Processor Core • Suporta até 496
interrupções
• Suporta uma interrupção
Cortex-Mx Integration Layer não-mascarada
Interrupções

• Podem ser habilitadas ou desabilitadas através do Registrador de


Estado

Exemplo: Atendimento prioritário


Higher Priority

IRQ1

IRQ2

IRQ3

Base CPU
Time

Core Execution Foreground ISR2 ISR1 ISR2 ISR3 Foreground


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
EXERCÍCIOS
INTERRUPÇÃO COM VETOR DE INTERRUPÇÃO SEM
MASCARAMENTO

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: PUSH PC
PUSH PSW
JUMP (ENDi )
INTERRUPÇÃO POR NÍVEL
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:
PUSH PC
PUSH PSW
JUMP (ENDi )

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.

You might also like