• Система автоматизации с открытым исходным кодом на базе 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(). А перед или после его ставить, не важно. Главное внутри цикла.
 
Сверху Снизу