从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示
Posted Naisu Xu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示相关的知识,希望对你有一定的参考价值。
文章目录
目的
Arduino for esp8266属于无操作系统环境,对于开发多任务的复杂应用还是比较麻烦的,所以这里就提供了一个近似于操作系统调度器的功能Ticker
。该功能使用非常简单,请看下面示例。
使用演示
基本使用1
基本使用就四个步骤:
- 引入头文件
#include "Ticker.h"
; - 建立调度任务对象;
- 编写回调函数;
- 使用
attach()
或attach_ms()
方法设置并启用调度任务;
#include "Ticker.h" //引入调度器头文件
Ticker myTicker; //建立一个需要定时调度的对象
void tickerHandle() //到时间时需要执行的任务
Serial.println(millis()); //打印当前时间
void setup()
Serial.begin(115200);
Serial.println();
myTicker.attach(0.5, tickerHandle); //初始化调度任务,每0.5秒执行一次tickerHandle()
void loop()
基本使用2
上例中回调函数是单独建立的,当然也可以直接使用匿名函数方式:
#include "Ticker.h"
Ticker myTicker; //建立一个需要定时调度的对象
void setup()
Serial.begin(115200);
Serial.println();
myTicker.attach_ms(1000, []() Serial.println(millis()); ); //相当于myTicker.attach(1, []()Serial.println(millis()););
void loop()
动态设置和参数传递
可以使用attach()
或attach_ms()
方法动态更改调度时间间隔,并且还可以传入一个不大于4字节的参数:
#include "Ticker.h"
Ticker myTicker;
int count = 0;
void tickerHandle(int data)
Serial.println(millis());
Serial.println(data);
count++; //改变变量值
myTicker.attach_ms(data*100, tickerHandle, count); //重新设置
void setup()
Serial.begin(115200);
Serial.println();
myTicker.attach(1, tickerHandle, count); //初始化调度任务,并传入参数
void loop()
停止和重启任务
可以使用detach()
方法停止任务:
#include "Ticker.h"
Ticker myTicker1;
Ticker myTicker2;
void tickerHandle1()
Serial.println(millis());
myTicker1.detach(); //停止当前任务
void tickerHandle2()
Serial.println("start myTicker1");
myTicker1.attach(0.5, tickerHandle1); //重新开始myTicker1
void setup()
Serial.begin(115200);
Serial.println();
myTicker1.attach(0.5, tickerHandle1);
myTicker2.attach(2, tickerHandle2);
void loop()
注意事项
上面的演示中我在任务调度的回调函数中进行了串口打印操作,实际使用中并不推荐在回调函数中进行网络、串口、文件等耗时操作,可以在回调函数中设置标志位,然后再loop()
中查询该标志来执行任务。
It is currently not recommended to do blocking IO operations (network, serial, file) from Ticker callback functions. Instead, set a flag inside the ticker callback and check for that flag inside the loop function.
示例如下:
#include "Ticker.h"
Ticker myTicker;
bool printReady = false; //打印工作标志
void tickerHandle()
printReady = true; //更新标志
void setup()
Serial.begin(115200);
Serial.println();
myTicker.attach(0.5, tickerHandle);
void loop()
if (printReady) //如果printReady==true
printReady = false; //printReady重置
Serial.println(millis()); //打印当前时间
总结
可以看到有了Ticker
之后开发多任务的应用将变得简单可控了,更多的内容可以参考如下:
官方说明:https://arduino-esp8266.readthedocs.io/en/latest/libraries.html#ticker
源码和示例:https://github.com/esp8266/Arduino/tree/master/libraries/Ticker
另一种调度器:https://github.com/Toshik/TickerScheduler
以上是关于从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示的主要内容,如果未能解决你的问题,请参考以下文章
使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker
MicroPython ESP32/8266定时器中断示例解析
ESP 保姆级教程疯狂毕设篇 —— 案例:基于ESP8266和巴法云的教室灯光人工控制定时控制系统(完整设计思路与细节)