La frase citata non è un avvertimento, è semplicemente una dichiarazione su come funzionano le cose.
Non c'è nulla di intrinsecamente sbagliato nell'uso millis()
o micros()
all'interno di una routine di interruzione scritta correttamente.
D'altra parte, fare qualsiasi cosa all'interno di una routine di interruzione scritta in modo improprio è per definizione sbagliato.
Una routine di interruzione che impiega più di qualche microsecondo per fare il suo lavoro è, con ogni probabilità, scritta in modo improprio.
In breve: una routine di interruzione scritta correttamente non causerà o incontrerà problemi con millis()
o micros()
.
Modifica: per quanto riguarda "perché micros ()" inizia a comportarsi in modo irregolare "", come spiegato in una pagina web " esame della funzione Arduino micros ", il micros()
codice su uno Uno ordinario è funzionalmente equivalente a
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Ciò restituisce un lungo senza segno a quattro byte composto dai tre byte più bassi da timer0_overflow_count
e un byte dal registro di conteggio timer-0.
Il gestore di interrupt timer0_overflow_count
incrementa circa una volta al millisecondo TIMER0_OVF_vect
, come spiegato in un esame della pagina Web della funzione arduino millis .
Prima che inizi un gestore di interrupt, l'hardware AVR disabilita gli interrupt. Se (per esempio) un gestore di interrupt dovesse funzionare per cinque millisecondi con gli interrupt ancora disabilitati, almeno quattro overflow del timer 0 verrebbero persi. [Gli interrupt scritti in codice C nel sistema Arduino non sono rientranti (in grado di gestire correttamente più esecuzioni sovrapposte all'interno dello stesso gestore) ma si potrebbe scrivere un gestore di linguaggio di assemblaggio rientrante che riattivi gli interrupt prima che inizi un processo che richiede tempo.]
In altre parole, gli overflow del timer non si "impilano"; ogni volta che si verifica un overflow prima che l'interrupt del precedente overflow sia stato gestito, il millis()
contatore perde un millisecondo e la discrepanza timer0_overflow_count
a sua volta si micros()
sbaglia anche di un millisecondo.
Considerando "meno di 500 μs" come limite di tempo superiore per l'elaborazione degli interrupt, "per evitare di bloccare l'interrupt del timer per troppo tempo", si potrebbe arrivare a poco meno di 1024 μs (ad esempio 1020 μs) e funzionerebbe millis()
ancora, la maggior parte dei tempo. Tuttavia, considero un gestore di interrupt che prende più di 5 μs come pigro, più di 10 μs come pigro, più di 20 μs come una lumaca.