Arduino的多任務管理

今天在一個小東西,需要實現在arduino上兩個led燈不同頻率閃爍,這就麻煩了,以爲arduino同時只能實現一個函數的運行,
一般情況下,處理 Arduino 的多個任務,是把所有任務放在 void loop() 裏,然後用 delay() 控制時間。不過,任務一多,這種方法就不太方便了。
這個時候我在網上找到了一篇博客,他利用任務調度器來實現多任務運行。
我貼出代碼,大家可以參考一下

#include "TaskScheduler.h"  //包含此頭文件,才能使用調度器

// 用於儲存 LED 狀態
boolean g_led1State=1;
boolean g_led2State=0;

void setup()
{
    // 第12、13腳接有 LED
    pinMode(13,OUTPUT);
    pinMode(12,OUTPUT);

    Sch.init(); //初始化調度器

    //向調度器中添加任務
    //第一個參數爲要添加任務的函數名
    //第二個參數爲任務第一次執行的時間,
    //    合理設置有利於防止任務重疊,有利以提高任務執行的精度
    //第三個參數是任務執行的週期
    //第二、三個參數的單位均爲毫秒,也可配置定時器修改其單位
    //第四個參數代表任務是合作式還是搶佔式
    //    一般取1就可以,更多用法請參考下文
    Sch.addTask(led1Update,0,1000,1);  //從第 0 毫秒開始閃爍 LED,每隔 1s, LED 狀態改變一次
    Sch.addTask(led2Update,20,500,1);  //從第 20 毫秒開始閃爍 LED,每隔 0.5s, LED 狀態改變一次

    Sch.start();//啓動調度器
}

void loop()
{
    Sch.dispatchTasks();  // 執行被調度的任務,用調度器時放上這一句即可
}

// 把要調度的任務函數放下面

// 閃爍第 13 腳的 LED
void led1Update()
{
    if(g_led1State==0)
    {
        g_led1State=1;
        digitalWrite(13,HIGH);
    }
    else
    {
        g_led1State=0;
        digitalWrite(13,LOW);
    }
}

// 閃爍第 12 腳的 LED
void led2Update()
{
    if(g_led2State==0)
    {
        g_led2State=1;
        digitalWrite(12,HIGH);
    }
    else
    {
        g_led2State=0;
        digitalWrite(12,LOW);
    }
}

代碼的頭文件
程序執行後,兩個 LED 分別會以程序中指定的週期和時間閃爍。
更多功能

大神原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章