Cytowane wyrażenie nie jest ostrzeżeniem, jest jedynie stwierdzeniem o tym, jak rzeczy działają.
Nie ma nic z natury niewłaściwego w użyciu millis()
lub micros()
w ramach prawidłowo napisanej procedury przerwania.
Z drugiej strony, robienie czegokolwiek w niewłaściwie napisanej procedurze przerwań jest z definicji błędne.
Procedura przerwania, której wykonanie zajmuje więcej niż kilka mikrosekund, jest prawdopodobnie napisana nieprawidłowo.
W skrócie: Prawidłowo napisana procedura przerwania nie spowoduje ani nie napotka problemów z millis()
lub micros()
.
Edycja: Jeśli chodzi o „dlaczego micros ()„ zaczyna zachowywać się nieprawidłowo ””, jak wyjaśniono na stronie internetowej „ badanie funkcji mikr Arduino ”, micros()
kod na zwykłym Uno jest funkcjonalnie równoważny z
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Zwraca to czterobajtowy niepodpisany długi składający się z trzech najniższych bajtów z timer0_overflow_count
i jednego bajtu z rejestru licznika timera-0.
Jest timer0_overflow_count
on zwiększany mniej więcej raz na milisekundę przez modułTIMER0_OVF_vect
obsługi przerwań, jak wyjaśniono w badaniu strony internetowej funkcji arduino millis .
Przed rozpoczęciem obsługi przerwań sprzęt AVR wyłącza przerwania. Jeśli (na przykład) moduł obsługi przerwań miałby działać przez pięć milisekund z przerwaniami wciąż wyłączonymi, co najmniej cztery przepełnienia timera 0 zostałyby pominięte. [Przerwania napisane w kodzie C w systemie Arduino nie są ponownie wysyłane (zdolne do prawidłowej obsługi wielu nakładających się wykonań w ramach tego samego modułu obsługi), ale można napisać moduł obsługi języka asemblera ponownego wprowadzania, który ponownie włącza przerwania, zanim rozpocznie się czasochłonny proces.]
Innymi słowy, przepełnienia timera nie „gromadzą się”; za każdym razem, gdy nastąpi przepełnienie, zanim zostanie obsłużone przerwanie z poprzedniego przepełnienia, millis()
licznik traci milisekundę, a rozbieżność timer0_overflow_count
z kolei również micros()
znika przez milisekundę.
Jeśli chodzi o „krótszy niż 500 μs” jako górny limit czasowy przetwarzania przerwań, „aby zapobiec zbyt długiemu blokowaniu przerwania timera”, możesz wzrosnąć do nieco poniżej 1024 μs (np. 1020 μs) i millis()
nadal działałby, większość czas. Uważam jednak, że program obsługi przerwań, który przyjmuje więcej niż 5 μs jako opieszałość, więcej niż 10 μs jako lenistwo, ponad 20 μs jak ślimak.