【问题标题】:What is the secret of the arduino `yield()`function?arduino `yield()` 函数的秘密是什么?
【发布时间】:2015-12-28 17:14:42
【问题描述】:

Arduino 文档在https://www.arduino.cc/en/Reference/Scheduler 解释了yield() 关于到期的问题。显然它是调度程序库的一部分:

#include <Scheduler.h>

但是,我可以在 Nano 或 ESP8266 上调用 yield(),而不包括调度程序库——但只能在我的主程序中,而不是在包含文件中。此外,包含不适用于我的非会费。

关于yield()yield() 在Due 以外的Arduino 平台上我想念什么秘密是什么?

【问题讨论】:

  • 您在主文件中包含的另一个标题是否包括Scheduler.h
  • 没有。你可以有一个只调用 yield() 的骨架草图,它会编译。一定有什么隐藏的魔法。如果你的反对意见是你的,请告诉我除了谷歌搜索宇宙之外我应该研究什么......

标签: arduino esp8266 arduino-ide


【解决方案1】:

但是,我可以在 Nano 或 ESP8266 上调用 yield() 而不包括 调度程序库

yield() 函数也在 ESP8266 库中实现:

产量

这是 ESP8266 和 更经典的Arduino微控制器。 ESP8266 运行很多 后台实用功能 - 保持 WiFi 连接,管理 TCP/IP 堆栈,并执行其他职责。阻止这些 运行中的函数可能导致 ESP8266 崩溃和重置 本身。为避免这些神秘的重置,请避免长时间的阻塞循环 在你的草图中。

ESP8266 Arduino 库的惊人创造者也实现了 一个 yield() 函数,它调用后台函数以允许 他们做他们的事。

这就是为什么您可以在包含 ESP8266 标头的主程序中调用 yield()

ESP8266 Thing Hookup Guide

更新

yield() 在 Arduino.h 中定义为:

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)。

【讨论】:

  • 谢谢——为什么在为 Nano 编译时这会起作用? yield 在其他非到期平台上是否为空占位符?
  • @andig - Nano 中是否包含其他库?
  • 嗯,它至少在 Arduino.h 中是这样定义的:void yield(void);。我会进一步查找,然后再回复您。
  • 虽然 yield 非常适合在后台处理网络内容,但它也引入了一个许多人没有意识到的问题:您有两个任务在 ESP8266 上运行 - 如果您这样做可能会损坏您的数据不够小心。我创建了一篇关于此问题的博文,请参阅euphi.github.io/2018/03/31/ArduinoESP8266-multipleTasks.html
  • 这是否意味着 delay 在 ESP 上不是真实的?
【解决方案2】:

yield 是 AVR 的 Arduino 核心的“弱”功能。我在wiring.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 将用于延迟结束时的某些后台处理或用于执行具有超时功能的功能。

注意:yield 必须在 application/sketch 中定义

更新:这个问题让我很兴奋能做一点post about yield and other hidden features from arduino core

猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2013-09-15
  • 2016-04-29
  • 2017-08-07
  • 1970-01-01
  • 2012-08-17
  • 2017-10-08
相关资源
最近更新 更多