• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

функция yield()

enjoynering

Well-known member
Здравствуйте,

Перелопатил интернет но так и не нашел ответ на свой вопрос - куда вставлять yield(), до или после длинных задержек или тяжелых функций? Тыкните пожалуйста на место в исходниках на эту команду (искал на гитхабе в офиц. репозитории, но так и не нашел. уж очень глубоко зарыта)

Вариант 1
Код:
  while (connectAttempts < MAX_CONNECTION_ATTEMPTS || connectionStatus != true)
  {
    connectAttempts++;

    if (WiFi.status() == WL_CONNECTED)
    {
      connectionStatus = true;
    }
    else
    {
      analogWrite(LED_BUILTIN, HIGH);
      delay(200);
      analogWrite(LED_BUILTIN, LOW);
      delay(300);
     yield();
    }
Вариант 2
Код:
  while (connectAttempts < MAX_CONNECTION_ATTEMPTS || connectionStatus != true)
  {
    connectAttempts++;
    yield();
    if (WiFi.status() == WL_CONNECTED)
    {
      connectionStatus = true;
    }
    else
    {
      analogWrite(LED_BUILTIN, HIGH);
      delay(200);
      analogWrite(LED_BUILTIN, LOW);
      delay(300);
    }
Вариант 3
Код:
  while (connectAttempts < MAX_CONNECTION_ATTEMPTS || connectionStatus != true)
  {
    connectAttempts++;

    if (WiFi.status() == WL_CONNECTED)
    {
      connectionStatus = true;
    }
    else
    {
      analogWrite(LED_BUILTIN, HIGH);
      delay(200);
      analogWrite(LED_BUILTIN, LOW);
      delay(300);
    }
    yield();
Заранее спасибо.
 

enjoynering

Well-known member
спасибо за ответ. вы меня в конец запутали. Как delay() не задержка? Поробую зайти с другого конца.

Тыкните меня пожалуста в документацю где почитать про особенности delay в arduino-esp. Я читал, что уже "зержки" больше 100 милисекунд - это очень не хорошо для esp тк много чего происходит на втром плане помимо моего кода. В моих примерах я мигаю светодиодом и в сумме задежка аж полсекудны. Куда надо поставить yield() в пример, чтоб невелировать дествие delay? Если я поставлю yield() после delay(200), а как мы выяснили yield()== delay(0) то delay(200) равно сработает. Если поставлю поставлю перед delay(200), delay(200) тоже сработает. Я запутался.
 

Сергей_Ф

Moderator
Команда форума
@enjoynering не нужен вам в вашем случае yield вообще. Любой вызов delay для esp это время для обработки wifi. Yield нужен, когда у вас есть обработка чего либо без прерываний. Это не ваш случай.
 

enjoynering

Well-known member
Любой вызов delay для esp это время для обработки wifi
вы хотите сказать, что при вызове delay() часть програмного кода для wifi все равно продолжает крутиться?

Yield нужен, когда у вас есть обработка чего либо без прерываний
те например в функции нет ни каких delay() и идет вывод в последовательный порт большого массива без остановки?
 

Сергей_Ф

Moderator
Команда форума
@enjoynering совершенно верно. delay() - это задержка для ВАШЕЙ ПРОГРАММЫ, для есп это время обработки WiFi.
Во втором случае, нужно разбавлять вывод оператором yeild() или delay(0), что одно и то же.
 

enjoynering

Well-known member
@enjoynering совершенно верно. delay() - это задержка для ВАШЕЙ ПРОГРАММЫ, для есп это время обработки WiFi.
Во втором случае, нужно разбавлять вывод оператором yeild() или delay(0), что одно и то же.
спасибо. теперь все стало понятно.
 

Сергей_Ф

Moderator
Команда форума
@enjoynering дополню, что delayMicroseconds(), в отличии от delay(), управление на обработку wifi не передаёт. Так что аккуратнее.
 

enjoynering

Well-known member
@enjoynering дополню, что delayMicroseconds(), в отличии от delay(), управление на обработку wifi не передаёт. Так что аккуратнее.
а не знаете мах. безопасную задержку для delayMicroseconds()? И куда лучше ставить yield(), после или перед delayMicroseconds() если вышли за безопасное время? По мне так перед, чтоб wifi сделал все дела, а потом можно с чистой совестью и задержку.
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@enjoynering сам по себе delayMicroseconds безопасен с любым параметром. Главное его в цикле не крутить, вот тогда и нужен будет yeild(). А перед или после его ставить, не важно. Главное внутри цикла.
 

Thest

New member
В конец запутался, хотя зашёл глянуть про особенности yield на ESP. Функция yield на arduino работает так:
void setup(){
//тут код выполняемый один раз во время запуска контроллера
}
void loop(){
//тут зацикленный основной код
delay(1000); //допустим в коде есть задержка в секунду
//потом опять код
delay(40); // ну и опять задержка
}
void yield(){
// А вот тут и самое интересное! Тут вставляете функции или код, которые работают ТОЛЬКО во время работы delay!!! По коду выше, в лупе, весь код в yield запустится сначала на 1 секунду, потом на 40мСек.

}

Так вот, разве в ESP функция yield работает не так?
 

enjoynering

Well-known member
Думаю не получится - компилятор будет ругаться на две функции с одинаковым названием yield().
 

Thest

New member
Думаю не получится - компилятор будет ругаться на две функции с одинаковым названием yield().
То есть в компиляторе вшита функция:
void yield(){
delay(0);
}
и с функцией на меге она не имеет ничего общего, правильно я понял?
Не удобно.. на меге просто задал функцию и всё, нигде вызывать не надо, она сама автоматически делеем вызывается, а тут это просто функция спасения wifi соединения получается..
 

CodeNameHawk

Moderator
Команда форума
а тут это просто функция спасения wifi соединения получается..
Если в вашем коде надо спасать wifi, то ваш код надо переписать под идеологию ардуино.
Откажитесь от delay(1000); //допустим в коде есть задержка в секунду
в пользу "сделаю, то что надо, в каком то следующем цикле лооп, после того как секунда прошла.
 
Последнее редактирование:

Thest

New member
Если в вашем коде надо спасать wifi, то ваш код надо переписать под идеологию ардуино.
Откажитесь от delay(1000); //допустим в коде есть задержка в секунду
в пользу "сделаю, то что надо, в каком то следующем цикле лооп, после того как секунда прошла.
да это понятно, уже несколько лет не использую delay, но год назад научился работать с yield и для простеньких, ленивых проектов удобно использовать. Тут я зашёл обновить знания для esp.
 

Thest

New member
ну и зря. delay(1) в конце loop() позволяет экономить кучу энергии на esp8266. подробности - https://elchupanibrei.livejournal.com/47610.html
Прикольно, не знал. Но я имел ввиду, что не использую delay, потому что он стопарит программу, millis наше всё..
А на меге можно использовать yield, чтобы во время delay продолжался например опрос датчиков, а не тупо контроллер зависал на указанное время
 
Сверху Снизу