[LHC] Dúvida sobre interrupção no Arduino

DQ dqsoft.blogspot at gmail.com
Wed May 6 09:33:13 PDT 2015


Messias,

O conceito de interrupção é justamente interromper o código que está sendo 
executado e depois retomá-lo exatamente onde parou. Dentro de certos 
parâmetros, a interrupção não é percebida pelo código que foi interrompido. 
Digo "dentro de certos parâmetros", pois ela vai consumir um tempo do 
processador e as ações que a rotina de interrupção executar podem 
interferir o que estava sendo executado. Estes são os principais desafios 
para o uso de interrupção: fazer rotinas rápidas e se proteger contra 
interferências.

Note que a interrupção é no nível de linguagem de máquina, não no nível de 
linha de código C. Por exemplo, considere o código abaixo:

uint32_t cont;

void loop ()
{
   // um monte de coisa

   cont = 100000;

   // outro monte de coisa
  
  if (cont == 0L)
  {
  }

  // etc
}

// Rotina chamada pela interrupção de timer

rotIntTimer ()
{
   if (cont != 0L)
      cont--;
}

O teste cont == 0L requer várias instruções de máquina, pois é uma variável 
de 4 bytes e as instruções do ATmega trabalham com um byte de cada vez. A 
interrupção pode acontecer em qualquer ponto deste teste, o que pode causar 
um bug pois a rotina principal pode testar alguns bytes antes do decremento 
e outros depois. Uma forma de evitar isto é proteger o acesso a várias 
compartilhadas desabilitando as interrupções no programa principal durante 
o teste. A consequência é que isto aumenta o tempo para responder à 
interrupção.

Na verdade este exemplo tem um outro erro: se você não disser nada o 
compilador não vai saber que uma rotina de interrupção pode alterar o valor 
de cont e vai otimizar considerando que o valor só é alterado pela 
atribuição. Para evitar isto é necessário usar o modificador volatile na 
declaração de cont.

Em resumo (o assunto é extenso) interrupção é um recurso muito importante 
(eu diria até que essencial para uma programação limpa) mas requer vários 
cuidados.

Obs: Já usei várias vezes a TimerOne e é muito boa.

DQ
Escrevendo rotinas de interrupção deste 1980.


On Wednesday, May 6, 2015 at 12:40:29 PM UTC-3, Mesias wrote:
>
> Caros, estava lendo sobre esta biblioteca de Timer: 
> http://playground.arduino.cc/code/timer1
>
> Que cita esta outra biblioteca de Timer (mantida mais recente):
> https://github.com/PaulStoffregen/TimerOne
>
>
> Minha dúvida é a seguinte: se o Arduino sofre uma interrupção durante a 
> execução do "loop", ao retornar da interrupção ele para de onde estava ou 
> faz uma nova execução de "loop" ?
>
> -- 
> ======================================
> Alejandro Mesias André Nebra Perez
> Java/Python/Js/Something else Developer
> Twitter: @meszias
> Linux User #442506
> Campinas - SP - Brasil - South America
> ======================================
>  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.tia.mat.br/pipermail/hsc-tia.mat.br/attachments/20150506/c6291792/attachment-0002.htm>


More information about the HSC mailing list