web-dev-qa-db-fra.com

Quel est le secret de la fonction arduino `yield ()`?

Les documents Arduino expliquent yield() à https://www.arduino.cc/en/Reference/Scheduler en ce qui concerne Due. Apparemment, il fait partie de la bibliothèque Scheduler:

#include <Scheduler.h>

Cependant, je peux appeler yield() sur mon Nano ou ESP8266 sans inclure la librairie Scheduler, mais uniquement dans mon programme principal et non dans les fichiers d'inclusion. En outre, l'inclusion ne fonctionne pas sur mes non-cotisations.

Quel est le secret qui me manque à propos de yield() ou de ce que yield() fait sur les plateformes Arduino autres que Due?

12
andig

Cependant, je peux appeler yield () sur mon Nano ou ESP8266 sans inclure le planificateur lib

La fonction yield() est également implémentée dans les bibliothèques ESP8266:

Rendement

C’est l’une des différences les plus critiques entre l’ESP8266 et un microcontrôleur plus classique Arduino. L’ESP8266 utilise beaucoup de fonctions utilitaires en arrière-plan - garder le WiFi connecté, gérer la pile TCP/IP et effectuer d'autres tâches. En les bloquant L’exécution de certaines fonctions peut provoquer le blocage et la réinitialisation de l’ESP8266. lui-même. Pour éviter ces réinitialisations mystérieuses, évitez les longues boucles bloquantes dans votre croquis.

Les incroyables créateurs des bibliothèques ESP8266 Arduino ont également implémenté une fonction yield (), qui appelle les fonctions d'arrière-plan pour autoriser qu'ils fassent leurs affaires.

C'est pourquoi vous pouvez appeler yield() à partir de votre programme principal où l'en-tête ESP8266 est inclus.

Voir Guide de raccordement des choses ESP8266 .

Mettre à jour:

yield() est défini dans Arduino.h comme suit:

void yield(void);

yield() est également déclaré dans hooks.h comme suit:

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

Donc, sur la Nano, cela ne fait probablement rien (sauf si vous avez d'autres bibliothèques #included).

25
Danny_ds

le rendement est une fonction "faible" du noyau Arduino pour AVR. Je vois un appel pour cela à cablage.c. 

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

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

Cela signifie que la fonction yield () sera exécutée pendant la boucle de la fonction delay. Ainsi, le rendement serait utilisé pour certains traitements en arrière-plan pendant la fin du délai ou pour effectuer une fonction avec une fonction de temporisation. 

Remarque: le rendement doit être défini dans l'application/l'esquisse 

MISE À JOUR: La question me rendait heureux de faire un petit { message sur le rendement et d’autres caractéristiques cachées de Arduino Core

0
yahya tawil