Несколько void loop() с ESP8266

Хочу запустить несколько скетчей на одном скетче. Я использую метод множественных void loop. Это работает, но esp8266 требует много времени для выполнения команд.

void Setup() 
 {
  setup1(); 
  setup2();
 }
void loop() 
 {
  loop1(); 
  loop2();
 }

Есть ли способ избежать этого?

, 👍1

Обсуждение

Вы должны реорганизовать свой код, чтобы он использовал только одну функцию установки и цикла., @Majenko

вы рассматривали возможность использования многозадачности?, @Sim Son

@SimSon Arduino не поддерживает многозадачность. Это очень простой микроконтроллер. У него есть функция setup() и функция loop(), вот и все., @Duncan C

OP, кажется, использует 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


2 ответа


1

Если функции setup() или loop() вызывают delay(), то, конечно, это задержит переход к следующей функции и замедлит весь процесс.

Единственный способ справиться с этим — переписать код, объединив то, что вы вызываете, и исправив его так, чтобы он учитывал другую работу, которую ему необходимо выполнить.

То же самое, если вы вызываете любые блокирующие функции, такие как чтение из Serial, пока не получите новую строку.

Если это не так... что ж, ESP8266 — это маленький и не особенно быстрый процессор. Если нет задержек или блокирующих функций, ваш код работает так же быстро, как и ваш код, и вам просто придется с этим смириться.

,

0

Если вы не используете delay() или другой блокирующий код, как упоминает Джон в своем ответе, этот подход будет работать нормально. У меня есть довольно большой проект, в котором я определил класс ArduinoObject . Класс ArduinoObject имеет метод настройки и метод цикла, а основной скетч создает и управляет массивом объектов ArduinoObject (и другим стеком подкласса ArduinoObject). называется MenuObject, который управляет меню на ЖК-экране, используемом в проекте.)

Иногда при каждом проходе через функцию скетча loop() вызывается дюжина или более ArduinoObjects, и это работает просто отлично. Главное, чтобы ваши подциклы были БЫСТРЫМИ. Они должны выполнять небольшой объем работы на каждом проходе, а затем немного больше на следующем проходе (при необходимости). Вы никогда не хотите, чтобы один из ваших подциклов занимал достаточно времени, чтобы заставить другие подциклы «заикаться».

,