Несколько 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