Цитована фраза не є попередженням, це лише твердження про те, як все працює.
У використанні millis()
або micros()
в правильно написаному режимі переривання нічого поганого немає .
З іншого боку, робити щось взагалі в неправильно написаній процедурі переривання, за визначенням неправильно.
Процедура переривання, якій потрібно більше кількох мікросекунд, щоб виконати свою роботу, є, за всією ймовірністю, неправильно написаною.
Коротше кажучи: Правильно написана програма переривання не спричинить і не матиме проблем із millis()
або 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 будуть пропущені. [Переривання, записані в коді С в системі Arduino, не є ретентивними (здатні правильно обробляти декілька виконуваних перекриттям виконання в одному і тому ж обробнику), але можна було б написати обробник мови збірки реєранта, який повторно використовує переривання до того, як розпочне трудомісткий процес.]
Іншими словами, переповнення таймеру не «стикуються»; всякий раз, коли відбувається переповнення до того, як було оброблено переривання від попереднього переповнення, millis()
лічильник втрачає мілісекунду, а розбіжність timer0_overflow_count
у свою чергу micros()
помиляється і на мілісекунду.
Що стосується "коротшого, ніж 500 мкс", як верхнього часового обмеження для обробки перерв, "щоб запобігти занадто довгому блокуванню переривання таймера", ви можете піднятись трохи менше 1024 мкс (наприклад, 1020 мкс) і millis()
все одно буде працювати, більшість час. Однак я вважаю, що обробник перерв, який займає більше 5 мкс як млявий, більше 10 мкс - лінивий, понад 20 мкс - як слимаковий.