Чем `delay()` отличается от использования `millis()` с точки зрения эффективности и скорости реагирования процессора?
Во многих скетчах Arduino, особенно для начинающих, delay() обычно используется для паузы между действиями. Однако я видел, как в более продвинутых проектах для управления временем вместо этого используется millis().
С теоретической точки зрения, чем именно отличаются эти два подхода с точки зрения:
- Эффективность процессора
- Возможность многозадачности (например, запуск нескольких датчиков или функций)
- Обработка прерываний или реагирование
- Потребление энергии (особенно в маломощных приложениях)
Есть ли случаи, когда delay() предпочтительнее, несмотря на свои недостатки? Или его следует полностью избегать в хорошо структурированном коде?
@F. A. Mala, 👍1
1 ответ
Лучший ответ:
Эффективность процессора
Задержка — это, по сути, пустая трата времени (цикл занятости). Можно использовать миллисы для отсчёта времени, но микроконтроллер всё равно не остановится.
Возможность многозадачности (например, запуск нескольких датчиков или функций)
С millis (или arduino на базе RTOS) немного проще
Обработка прерываний
Если вы не блокируете прерывания, всё должно работать как обычно. Возможны задержки при поступлении запроса на прерывание во время обработки миллисекундного ISR (арифметика uint32_t на AVR затратна).
или отзывчивость
Этот вариант определённо проще с проверкой миллисов, чем с задержкой. Однако всё зависит от того, как это используется. Скорее всего, вы прибегнете к конечным автоматам или чему-то подобному.
Потребление энергии (особенно в маломощных приложениях)
Arduino с ядром RTOS могут переходить в спящий режим в режиме ожидания при использовании задержки. В этом случае задержка была бы гораздо более энергоэффективной. Но таких плат немного (Giga, Nano 33 и т. д.).
- Разница между delay() и циклом while с millis() в Arduino?
- Использовать timer0, не влияя на millis() и micros().
- Arduino Мигает двумя светодиодами без задержки (количество повторений)
- Что на самом деле делает delay(0)?
- Аппаратное прерывание срабатывает случайным образом
- Случайная ошибка "Compilation error: Error: 13 INTERNAL: exit status 1". Как устранить или что вызывает эту ошибку
- _delay_ms() работает намного медленнее, чем ожидалось (в 6 раз) на tinyAVR 0/1 (ATTiny1604)
- Запуск двигателя постоянного тока в течение заданного промежутка времени