Цитируемая фраза - это не предупреждение, а просто заявление о том, как все работает.
Нет ничего плохого в использовании millis()
или micros()
в правильно написанной программе обработки прерываний.
С другой стороны, делать что-либо вообще в неправильно написанной подпрограмме прерывания по определению неправильно.
Процедура прерывания, выполнение которой занимает более нескольких микросекунд, по всей вероятности, написана неправильно.
Вкратце: правильно написанная процедура прерывания не вызовет и не столкнется с проблемами millis()
или micros()
.
Редактировать: Что касается того, «почему micros ()« начинает вести себя беспорядочно »», как объясняется на веб-странице « Проверка функции Arduino micros », micros()
код на обычном Uno функционально эквивалентен
unsigned long micros() {
return((timer0_overflow_count << 8) + TCNT0)*(64/16);
}
Это возвращает четырехбайтовую длинную без знака, состоящую из трех младших байтов из timer0_overflow_count
и одного байта из регистра отсчета таймера-0.
Значение параметра timer0_overflow_count
увеличивается примерно раз в миллисекунду TIMER0_OVF_vect
обработчиком прерывания, как объяснено при рассмотрении веб-страницы функции миллидюйма arduino .
Перед началом обработчика прерываний аппаратное обеспечение AVR отключает прерывания. Если (например) обработчик прерываний будет работать в течение пяти миллисекунд с прерываниями, которые все еще отключены, то по крайней мере четыре переполнения таймера 0 будут пропущены. [Прерывания, написанные в коде C в системе Arduino, не являются реентерабельными (способными правильно обрабатывать несколько перекрывающихся выполнений в одном и том же обработчике), но можно написать обработчик реентерабельного языка ассемблера, который повторно активирует прерывания до того, как он начнет трудоемкий процесс.]
Другими словами, переполнения таймера не «складываются»; всякий раз, когда переполнение происходит до обработки прерывания от предыдущего переполнения, millis()
счетчик теряет миллисекунду, а расхождение, timer0_overflow_count
в свою очередь, также дает micros()
ошибку на миллисекунду.
Что касается «короче 500 мкс» в качестве верхнего предела времени для обработки прерываний, «чтобы предотвратить слишком длительное блокирование прерывания таймера», вы можете подняться чуть менее 1024 мкс (например, 1020 мкс) и по- millis()
прежнему работать, большая часть время. Тем не менее, я рассматриваю обработчик прерываний, который занимает более 5 мкс как медлительный, более 10 мкс как ленивый, более 20 мкс как улитка.