В чем секрет функции Arduino `yield ()`?

документы Arduino объясняют yield() at https://www.arduino.cc/en/Reference/Scheduler относительно должного. По-видимому, это часть библиотеки планировщика:

#include <Scheduler.h>

однако, я могу назвать yield() на моем Nano или ESP8266 без включения планировщика lib -- но только в моей основной программе, а не внутри файлов include. Кроме того, include не работает на моих не-взносах.

в чем секрет, который я пропускаю о yield() или - что значит yield() сделать на платформах Arduino, отличных от должных?

2 ответов


однако я могу вызвать yield() на моем Nano или ESP8266 без включения планировщик lib

на yield() функция также реализована внутри С ESP8266 библиотеки:

урожайность

это одно из самых критических различий между ESP8266 и a более классический микроконтроллер Arduino. В с ESP8266 работает много служебные функции в фоновом режиме-ведение WiFi подключен, управляющий стек TCP/IP и выполнение других обязанностей. Блокируя эти функции от запуска могут привести к сбою и сбросу ESP8266 себя. Чтобы избежать этих таинственных сбросов, избегайте длинных, блокирующих петель в твоем эскизе.

удивительные создатели библиотек ESP8266 Arduino также реализованы функция yield (), который вызывает фоновые функции, чтобы разрешить их делать вещи.

вот почему вы могу позвонить yield() из вашей основной программы, где включен заголовок ESP8266.

посмотреть ESP8266 вещь руководство по подключению.

обновление:

yield() определяется в Arduino.h as:

void yield(void);

yield() также объявлено в hooks.h следующим образом:

/**
 * Empty yield() hook.
 *
 * This function is intended to be used by library writers to build
 * libraries or sketches that supports cooperative threads.
 *
 * Its defined as a weak symbol and it can be redefined to implement a
 * real cooperative scheduler.
 */
static void __empty() {
    // Empty
}
void yield(void) __attribute__ ((weak, alias("__empty")));

так, на Nano, он, вероятно, ничего не делает (если у вас нет других библиотеки #included).


yield - "слабая" функция от ядра Arduino для AVR. Я вижу один вызов для него внутри проводки.c.

void delay(unsigned long ms)
{
    uint32_t start = micros();

    while (ms > 0) {
        yield();
        while ( ms > 0 && (micros() - start) >= 1000) {
            ms--;
            start += 1000;
        }
    }
}

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

Примечание: выход должен быть определен в application / sketch

UPDATE: вопрос заставил меня взволноваться, чтобы сделать немного пост о выходе и других скрытых функций от Arduino core.