Несколько void loop() с ESP8266
Хочу запустить несколько скетчей на одном скетче. Я использую метод множественных void loop. Это работает, но esp8266 требует много времени для выполнения команд.
void Setup()
{
setup1();
setup2();
}
void loop()
{
loop1();
loop2();
}
Есть ли способ избежать этого?
@Radja, 👍1
Обсуждение2 ответа
Если функции setup() или loop() вызывают delay(), то, конечно, это задержит переход к следующей функции и замедлит весь процесс.
Единственный способ справиться с этим — переписать код, объединив то, что вы вызываете, и исправив его так, чтобы он учитывал другую работу, которую ему необходимо выполнить.
То же самое, если вы вызываете любые блокирующие функции, такие как чтение из Serial, пока не получите новую строку.
Если это не так... что ж, ESP8266 — это маленький и не особенно быстрый процессор. Если нет задержек или блокирующих функций, ваш код работает так же быстро, как и ваш код, и вам просто придется с этим смириться.
Если вы не используете delay() или другой блокирующий код, как упоминает Джон в своем ответе, этот подход будет работать нормально. У меня есть довольно большой проект, в котором я определил класс ArduinoObject . Класс ArduinoObject имеет метод настройки и метод цикла, а основной скетч создает и управляет массивом объектов ArduinoObject (и другим стеком подкласса ArduinoObject). называется MenuObject, который управляет меню на ЖК-экране, используемом в проекте.)
Иногда при каждом проходе через функцию скетча loop() вызывается дюжина или более ArduinoObjects, и это работает просто отлично. Главное, чтобы ваши подциклы были БЫСТРЫМИ. Они должны выполнять небольшой объем работы на каждом проходе, а затем немного больше на следующем проходе (при необходимости). Вы никогда не хотите, чтобы один из ваших подциклов занимал достаточно времени, чтобы заставить другие подциклы «заикаться».
- Ошибка формата с компиляцией ESP8266
- Как читать и записывать EEPROM в ESP8266
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как определить размер Flash?
- Передача функции-члена класса в качестве аргумента
- Несколько клиентских серверов через Wi-Fi
- Wire.h не найден!
Вы должны реорганизовать свой код, чтобы он использовал только одну функцию установки и цикла., @Majenko
вы рассматривали возможность использования многозадачности?, @Sim Son
@SimSon Arduino не поддерживает многозадачность. Это очень простой микроконтроллер. У него есть функция
setup()и функцияloop(), вот и все., @Duncan COP, кажется, использует ESP8266. Насколько я знаю, существуют библиотеки для многозадачности. По крайней мере для ESP32 точно знаю. Даже на атмеге есть способы реализовать многозадачность, в моем понимании принцип многозадачности не имеет большого отношения к реальному железу., @Sim Son
@SimSon ESP32 имеет два ядра, а ESP8266 только одно, поэтому они не одинаковы., @Jaromanda X
Не видя, что делают loop1 и loop2, трудно догадаться, но если
esp8266 требует много времени для выполнения команд, то не имеет значения, как вы пишете свой код (несколько функций цикла или поместите их все в одну функцию цикла) это займет столько же времени - проблема в коде, который вы **не** показали, @Jaromanda X@JarmondaX да, я знаю об этом. Но даже несмотря на то, что многозадачность может управляться по-разному, она по-прежнему не зависит строго от аппаратного обеспечения. Учтите: даже на ESP32 можно запускать более двух задач. Многозадачность — это **псевдо**-параллелизм по принципу. Я никогда не использовал его на 8266, но, кажется, есть https://github.com/nrwiersma/ESP8266Scheduler, @Sim Son
@SimSon - Хорошо, никогда не думал, что в таком крошечном устройстве: p, @Jaromanda X