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

时间:2015-12-28 17:14:42

标签: arduino esp8266 arduino-ide

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

#include <Scheduler.h>

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

关于yield()yield()在除Ar之外的Arduino平台上做什么,我错过了什么秘密?

3 个答案:

答案 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堆栈保持运行状态。