Você está na página 1de 36

SISTEMAS EMBUTIDOS

BCC 425

Prof: Gabriel Garcia

Baseado nos materiais de Aline Fidêncio e Eduardo Luz


Interrupções
Interrupções

Uma interrupção é um sinal, gerado por um evento externo


à CPU, que faz com que a CPU pare o que estiver fazendo
(para a execução do código atual) e pule para um trecho
de código separado projetado para fazer o tratamento do
evento que causou a ocorrência da interrupção.
Interrupções

Esse trecho especial de código para tratamento da


interrupção é chamado de ISR (Interrupt Service Routine).

Quando a ISR termina, a CPU volta a executar o código


que estava executando antes da interrupção.

Com isso, a execução do código é resumida e a execução


segue como se não tivesse sido interrompida.
Interrupções
Interrupções
Interrupções
Interrupções

As interrupções em um computador podem ser


comparadas às interrupções do dia-a-dia:

O celular chamando ou a campainha tocando.

Ambos os eventos podem ocorrer em qualquer ponto do


dia.

Muito provavelmente você interrompe o que está fazendo


para tratar a razão de tais eventos e depois volta ao que
fazia antes.
Interrupções

E, da mesma forma como podemos ignorar uma chamada


telefônica ou a batida na porta, o computador pode ser
programado para recusar interrupções durante certas
seções crı́ticas de código, ou mesmo ignorá-las
completamente.
Interrupções

Interrupções são um dos recursos mais poderosos que


podem ser acrescentados a sistemas embutidos.

Podem fazer o sistema mais eficiente e responsivo a


eventos crı́ticos.

É muito incomum um sistema embutido que não tenha


sequer uma interrupção.
Interrupções

Uma requisição de interrupção é gerada quando algum


dispositivo externo à CPU (mas não necessariamente ao
micro controlador) envia um sinal para a CPU.

A CPU, se configurada pelo software, irá responder a essa


requisição finalizando a instrução que esteja em execução
e pulando para a ISR correta.

Esse pulo é similar a uma chamada a uma subrotina, mas


não é idêntico.
Interrupções

A CPU irá salvar o valor de PC (Program Counter ) na


hardware stack ou em outro registrador especial.

E, dependendo das decisões de implementação, poderá


também salvar informações de status.

Depois, começa a execução da rotina de tratamento da


interrupção.

No final do código da interrupção haverá uma instrução de


return-from-interrupt que irá restaurar qualquer informação
de status salva e o PC.
Interrupções
Além das informações de status que são salvas
automaticamente e restauradas no processo de
interrupção, é decisão do programador salvar ou não
qualquer outra informação adicional tais como
registradores que tenham sido utilizados pela ISR.

! é extremamente crı́tico retornar ao código interrompido


com o processador no mesmo estado que este estava ao
ser interrompido.

Todas as flags e registradores devem permanecer


inalterados.
ou por não terem sido alterados pela ISR.

ou por terem sido alterados pela ISR, mas terem sido


salvos antes e depois, restaurados.
Interrupções
Interrupções

Como sempre, maiores detalhes sobre esse processo


dependerão do design da CPU.

Algumas possuem registradores duplicados separados


para servir o tratamento de interrupções.

Algumas possuem a hardware stack para todos os dados


salvos.

Geralmente, salvar e restaurar o código de primeiro plano


em execução é um processo de dois passos por razões de
eficiência.
Interrupções
A resposta à interrupção automaticamente salva as
informações (estados) mais significantes.

Mas as primeiras linhas da ISR geralmente são dedicadas


a salvar informações de estado adicionais (registradores e
flags, por exemplo).

O processo em dois passos é usado porque cada ISR terá


seus próprios requisitos com relação ao número de
registradores necessários, assim, cada ISR precisará
salvar diferentes registradores e diferentes quantidades de
registradores.

Ou seja, garantindo que todos os dados importantes são


salvos e que não se perde tempo salvando um registrador
que não será modificado.
Interrupções vs Pooling

Como o micro controlador sabe quando deve conseguir a


informação solicitada do sistema externo?

Usando pooling.

Usando interrupções.
Interrupções vs Pooling

Pooling:

O micro controlador acessa, em intervalos de tempo


constantes, o dispositivo externo e adquire a informação
requerida.

O usuário é quem determina esse intervalo de tempo.

A desvantagem desse método é a chamada espera


ocupada.
Fontes Comuns de Interrupções

Vejamos uma lista de fontes comuns de interrupções em


um micro controlador.

Se o micro controlador possuir outros periféricos, muito


provavelmente eles também serão fontes de interrupções.

Interrupções são eventos assı́ncronos, uma vez que


podem ocorrer a qualquer momento.
Fontes Comuns de Interrupções
Mudança no estado de um pino de entrada.

Timer overflow.

UART RX: char pronto.

UART TX: pronto.

UART TX: completo.

Transferência I2C.

Conversão ADC completa.

Watchdog.
Habilitando/Desabilitando Interrupções

Cada fonte de interrupção terá uma forma diferente de


habilitação/desabilitação - normalmente através de um bit
no registrador de configuração.

No fim da configuração das interrupções para aquele


periférico, as interrupções estarão habilitadas.

Mas isso não implica que as interrupções começam a ser


servidas.

A CPU também terá um serviço global de gerenciamento


de interrupções que a permite processar interrupções.
Habilitando/Desabilitando Interrupções

Esse serviço global é tipicamente habilitado depois que


todos os serviços individuais foram devidamente
configurados.

A sequência de inicialização será algo como:

Configura e habilita fonte de interrupção 1.

Configura e habilita fonte de interrupção 2.

...

Configura e habilita fonte de interrupção N.

Habilita interrupções globais.


Habilitando/Desabilitando Interrupções

Depois de serem habilitadas, as fontes individuais de


interrupção podem ser desabilitadas/re-habilitadas em
qualquer ponto do programa.

O mesmo vale para as interrupções globais.

Basicamente, desabilitar as interrupções globais é um


modo de garantir acesso atômico a dados acessados pela
interrupção.
ISR e Interrupt Vectors

Todo micro controlador tem uma lista de interrupções que


podem ser geradas por eventos on-chip ou externos.

Também terá uma lista de endereços fixos (vectors)


correspondentes a cada uma dessas interrupções.
ISR e Interrupt Vectors

Se a ISR é escrita em Assembly, as instruções de salvar


os registradores/flags e return-from-interrupt estarão
evidentes no código.

Se a ISR for escrita em C, o compilador irá inserir o código


e ele estará invisı́vel ao programador.

Mas para isso o compilador deve saber que é uma ISR e


não uma função qualquer.

Diferentes compiladores usam diferentes formas de


distinguir essas funções.
ISR e Interrupt Vectors
Latência de Interrupção
O que faz uma Interrupção?
Depende.

Uma ISR deve fazer o trabalho imediato necessário para


processar o evento de interrupção.

Exemplo: imagine um sensor de temperatura que


interrompe o micro controlador quando ele tem um novo
valor para reportar.

A ISR então recebe esse valor, armazena e, se o sensor


requisitar, notifica o sensor que o valor foi recebido.

Depois, a ISR setará uma flag dizendo ao programa


principal que um novo valor de temperatura está
esperando e então a ISR termina.
O que faz uma Interrupção?

O programa principal então pode procurar a mensagem de


novo-valor-temperatura em algum lugar do loop (lembre-se
que todos os programas embarcados são loops infinitos) e
processar esse valor quando necessário.

Então, a chave para escrever uma ISR é: o que precisar


ser feito agora, faça na ISR.

O que precisa ser feito depois, envie uma mensagem ou


use uma flag e faça fora da ISR.
Prioridade das Interrupções

Como interrupções podem acontecer a qualquer


momento, é possı́vel que duas fontes diferentes sejam
geradas ao mesmo tempo.

Nesse caso, a CPU irá usar as prioridades associadas a


cada ISR para decidir qual deverá ser executada primeiro.
Sobreposição de Interrupções

E o que acontece se uma segunda interrupção acontecer


enquanto uma já está em andamento?

Alguém terá que esperar: ou a ISR da segunda


interrupção não vai executar até que o código da primeira
termine, ou a segunda interrupção vai interromper a ISR
da primeira interrupção.

Dessa forma, a primeira interrupção será atrasada em sua


execução.

Qual desses cenários é executado depende do design do


dispositivo, e como o programador o configura.
Controlador de Interrupções

Presente nas CPUs modernas.

Dispositivos sinalizam diretamente no controlador.

Faz o controle de prioridade.


Controlador de Interrupções
Exemplo: Botão

Não é uma boa ideia ler o valor de botões através de


interrupções pelo simples fato de que o bouncing signal
pode gerar vários sinais de interrupção para um único
evento.

Mas é um bom exemplo inicial.

Considere o programa que usa dois botões (um para


acender, outro para apagar) um led.

Antes, o estado dos botões eram monitorados


constantemente; agora, os botões irão gerar uma
interrupção e o led será ligado/desligado dentro da ISR
correspondente.
Exercı́cios

Para que servem as interrupções?


Quando deve-se utilizar interrupção e quando deve-se
utilizar pooling? Cite um exemplo para cada.
O que é a prioridade da interrupção?
Para casa: baseado no manual do AVR faça um guia
mostrando como funcionam as interrupções nos chips ATMega
e como elas devem ser utilizadas em C.
FIM

Você também pode gostar