web-dev-qa-db-de.com

Was ist das Geheimnis der Arduino-Funktion „yield ()“?

Die Arduino-Dokumente erklären yield() unter https://www.arduino.cc/de/Reference/Scheduler in Bezug auf das Due. Anscheinend ist es Teil der Scheduler-Bibliothek:

#include <Scheduler.h>

Ich kann jedoch yield() auf meinem Nano oder ESP8266 aufrufen, ohne die Scheduler-Lib einzuschließen - aber nur in meinem Hauptprogramm, nicht in Include-Dateien. Das Include funktioniert auch nicht für meine Nicht-Beiträge.

Was ist das Geheimnis, das mir über yield() fehlt, oder was macht yield() auf anderen Arduino-Plattformen als Due?

12
andig

Ich kann jedoch yield () auf meinem Nano oder ESP8266 anrufen, ohne .__ einzugeben. die Scheduler-Bibliothek

Die Funktion yield() ist auch in den ESP8266 -Bibliotheken implementiert:

Ertrag

Dies ist einer der kritischsten Unterschiede zwischen dem ESP8266 und einem mehr klassischer Arduino-Mikrocontroller. Der ESP8266 hat eine Menge von Utility-Funktionen im Hintergrund - WLAN verbunden halten, verwalten den TCP/IP-Stack und die Ausführung anderer Aufgaben. Blockieren dieser laufende Funktionen können dazu führen, dass der ESP8266 abstürzt und zurückgesetzt wird selbst. Um diese mysteriösen Rückstellungen zu vermeiden, vermeiden Sie lange, blockierende Loops in deiner Skizze.

Die erstaunlichen Ersteller der ESP8266-Arduino-Bibliotheken implementierten ebenfalls eine yield () - Funktion, die die Hintergrundfunktionen aufruft, um .__ zuzulassen. sie, um ihre Sachen zu tun.

Aus diesem Grund können Sie yield() in Ihrem Hauptprogramm aufrufen, in dem der ESP8266-Header enthalten ist.

Siehe ESP8266 Thing Hookup Guide .

Update:

yield() ist in Arduino.h definiert als:

void yield(void);

yield() wird auch in hooks.h wie folgt deklariert:

/**
 * 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")));

Auf Nano wird wahrscheinlich nichts ausgeführt (es sei denn, Sie verfügen über andere Bibliotheken #included).

25
Danny_ds

die Ausbeute ist eine "schwache" Funktion aus dem Arduino-Kern für den AVR. Ich sehe einen Anruf in der Verkabelung.c. 

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

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

Dies bedeutet, dass die Funktion Flows () während der Schleife der Verzögerungsfunktion ausgeführt wird. Der Ertrag wird also für einige Hintergrundverarbeitungen verwendet, während die Verzögerung endet, oder um eine Funktion mit Timeout-Funktion auszuführen. 

Hinweis: Der Ertrag muss in Anwendung/Skizze definiert werden 

UPDATE: Die Frage hat mich aufgeregt, ein kleines Post über Ertrag und andere verborgene Merkmale aus Arduino-Core zu erstellen. 

0
yahya tawil