La phrase citée n'est pas un avertissement, c'est simplement une déclaration sur la façon dont les choses fonctionnent.
Il n'y a rien de intrinsèquement mauvais à utiliser millis()
ou à l' micros()
intérieur d'une routine d'interruption correctement écrite.
D'un autre côté, faire quoi que ce soit dans une routine d'interruption mal écrite est par définition mal.
Une routine d'interruption qui prend plus de quelques microsecondes pour faire son travail est, selon toute vraisemblance, mal écrite.
En bref: une routine d'interruption correctement écrite ne causera ni ne rencontrera de problèmes avec millis()
ou micros()
.
Edit: Concernant "pourquoi micros ()" commence à se comporter de façon erratique "", comme expliqué dans une page Web " examen de la fonction micros Arduino ", le micros()
code sur un Uno ordinaire est fonctionnellement équivalent à
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Cela retourne une longueur non signée de quatre octets composée des trois octets les plus bas de timer0_overflow_count
et d'un octet du registre de comptage du temporisateur-0.
Le timer0_overflow_count
est incrémenté environ une fois par milliseconde par le TIMER0_OVF_vect
gestionnaire d'interruption, comme expliqué dans un examen de la page Web de la fonction arduino millis .
Avant qu'un gestionnaire d'interruption ne commence, le matériel AVR désactive les interruptions. Si (par exemple) un gestionnaire d'interruption devait s'exécuter pendant cinq millisecondes avec des interruptions toujours désactivées, au moins quatre dépassements de temporisation 0 seraient manqués. [Les interruptions écrites en code C dans le système Arduino ne sont pas réentrantes (capables de gérer correctement plusieurs exécutions qui se chevauchent dans le même gestionnaire) mais on pourrait écrire un gestionnaire de langage d'assemblage réentrant qui réactive les interruptions avant qu'il ne commence un processus long.]
En d'autres termes, les débordements de minuterie ne «s'empilent» pas; chaque fois qu'un débordement se produit avant que l'interruption du débordement précédent n'ait été gérée, le millis()
compteur perd une milliseconde, et l'écart timer0_overflow_count
à son tour se micros()
trompe également d'une milliseconde.
En ce qui concerne «moins de 500 μs» comme limite supérieure de temps pour le traitement des interruptions, «pour éviter de bloquer l'interruption du temporisateur trop longtemps», vous pourriez aller jusqu'à un peu moins de 1024 μs (par exemple 1020 μs) et millis()
cela fonctionnerait toujours, la plupart des temps. Cependant, je considère un gestionnaire d'interruption qui prend plus de 5 μs comme un paresseux, plus de 10 μs comme paresseux, plus de 20 μs comme un escargot.