多執行緒庫SCoop應用 之 任務
阿新 • • 發佈:2019-02-09
使用該庫的【任務】功能,首先要做三件事:
第二:setup函式裡,呼叫mySCoop.start()命令
void setup() {
mySCoop.start();
}
第三:loop函式裡,呼叫yield()命令
void loop() {
yield();
}
接下來就可以使用【任務】了。有兩種定義方式,請繼續往下看:
1、完整定義:定義【任務】的setup和loop兩個函式。
定義一個名字為“TaskTest”的任務:
defineTask(TaskTest); //用defineTask定義一個任務,名為TaskTest
void TaskTest::setup() //定義該任務的setup()函式,用於初始化設定。
{
//這裡是任務的setup函式的內容
}
void TaskTest::loop() //定義該任務的loop()函式,用於迴圈執行程式碼。
{
//這裡是任務的loop函式的內容
}
2、快速定義:僅定義任務的loop函式
如果這個執行緒中執行的動作不需要初始化setup,只需要迴圈loop的話,可以直接使用defineTaskLoop()快速定義該執行緒任務,如下:
defineTaskLoop(TaskTest1)
{
//這裡是任務的loop函式的內容
}
注意一點,使用此庫之後,請使用sleep(ms)作為延時,不要用delay()了。
因為sleep(ms)只針對當前執行緒。而delay(ms)是針對全域性的。
最後來一個完成的演示吧,2個LED分別以100毫秒和1秒的速度閃爍。12和13引腳分別接LED,然後執行程式碼看看效果吧。
#include "SCoop.h"
//完整定義
defineTask(TaskTest);
void TaskTest::setup()
{
pinMode(13, OUTPUT);
}
void TaskTest::loop()
{
digitalWrite(13, HIGH);
sleep(1000);
digitalWrite(13, LOW);
sleep(1000);
}
//快速定義
defineTaskLoop(TaskTest1)
{
digitalWrite(12, HIGH);
sleep(100);
digitalWrite(12, LOW);
sleep(100);
}
void setup() {
pinMode(12, OUTPUT);
mySCoop.start();
}
void loop()
{
yield();
}