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.