A frase citada não é um aviso, é apenas uma declaração sobre como as coisas funcionam.
Não há nada intrinsecamente errado em usar millis()
ou micros()
em uma rotina de interrupção escrita corretamente.
Por outro lado, fazer qualquer coisa dentro de uma rotina de interrupção incorretamente escrita é, por definição, errado.
Uma rotina de interrupção que leva mais do que alguns microssegundos para fazer seu trabalho é, com toda a probabilidade, gravada incorretamente.
Em resumo: uma rotina de interrupção escrita corretamente não causará ou encontrará problemas com millis()
ou micros()
.
Edit: Quanto a "por que micros ()" começa a se comportar de maneira irregular "", conforme explicado em uma página da Web " exame da função micros do Arduino ", o micros()
código em um Uno comum é funcionalmente equivalente a
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Isso retorna um comprimento não assinado de quatro bytes, composto pelos três bytes mais baixos timer0_overflow_count
e um byte do registro de contagem do timer-0.
Ele timer0_overflow_count
é incrementado cerca de uma vez por milissegundo pelo TIMER0_OVF_vect
manipulador de interrupção, conforme explicado em um exame da página da função arduino millis .
Antes de um manipulador de interrupção começar, o hardware do AVR desativa as interrupções. Se (por exemplo) um manipulador de interrupções fosse executado por cinco milissegundos com as interrupções ainda desativadas, pelo menos quatro estouros de timer 0 seriam perdidos. [Interrupções escritas no código C no sistema Arduino não são reentrantes (capazes de manipular corretamente várias execuções sobrepostas no mesmo manipulador), mas é possível escrever um manipulador reentrante de linguagem assembly que reativa as interrupções antes de iniciar um processo demorado.]
Em outras palavras, os estouros de temporizador não "empilham"; sempre que um estouro ocorre antes que a interrupção do estouro anterior tenha sido tratada, o millis()
contador perde um milissegundo e a discrepância, timer0_overflow_count
por sua vez, também é micros()
equivocada por um milissegundo.
Em relação a "menor que 500 μs" como limite de tempo superior para o processamento de interrupções, "para evitar o bloqueio da interrupção do timer por muito tempo", você poderia subir até 1024 μs (por exemplo, 1020 μs) e millis()
ainda assim funcionaria, a maioria das Tempo. No entanto, considero um manipulador de interrupções que leva mais de 5 μs como preguiçoso, mais de 10 μs como preguiçoso, mais de 20 μs como caracol.