Arduino文档在https://www.arduino.cc/en/Reference/Scheduler解释yield()
关于到期日的问题。显然它是Scheduler库的一部分:
#include <Scheduler.h>
但是,我可以在我的Nano或ESP8266上调用yield()
而不包括调度程序库 - 但仅限于我的主程序,而不是内部包含文件。此外,包含不适用于我的非会费。
关于yield()
或yield()
在除Ar之外的Arduino平台上做什么,我错过了什么秘密?
答案 0 :(得分:26)
但是,我可以在我的Nano或ESP8266上调用yield()而不包括 调度程序库
google.load('visualization', '1', {packages: ['corechart', 'line']});
google.setOnLoadCallback(drawAxisTickColors);
function drawAxisTickColors() {
var data = new google.visualization.DataTable();
data.addColumn('datetime', 'Date');
data.addColumn('number', 'Price');
var dateArr2 = (<?php echo json_encode($dateArr); ?>).reverse();
// for (i = 0; i < dateArr2.length; i++) {
// dateArr2[i] = dateArr2[i].split(/[- :]/);
// }
var bitcoinArr = (<?php echo json_encode($bitcoinPriceArr); ?>).reverse();
var length = Math.min(dateArr2.length, bitcoinArr.length);
var rows = [];
for (var i = 0; i < length; ++i) {
rows.push([new Date((dateArr2[i]).replace(/-/g, '/')), bitcoinArr[i]]);
}
data.addRows(rows);
var options = {
// backgroundColor: '#E4E4E4',
curveType: 'function',
chartArea: {
left: 0,
top: 0,
right: 0,
bottom: 0,
width: "100%",
height: "100%"
},
hAxis: {
textPosition: 'none',
baselineColor: 'none',
gridlines: {
color: 'none'
},
},
vAxis: {
textPosition: 'none',
baselineColor: 'none',
gridlines: {
color: 'none'
}
},
colors: ['#2098d4', '#ffffff'],
legend: 'none'
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
功能也在 ESP8266 库中实现:
<强>屈服强>
这是ESP8266和a之间最重要的差异之一 更经典的Arduino微控制器。 ESP8266运行很多 实用功能在后台 - 保持WiFi连接,管理 TCP / IP堆栈,并执行其他职责。阻止这些 运行中的功能可能导致ESP8266崩溃和重置 本身。为了避免这些神秘的重置,请避免长时间的阻塞循环 在你的草图中。
ESP8266 Arduino库的惊人创作者也实现了 yield()函数,它调用后台函数允许 他们做他们的事。
这就是为什么你可以在包含ESP8266标题的主程序中调用yield()
的原因。
请参阅ESP8266 Thing Hookup Guide。
<强>更新强>:
yield()
在Arduino.h中定义为:
yield()
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
)。
答案 1 :(得分:0)
收益率很低&#34;功能来自Arduino核心AVR。我在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()函数将在延迟函数循环期间执行。因此,在延迟结束时或者用于执行具有超时功能的功能时,产量将用于一些后台处理。
注意:必须在application / sketch
中定义yield更新:这个问题让我兴奋地做了一点post about yield and other hidden features from arduino core。
答案 2 :(得分:0)
Detailed Explanation about yield() 我在ESP8266中找到了关于使用yield()的非常详细的说明。 据我了解,ESP8266需要定期运行Wifi堆栈,否则ESP将从路由器中退出。因此,抛出yield()函数将使您的Wifi堆栈保持运行状态。