从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示

目的

Arduino for esp8266属于无操作系统环境,对于开发多任务的复杂应用还是比较麻烦的,所以这里就提供了一个近似于操作系统调度器的功能Ticker。该功能使用非常简单,请看下面示例。

使用演示

基本使用1

基本使用就四个步骤:

  1. 引入头文件#include "Ticker.h"
  2. 建立调度任务对象;
  3. 编写回调函数;
  4. 使用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

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
ESP8266的定时中断是通过硬件定时来实现的。ESP8266有两个硬件定时Timer0和Timer1。 Timer0是一个8位定时,可以设置为分频模式或定时模式。在分频模式下,它可以将外部时钟源分频为系统时钟的1、8、64、256或1024倍。在定时模式下,它可以在一定的时间间隔内产生中断。 Timer1是一个16位定时,可以设置为定时模式或输入捕获模式。在定时模式下,它可以在一定的时间间隔内产生中断。在输入捕获模式下,它可以捕获外部事件的时间戳。 在ESP8266中,我们可以使用ESP8266 Arduino库提供的函数来设置定时中断。下面是一个简单的例子,演示了如何使用Timer1来产生1秒钟的定时中断: ``` #include <ESP8266WiFi.h> #include <Ticker.h> Ticker timer; void setup() { Serial.begin(115200); timer.attach(1.0, timerCallback); } void loop() { // do something } void timerCallback() { Serial.println("Timer interrupt"); } ``` 在这个例子中,我们使用ESP8266 Arduino库提供的Ticker类来设置定时中断。在setup()函数中,我们调用了timer.attach(1.0, timerCallback)函数来设置定时中断,其中1.0表示定时中断的时间间隔为1秒钟,timerCallback是定时中断回调函数的名称。在timerCallback()函数中,我们输出了一条消息,用于表示定时中断已经触发。在loop()函数中,我们不需要做任何事情,因为定时中断会在后台自动触发。 总之,ESP8266的定时中断是通过硬件定时来实现的,我们可以使用ESP8266 Arduino库提供的函数来设置定时中断。定时中断可以用于周期性地执行某些任务,例如采集传感数据、控制执行等。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值