Saltar al contenido

¿Cuál es el secreto de la función `yield()` de arduino?

Posteriormente a observar en diferentes repositorios y páginas al terminar nos hemos encontrado la solución que te compartimos pronto.

Solución:

Sin embargo, puedo llamar a yield() en mi Nano o ESP8266 sin incluir la biblioteca del Programador

los yield() La función también se implementa dentro del ESP8266 bibliotecas:

Flexible

Esta es una de las diferencias más críticas entre el ESP8266 y un microcontrolador Arduino más clásico. El ESP8266 ejecuta una gran cantidad de funciones de servicios públicos en segundo plano: mantener WiFi conectado, administrar la pila TCP/IP y realizar otras tareas. Bloquear la ejecución de estas funciones puede hacer que el ESP8266 se bloquee y se reinicie. Para evitar estos reinicios misteriosos, evite los bucles de bloqueo largos en su boceto.

Los asombrosos creadores de las bibliotecas Arduino ESP8266 también implementaron una función yield()que recurre a las funciones en segundo plano para permitirles hacer sus cosas.

Por eso puedes llamar yield() desde dentro de su programa principal donde se incluye el encabezado ESP8266.

Consulte la Guía de conexión de objetos ESP8266.

Actualizar:

yield() se define en Arduino.h como:

void yield(void);

yield() también se declara en hooks.h como sigue:

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

Entonces, en el Nanoprobablemente no haga nada (a menos que tenga otras bibliotecas #included).

yield es una función “débil” del núcleo de Arduino para AVR. Veo una llamada para ello dentro del cableado.c.

void delay(unsigned long ms)

    uint32_t start = micros();

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

Esto significa que la función yield() se ejecutará durante el bucle de la función de retraso. Por lo tanto, el rendimiento se usaría para algún procesamiento en segundo plano mientras finaliza el retraso o para realizar una función con la función de tiempo de espera.

Nota: el rendimiento debe definirse en la aplicación/croquis

ACTUALIZACIÓN: La pregunta me entusiasmó para hacer una pequeña publicación sobre el rendimiento y otras características ocultas del núcleo de arduino.

Tienes la opción de añadir valor a nuestro contenido añadiendo tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *