As interrupções são essencialmente chamadas de sub-rotinas geradas por dispositivos físicos, em oposição às sub-rotinas normais de um programa em execução. Como o salto de sub-rotina não faz parte do thread ou da sequência de execução programada, o controlador salva o estado do processador na pilha de memória "Pilha (computação)" e executa um código especial denominado "manipulador de interrupção" que aborda o periférico específico que gerou a interrupção. No final da rotina, uma instrução especial informa ao processador o fim da atenção à interrupção. Nesse momento o controlador restaura o estado anterior, e o programa que estava rodando antes da interrupção continua como se nada tivesse acontecido. As rotinas de tratamento de interrupções devem ser tão curtas quanto possível para um desempenho satisfatório do sistema, porque normalmente quando uma interrupção é atendida, todas as outras interrupções estão aguardando.
Imagine que você está esperando a visita de um amigo, a quem chamaremos de Juan. Você e Juan concordaram que quando ele chegar em casa esperará pacientemente que você abra a porta. Juan não deve bater na porta porque alguém da casa está dormindo e ele não quer ser acordado..
Agora você decidiu ler um livro enquanto espera o Juan chegar em casa, e para verificar se o Juan chegou, de vez em quando você para de ler, marca a página onde parou, levanta e vai até a porta, abra-a e verifique se o Juan chegou, se ele ainda não estiver na porta, você vai esperar alguns minutos, fechar a porta e voltar à leitura por algum tempo..
Como você verá, este é um método ineficiente para esperar por Juan porque exige que você pare de ler de vez em quando e vá até a porta para verificar se ele chegou, e também deve esperar um pouco se ele ainda não chegou. E se isso não bastasse, imagine que Juan nunca chega porque surgiu um problema, ele teve que cancelar o compromisso e não conseguiu avisar a tempo, ou pior, que Juan chegou à porta um instante depois de você fechá-la. Juan, respeitando o combinado, espera um pouco, mas se cansa de esperar que abram a porta e decide ir embora porque acredita que você não está mais em casa ou não pode cuidar dele. Chamaremos de pesquisa esse método de atendimento à chegada de Juan.
Vejamos agora outro método. Nesta ocasião ele simplesmente se deita no sofá da sala e começa a ler seu livro. Quando Juan chegar deverá tocar a campainha e esperar alguns instantes até que o atendam. Ao ouvir a campainha tocar, você para de ler, marca a página onde parou e vai até a porta atender a pessoa que tocou a campainha. Assim que Juan ou a pessoa que tocou a campainha sai, você volta ao seu lugar e retoma a leitura exatamente de onde parou.
Este último é um método mais eficiente que o anterior porque lhe dá mais tempo para ler e elimina alguns inconvenientes como o fato de Juan nunca chegar ou sair antes de você abrir a porta. É, em princípio, um método simples mas muito eficaz e eficiente, chamaremos a atenção para ele por interrupção.
O primeiro deles, o levantamento, é um método eficaz, mas pouco eficiente porque exige leituras constantes e muitas vezes desnecessárias do estado do processo que queremos atender. Porém, é muito utilizado na programação de microcontroladores por ser de fácil aprendizado, a implementação do código com este método é menos complexa e não requer hardware especial para realizá-la. Por outro lado, a pesquisa apresenta muitas deficiências que muitas vezes obrigam o designer a caminhar para outros horizontes.
O mundo está cheio de situações; dos quais não podemos determinar quando, como ou por que ocorrem, na maioria dos casos a única coisa que podemos fazer é descobrir que ocorreu uma determinada situação, associada a um processo. Para fazer isso, selecionamos alguma condição ou grupo de condições que nos digam que o processo que nos interessa deve ser atendido. Chamaremos de evento esse fenômeno, no qual ocorrem as condições que nos interessa conhecer. No segundo exemplo vemos que para atender Juan ele deve tocar a campainha, portanto, a chegada de Juan é o processo que devemos atender e o som da campainha é o evento que nos informa que Juan chegou.
O método de atenção aos processos por interrupção, visto na perspectiva do exemplo que usei para mostrá-lo, é mais simples que o do levantamento, mas não é verdade, o método é complicado porque exige que o microprocessador incorpore circuitos adicionais para registrar os eventos que indicam que ele deve atender ao processo associado e compreender esses circuitos e sua dinâmica não é uma tarefa simples.
Os circuitos de tratamento das interrupções e todas as tarefas que o processador deve realizar para atender ao processo que o interrompe são bastante complexos e requerem uma visão diferente daquela que estamos acostumados a ter do nosso mundo.
O ser humano não tem consciência das interrupções, em nosso corpo existem mecanismos que nos interrompem constantemente, para isso temos o nosso sistema sensorial, mas não temos consciência do processo de interrupção, embora tenhamos consciência da atenção às interrupções. Isso porque incorporamos mecanismos que nos tiram rapidamente da tarefa que estamos realizando para enfrentar uma situação que não pode ou não deve esperar muito tempo. Pois bem, essa é a mesma ideia que se incorpora aos microprocessadores para atender processos que não podem esperar ou que não sabemos quando devem ser atendidos porque depende de certas condições.
Isso se complica na sequência de ações realizadas desde o momento em que o processo de interrupção é iniciado, até que o programa que você atende é executado, e na sequência de ações posteriores à atenção. Pense em quantas coisas seu corpo deve fazer em caso de interrupção. Utilizemos o segundo exemplo para tratar da chegada de Juan. Piense em quantas coisas seu cérebro faz com que as espadas de sua consciência, desde o momento em que suena o timbre até que você se encontre na lista (consciente de que é provável que Juan tenha deixado) para abrir a porta, e todo o que seu cérebro deve trabalhar para retomar a leitura depois que Juan se ha marchado. Tudo isso, exceto abrir a porta e atender Juan, ele faz de forma “inconsciente” porque para ele temos sistemas dedicados em nosso organismo, mas no mundo dos microcontroladores devemos conhecer todos esses detalhes para poder utilizar os mecanismos de interrupção.
Os processos de tratamento de interrupções têm a vantagem de serem implementados por hardware localizado no processador, portanto é um método rápido de tornar o processador dedicado à execução de um programa especial para tratar eventos que não podem esperar por mecanismos lentos, como polling.
Em termos gerais, um processo de interrupção e sua atenção por parte do processador possui a seguinte sequência de ações:
Como podemos perceber, o mecanismo de interrupção é bastante complicado, porém possui duas vantagens que exigem sua implementação: a velocidade e a capacidade de ser assíncrono. Ambos juntos nos permitem aproveitar ao máximo as capacidades de trabalho do nosso processador.
Os mecanismos de interrupção não são usados apenas para lidar com eventos vinculados a processos que requerem atenção imediata, mas também para lidar com eventos de processos assíncronos.
As interrupções são tão eficazes que permitem ao processador agir como se estivesse fazendo várias coisas ao mesmo tempo, quando na realidade ele está envolvido na mesma velha rotina, executando instruções uma após a outra.