Приостанавливает ли delay() подсчет millis()?
Если я добавлю задержку на несколько секунд, будет ли значение, заданное функцией millis(), одинаковым непосредственно до и после задержки?
Или, другими словами, останавливаются ли внутренние часы Arduino во время задержки?
2 ответа
Лучший ответ:
Нет, я не могу это проверить (нет Arduino под рукой), но насколько мне известно, часы всегда продолжают отсчет, поэтому если вы выполните задержку в 1 секунду и выполните diff millis() непосредственно перед этим и после, то это будет (немного больше) 1000 (мс).
Однако следует отметить, что использование задержки не рекомендуется, и лучше проверить millis() для выполнения следующего состояния/команды вместо задержки, которая не позволяет выполнять другие задачи в это время. Но (внутренний) таймер всегда продолжает работать.
Только во время какого-то глубокого спящего режима он может остановиться, но тогда задержка тоже не сработает. И когда прерывания отключены (см. замечание Криса Стрэттона ниже).
Задержка использует миллис. Она просто ждет, проверяя миллис, пока не пройдет определенное время.
Millis управляется прерыванием. Единственное, что останавливает его работу, — это другое прерывание (одновременно может выполняться только одно прерывание), поэтому нельзя использовать задержку в прерывании.
(delay
на самом деле использует micros
, а не millis
([источник](https://github.com/arduino/ArduinoCore-avr/blob/3f63f2975e7183c3254b6794bfcc8f19ca0301c9/cores/arduino/wiring.c#L106:L117)). Но и millis, и micros действительно используют прерывание таймера для подсчета времени.), @Gerben
Задержка, миллисекунды, микросекунды и т. д. — это все одно и то же., @Majenko
Это тоже не совсем верно — отключение прерываний вне ISR также остановит его., @Chris Stratton
Хорошо, господин педант. Мы все знаем, что вы цените свое мнение., @Majenko
Это не вопрос мнения, а вводящего в заблуждение ложного использования слова "только" для чего-то, что на самом деле не является единственной возможностью. Обычно ответ не должен упоминать все, но если он собирается использовать исключительный язык, он это делает, иначе читатели могут быть введены в заблуждение. Если на то пошло, "заимствование" используемого таймера для какой-то другой пользовательской цели также сломало бы его., @Chris Stratton
Вы создаете много бесполезного носа здесь, вы знаете. Пользователям здесь не нужно знать такие уровни детализации большую часть времени. Адаптируйте ответ к аудитории., @Majenko
- ATtiny44 millis() не работает с внешней тактовой частотой 16 МГц
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- Постоянный выход тактовой частоты Arduino
- Arduino 16 МГц только с 3,3 В?
- ардуино - миллисекунды ()
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
Вы упускаете из виду более распространенное исключение: время также перестает увеличиваться при отключении прерываний., @Chris Stratton
@ChrisStratton Спасибо ... Я добавил это в свой ответ. Кроме того, я не знал этого, хотя это кажется очень логичным., @Michel Keijzers