Interrupções em Sistemas Embarcados


02 abril, 2014
Diariamente, todos nós convivemos com interrupções em nossas tarefas. Nos deparamos com imprevistos e ocorrências que surgem enquanto estamos fazendo algo. Apenas para citar um exemplo, atender um telefone pode ser considerado uma interrupção, pois geralmente para isso é preciso parar de executar a tarefa normal que estamos fazendo e atender o telefone.

No mundo da eletrônica também existem interrupções. Quando utiliza-se um microcontrolador este possui diversas interrupções previstas que podem ser utilizadas para executar tarefas quando ocorrer algum evento específico.


Quando ocorre uma interrupção, o microcontrolador interrompe o que está fazendo e executa determinada rotina. Essa interrupção é gerada por um sinal enviado por hardware para o microcontrolador. Elas podem ser internas ou externas e geralmente estão especificadas no datasheet do microcontrolador.

As interrupções externas podemos dizer que são aquelas que ocorrem quando um dispositivo externo conectado a um pino do microcontrolador envia um sinal especifico para o mesmo. Este identifica o sinal e interrompe a tarefa que está executando no momento e pula (jump) para executar a tarefa da interrupção.

Já as interrupções que ocorrem dentro do microcontrolador, internas, em geral ocorrem quando periféricos internos do microcontrolador enviam um sinal para a UCP (Unidade Central de Processamento). Assim, o uC identifica o sinal, interrompe o que está fazendo e executa a tarefa da interrupção. Todas essas ações são organizadas e classificadas por meio de registradores específicos do microcontrolador e endereços de memória reservados para essas interrupções. As tarefas executadas na interrupção são definidas por firmware conforme imagem abaixo.
Firmware com uma interrupção de TIMER0
 
Entretanto, existem alguns cuidados que devem ser tomados ao utilizar uma interrupção. Um deles é cuidar para que a rotina executada na interrupção não se torne grande demais ou que demore muito para ser executado. Se isso acontecer, pode acontecer de outras interrupções vierem a ocorrer enquanto uma interrupção está sendo executada. Isso pode eventualmente causar uma situação inesperada no sistema e gerar o famoso, bug.

Outro cuidado que deve ser tomado, é a utilização de variáveis compartilhadas entre a interrupção e a rotina de tarefas que o microcontrolador executa. Pode-se observar isso na imagem exibida acima. Nota-se que a variável read_state está sendo utilizada nas tarefas normais executadas pelo microcontrolador e também na interrupção. Se ocorrer uma interrupção no meio de uma instrução em que está sendo utilizada a variável compartilhada, pode gerar um bug. Uma possível solução para isso, é desabilitar as interrupções antes de utilizar as variáveis compartilhadas na rotina de tarefas. Assim, impede que o microcontrolador gere uma interrupção enquanto está utilizando aquela variável. Após terminar a utilização da variável compartilhada, pode ser habilitada as interrupções novamente.

O uso de interrupções é bastante difundido no desenvolvimento de sistemas embarcados. Isso facilita o desenvolvimento do firmware, e permite com que sistemas mais complexos e robustos possam ser desenvolvidos. Nós da Eletroeste como uma empresa de desenvolvimento de sistemas embarcados, utilizamos diversas interrupções no firmware de nossos equipamentos e esperamos que este post tenha ajudado a quem também deseja fazer o uso de interrupções em sistemas embarcados.


Nenhum comentário:

Postar um comentário

Gostou do texto? Expresse aqui a sua opinião.