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 38hH no Z8) As interrupções por software são eventos síncronos Na família 5 não existem interrupções deste tipo EEC24 Microprocessadores - FEUP / DEEC / JMF - 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 EEC24 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 EEC24 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 EEC24 Microprocessadores - FEUP / DEEC / JMF - 4
Exemplo (não se refere à família 5) Nota: Este exemplo corresponde a um sistema de interrupções vectorizadas (o endereço de atendimento é fornecido pelo controlador de interrupções) EEC24 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 5 estes endereços estão pré-definidos (serão apresentados adiante) EEC24 Microprocessadores - FEUP / DEEC / JMF - 6
Segmentos críticos Neste exemplo, a sequência de instruções a 4 não pode ser interrompida sem corrermos o risco de funcionamento incorrecto EEC24 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 que uma interrupção interrompa outra? E será possível atender EEC24 Microprocessadores - FEUP / DEEC / JMF - 8 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 EEC24 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 EEC24 Microprocessadores - FEUP / DEEC / JMF -
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) EEC24 Microprocessadores - FEUP / DEEC / JMF - As interrupções na família 5 /INT IT IE TF /INT TF IT IE Fontes de interrupção IE e IE são flags de interrupção que pertencem ao registo TCON (SFR com endereço 88H) TI RI EEC24 Microprocessadores - FEUP / DEEC / JMF - 2
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) EEC24 Microprocessadores - FEUP / DEEC / JMF - 3 /INT IT IE Interrupções externas/int TF IT IE TF /INT e /INT podem ser activos ao nível () 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) TI RI EEC24 Microprocessadores - FEUP / DEEC / JMF - 4
/INT IT IE Interrupções dos T/C TF /INT IT IE TF As interrupções pedidas pelos temporizadores / contadores são geradas por TF e TF e activadas por rollover nos respectivos registos (excepto T/C 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 TI RI EEC24 Microprocessadores - FEUP / DEEC / JMF - 5 Interrupções da comunicação série /INT TF /INT IT IT IE IE TF 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) TI RI EEC24 Microprocessadores - FEUP / DEEC / JMF - 6
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. IE. EA - - ES ET EX ET EX EA inibe todas as interrupções se estiver em ; se estiver em, estarão habilitadas as que tiverem o bit IE.x em ES: periférico série; ET e ET: T/C e ; EX e EX: externas (pinos /INT e /INT) EEC24 Microprocessadores - FEUP / DEEC / JMF - 7 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. IP. - - - PS PT PX PT PX Uma fonte de interrupção terá prioridade alta quando o bit IP.x estiver em e baixa quando estiver em PS: periférico série; PT e PT: T/C e ; PX e PX: externas (pinos /INT e /INT) EEC24 Microprocessadores - FEUP / DEEC / JMF - 8
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. TC. TF TR TF TR IE IT IE IT 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 a interrupção em /INTx é activa à transição descendente; se não, é activa ao nível. EEC24 Microprocessadores - FEUP / DEEC / JMF - 9 Atendimento das interrupções Ao atender uma interrupção, o hardware do 8C5 determina a execução de uma instrução LCALL para a respectiva rotina de atendimento: Endereços de atendimento: IE - 3H; TF - BH; IE - 3H; TF - BH; RI ou TI - 23H 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 EEC24 Microprocessadores - FEUP / DEEC / JMF - 2
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?) EEC24 Microprocessadores - FEUP / DEEC / JMF - 2 Exemplo (KEIL): Interrupções via /INT ; código para ilustrar o atendimento de interrupções ; externas em /INT, activas à transição cseg at salta: jmp inicio ; uma vez que 3H tem que conter o código de atendimento ; a /INT, em cabe apenas uma instrução de salto cseg at 3h intext: inc r reti ; o atendimento a /INT apenas incrementa o R, pelo que o ; seu conteúdo nos diz quantas interrupções foram atendidas cseg at h inicio: mov r,# mov tcon,# mov ie,#8h ; programa o funcionamento das interrupções via /INT ciclo: mov a,p add a,p mov p2,a jmp ciclo ; está sempre a colocar em P2 o valor de P+P end EEC24 Microprocessadores - FEUP / DEEC / JMF - 22
Int. via /INT: Visualização no dscope EEC24 Microprocessadores - FEUP / DEEC / JMF - 23 Trabalho do dado (Stop via /INT) Que alterações são necessárias para implementar o botão de Stop através de /INT? (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? EEC24 Microprocessadores - FEUP / DEEC / JMF - 24