Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
arduino`yield()`函数的秘密是什么?_Arduino_Esp8266_Arduino Ide - Fatal编程技术网

arduino`yield()`函数的秘密是什么?

arduino`yield()`函数的秘密是什么?,arduino,esp8266,arduino-ide,Arduino,Esp8266,Arduino Ide,Arduino文档解释了有关到期的yield()at。显然,它是计划程序库的一部分: #include <Scheduler.h> #包括 但是,我可以在我的Nano或ESP8266上调用yield(),而不包括调度程序库——但只能在我的主程序中调用,而不能在include文件中调用。此外,包括对我的非会费不起作用 关于yield()或者-Due以外的yield()在Arduino平台上做什么 但是,我可以在Nano或ESP8266上调用yield(),而不包括 调度程序库 yi

Arduino文档解释了有关到期的
yield()
at。显然,它是计划程序库的一部分:

#include <Scheduler.h>
#包括
但是,我可以在我的Nano或ESP8266上调用
yield()
,而不包括调度程序库——但只能在我的主程序中调用,而不能在include文件中调用。此外,包括对我的非会费不起作用

关于
yield()
或者-Due以外的
yield()
在Arduino平台上做什么

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

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

屈服

这是ESP8266和a之间最关键的区别之一 更经典的Arduino微控制器。ESP8266运行了大量数据 后台实用功能–保持WiFi连接,管理 TCP/IP堆栈,并执行其他任务。阻止这些 运行的功能可能导致ESP8266崩溃和复位 它本身要避免这些神秘的重置,请避免长的阻塞循环 在你的素描里

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

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

更新

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
上,它可能不起任何作用(除非您有其他库
#包括在内)。

对于AVR来说,yield是Arduino core的一个“弱”功能。我看到有人在接线中要求它

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

    while (ms > 0) {
        yield();
        while ( ms > 0 && (micros() - start) >= 1000) {
            ms--;
            start += 1000;
        }
    }
}
这意味着yield()函数将在delay函数的循环期间执行。因此,在延迟结束时,yield将用于某些后台处理,或者用于执行具有超时功能的函数

注:屈服强度必须在应用/草图中定义


更新:这个问题让我很激动,想做点什么

是包含在主文件中的另一个头文件,包括
Scheduler.h
?否。可以有一个只调用yield()的框架草图,它将编译。一定有什么隐藏的魔法。如果否决票是你的,请让我知道除了谷歌上下搜索宇宙之外,我还应该研究什么……谢谢你——为什么在为Nano编译时会这样做?在其他非到期平台上,yield是否为空占位符?@andig-Nano上是否包含其他库?至少在Arduino.h中定义为:
void yield(void)。我会进一步查找,然后再回来找你。虽然允许在后台处理网络内容非常好,但它也引入了一个许多人都没有意识到的问题:您的ESP8266上运行着两个任务,如果您不够小心,您可能会损坏数据。我写了一篇关于这个问题的博文,请参阅。这是否意味着ESP上的
delay
不真实?