[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