问题缘由

Arduino 程序一般是顺序执行的,虽然内置了如 millis()micros()delay()delayMicroseconds() 这样的时间函数,但要么依赖于不断的循环,要么对整个程序造成阻塞,无法完成真正的多任务并行处理。

TaskScheduler 是一个为 Arduino 提供任务调度支持的第三方库,借助这个它可以实现复杂的多任务调度,本文做一个最简单的 Example


TaskScheduler 的安装

  • 点击 Arduino IDE 菜单栏中的 工具 - 管理库... 打开库管理工具

  • 搜索 TaskScheduler,并安装


TaskScheduler 的使用

  • 需引用、定义、声明的内容:
//include 头文件
#include <TaskScheduler.h>
//声明回调函数
void task_1();
void task_2();
//声明计划任务
//TASK_ONCE 执行一次;TASK_FOREVER 永不停止
Task t1(3000, TASK_FOREVER, &task_1);  //循环周期3000ms,永不停止,回调task_1
Task t2(1000, 20, &task_2);  //循环周期1000ms,循环20次,回调task_2
//调度器声明
Scheduler Sch;

//回调函数定义
void task_1()
{
  Serial.print("Task 1\n");
}
void task_2()
{
  Serial.print("Task 2\n");
}
  • 需写在 void setup() 中的内容:
void setup() {
  //调度器初始化
  Sch.init();
  //添加任务
  Sch.addTask(t1);
  Sch.addTask(t2);
}
  • 需写在 void loop() 中的内容:
void loop() {
  //执行调度器
  Sch.execute();
}
  • 控制任务的方法

    • 需要自动定期执行的,可写在 void setup()
    • 需要用其他函数控制的,则写在需要的地方
//使任务生效(开始运行)
t1.enable();
//使任务失效(停止运行)
//注意:disable任务并不会重置循环次数
t1.disable();