Interrupções Interrupções por hardware

Propaganda
Interrupções
• Existem interrupções por software e por hardware,
embora as que nos interessem mais neste
contexto sejam as interrupções por hardware
• As interrupções por software são instruções que
causam a chamada à respectiva rotina de
atendimento (e.g. RST 00…38hH no Z80)
– As interrupções por software são eventos síncronos
– Na família 51 não existem
interrupções deste tipo
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 1
Interrupções por hardware
• São despoletadas por eventos assíncronos
relativamente à execução do programa (quando
carregamos numa tecla que gera um pedido de
interrupção, não sabemos que instrução está a
ser executada)
• É o que sucede com as interrupções geradas por
um periférico de comunicação série, quando
pretende informar o CPU de que chegou um novo
carácter
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 2
Event driven applications
• Esta designação aplica-se nos casos em que não
existe acção enquanto não ocorrer um evento que
a determine
• São comuns nos embedded real-time systems
• Um sistema diz-se em tempo real quando é capaz
de responder e processar um evento num
intervalo de tempo pré-determinado
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 3
Latência das interrupções
• Esta latência corresponde ao intervalo de tempo
que decorre entre o pedido de interrupção e o
início ao seu atendimento – depende de vários
factores:
– Arquitectura do CPU (e.g. quando é que o CPU vê se
existem pedidos pendentes e dá início ao atendimento)
– Existirem ou não sequências de código que não
admitem o atendimento de interrupções
– Existência de interrupções de prioridade superior
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 4
Exemplo (não se refere à
família 51)
Nota: Este exemplo corresponde
a um sistema de interrupções
vectorizadas (o endereço de
atendimento é fornecido pelo
controlador de interrupções)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 5
Atendimento das
interrupções
• A maioria dos CPU verifica se existem pedidos de
interrupção pendentes quando termina a
execução de cada instrução
• Quando as interrupções estão habilitadas, o CPU
guarda o endereço da próxima instrução na stack
e carrega o PC com o endereço da rotina de
atendimento (ISR, interrupt service routine)
• Na família 51 estes endereços estão pré-definidos
(serão apresentados adiante)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 6
Segmentos críticos
• Neste exemplo, a sequência de instruções 1 a 4
não pode ser interrompida sem corrermos o risco
de funcionamento incorrecto
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 7
Prioridade das interrupções
• É possível atender múltiplas interrupções em
simultâneo (i.e. uma interrupção pode interromper
outra interrupção)
• O aninhamento (nesting) de interrupções requer a
existência de prioridades, que podem ser:
– Multi-nível (prioridades fixas)
– Multi-nível (prioridades dinâmicas)
– Nível único
Nota: Neste caso será possível
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 8
que uma interrupção interrompa
outra? E será possível atender
umas e ignorar outras? (máscaras)
Interrupções activas ao
nível
• Uma interrupção activa ao nível só é reconhecida
se o pino estiver no nível activo quando o CPU
verifica a existência de pedidos pendentes
– Podem perder-se os pedidos que deixem de estar
activos antes da verificação ser efectuada
– Também podem ocorrer múltiplos atendimentos
enquanto o pino continuar no nível lógico activo
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 9
Interrupções activas à
transição
• Nas interrupções activas à transição o pedido é
registado, o que elimina os problemas anteriores
• As interrupções deste tipo
são preferíveis quando os
pedidos são muito longos
ou muito curtos
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 10
Interrupções não
vectorizadas
• Quando o endereço da rotina de atendimento é
comum a mais do que uma fonte de interrupção, é
necessário determinar a sua origem
• Esta situação é frequente nas interrupções
geradas pelos periféricos de comunicação série
(nas interrupções por envio ou recepção)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 11
As interrupções na
família 51
/INT0
0
1
IT0
IE0
TF0
/INT1
0
1
IT1
TF1
TI
RI
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 12
IE1
Fontes de
interrupção
IE0 e IE1 são flags de interrupção
que pertencem ao registo TCON
(SFR com endereço 88H)
Gestão das interrupções
• O código executado pelo microcontrolador pode
activar / desactivar (set / clear) todas as flags de
interrupção
• Cada fonte de interrupção pode ser habilitada /
inibida individualmente (registo IE nos SFR)
• A cada fonte de interrupção pode ser atribuída
uma prioridade alta ou baixa (registo IP nos SFR)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 13
/INT0
0
1
Interrupções externas
IT0
IE0
TF0
/INT1
0
1
IT1
TF1
TI
RI
• /INT0 e /INT1 podem ser activos ao nível (0) ou à
transição (↓), de acordo com o conteúdo do
registo TCON (SFR com endereço 88H)
• Se as interrupções forem activas à transição, as
flags que as geram são limpas pelo hardware
quando a respectiva rotina é executada (caso
contrário, terá que ser o código do utilizador a
fazê-lo)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 14
IE1
/INT0
Interrupções dos T/C
0
1
IT0
IE0
TF0
/INT1
0
1
IT1
IE1
TF1
TI
RI
• As interrupções pedidas pelos temporizadores /
contadores são geradas por TF0 e TF1 e
activadas por rollover nos respectivos registos
(excepto T/C 0 em modo 3, como se verá mais
tarde)
• Quando é gerada uma interrupção proveniente
dos T/C, a flag que a gerou é limpa pelo hardware
quando a rotina de atendimento é executada
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 15
Interrupções da
comunicação série
/INT0
0
1
IT0
TF0
/INT1
0
1
IT1
TF1
TI
RI
• Os pedidos de interrupção do periférico de
comunicação série resultam do OR entre as flags
RI (recepção) e TI (transmissão)
• Nenhuma destas flags é limpa pelo hardware
quando a respectiva rotina é executada (o código
da rotina tem primeiro que identificar a causa da
interrupção e depois limpar a flag)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 16
IE0
IE1
O registo IE (end. SFR A8H)
– endereçável ao bit
• Este registo permite-nos habilitar / inibir cada
fonte de interrupção:
IE.7 IE.6 IE.5 IE.4 IE.3 IE.2 IE.1 IE.0
EA
-
-
ES
ET1 EX1 ET0 EX0
– EA inibe todas as interrupções se estiver em 0; se
estiver em 1, estarão habilitadas as que tiverem o bit
IE.x em 1
– ES: periférico série; ET1 e ET0: T/C 1 e 0; EX1 e EX0:
externas (pinos /INT1 e /INT0)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 17
O registo IP (end. SFR B8H)
– endereçável ao bit
• Este registo permite-nos atribuir a cada fonte de
interrupção uma prioridade alta ou baixa:
IP.7 IP.6 IP.5 IP.4 IP.3 IP.2 IP.1 IP.0
-
-
-
PS
PT1 PX1 PT0 PX0
– Uma fonte de interrupção terá prioridade alta quando o
bit IP.x estiver em 1 e baixa quando estiver em 0
– PS: periférico série; PT1 e PT0: T/C 1 e 0; PX1 e PX0:
externas (pinos /INT1 e /INT0)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 18
O registo TCON (end. SFR
88H) – endereçável ao bit
• Para além de controlar os T/C, este registo está
também relacionado com as interrupções
externas:
TC.7 TC.6 TC.5 TC.4 TC.3 TC.2 TC.1 TC.0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
– IEx: O hardware activa (set) esta flag à transição
descendente em /INTx e limpa-a (clear) quando a
respectiva rotina de atendimento é executada
– ITx: Se estiver em 1 a interrupção em /INTx é activa à
transição descendente; se não, é activa ao nível 0.
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 19
Atendimento das
interrupções
• Ao atender uma interrupção, o hardware do
80C51 determina a execução de uma instrução
LCALL para a respectiva rotina de atendimento:
– Endereços de atendimento: IE0 - 0003H; TF0 - 000BH;
IE1 - 0013H; TF1 - 001BH; RI ou TI - 0023H
– LCALL força o PC na stack, mas quaisquer outros
registos (e.g. ACC, PSW, ...) terão que ser guardados
pelo código do utilizador
– A flag associada à interrupção é limpa pelo hardware
nuns casos, mas noutros terá que o código a fazê-lo
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 20
Retorno das interrupções
• A execução da rotina de atendimento continua até
que seja encontrada uma instrução RETI (return
from interrupt):
– RETI informa o processador que terminou o
atendimento à interrupção e extrai da stack o endereço
de retorno
– RET (retorno de subrotina) faria algo semelhante, mas
manter-se-ia a indicação de estar em curso o
atendimento a uma interrupção (qual é o problema?)
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 21
Exemplo (KEIL):
Interrupções via /INT0
; código para ilustrar o atendimento de interrupções
; externas em /INT0, activas à transição
cseg
at
0
salta:
jmp
inicio
; uma vez que 0003H tem que conter o código de atendimento
; a /INT0, em 0000 cabe apenas uma instrução de salto
cseg
at
0003h
intext0:
inc
r1
reti
; o atendimento a /INT0 apenas incrementa o R1, pelo que o
; seu conteúdo nos diz quantas interrupções foram atendidas
cseg
at
0010h
inicio:
mov
r1,#0
mov
tcon,#01
mov
ie,#81h
; programa o funcionamento das interrupções via /INT0
ciclo:
mov
a,p0
add
a,p1
mov
p2,a
jmp
ciclo
; está sempre a colocar em P2 o valor de P1+P0
end
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 22
Int. via /INT0: Visualização
no dScope
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 23
Trabalho do dado (Stop via
/INT0)
• Que alterações são necessárias para implementar
o botão de Stop através de /INT0? (para libertar a
tecla que era usada
para este efeito)
Como deve ser feita a
inicialização? Que
tarefas deverão ser
realizadas pela rotina
de atendimento?
EEC2104 – Microprocessadores - FEUP / DEEC / JMF - 24
Download