從零開始的ESP8266探索(11)-定時任務調度器Ticker使用演示


文章目錄
目的
使用演示
基本使用1
基本使用2
動態設置和參數傳遞
停止和重啟任務
注意事項
總結
目的
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
————————————————
版權聲明:本文為CSDN博主「Naisu_kun」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Naisu_kun/article/details/85165262


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM