arduino`yield()`函数的秘密是什么?
Arduino文档解释了有关到期的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
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
不真实?