
/**
 * 这是TaskScheduler执行的基准测试。
 * 
 * 此测试执行1,000,000个空回调方法的任务周期
 * 使用不同选项编译，您可以评估每个选项对Task对象大小的影响
 * 以及主执行路径的执行开销。
 *
 * 下面提供了示例执行时间（每1M迭代的毫秒数）。
 * 测试板是Arduino UNO 16MHz处理器。
 *
 
TaskScheduler 2.1.0:
无修饰符
持续时间=19869

带睡眠
持续时间=20058

带状态请求：
持续时间=20058

带时间关键：
持续时间=27289


TaskScheduler 1.9.0:
无修饰符
持续时间=15656

带睡眠
持续时间=16285

带状态请求：
持续时间=16600

带回滚修复：
持续时间=18109


TaskScheduler 1.8.5:
持续时间=15719

带睡眠
持续时间=16348

带状态请求：
持续时间=18360

带回滚修复：
持续时间=18423

 */


//#define _TASK_TIMECRITICAL     // 启用监控调度超时
//#define _TASK_STATUS_REQUEST     // 编译时支持状态请求功能 - 除了时间之外，还触发任务状态更改事件
//#define _TASK_WDT_IDS          // 编译时支持看门狗控制点和任务ID
//#define _TASK_LTS_POINTER      // 编译时支持本地任务存储指针
//#define _TASK_SLEEP_ON_IDLE_RUN  // 启用空闲时睡眠功能
//#define _TASK_MICRO_RES        // 启用微秒分辨率
#include <TaskScheduler.h>        // 包含任务调度器库

Scheduler ts;  // 调度器对象

// 回调方法原型
bool tOn(); void tOff();
void callback();

// 任务
Task t(TASK_IMMEDIATE, 1000000, &callback, &ts, false, &tOn, &tOff);  // 任务：立即启动，100万次迭代，回调函数callback，绑定到调度器ts，初始禁用，有使能和禁用回调

unsigned long c1, c2;  // 时间变量，用于记录开始和结束时间

bool tOn() {
  c1 = millis();  // 记录开始时间
  c2 = 0;  // 重置结束时间
  
  return true;  // 返回true使任务启用
}

void tOff() {
  c2 = millis();  // 记录结束时间
  Serial.println("done.");  // 打印完成信息
  Serial.print("Tstart =");Serial.println(c1);  // 打印开始时间
  Serial.print("Tfinish=");Serial.println(c2);  // 打印结束时间
  Serial.print("Duration=");Serial.println(c2-c1);  // 打印持续时间
}

void setup() {
  // 在这里放置您的设置代码，运行一次：
  Serial.begin(115200);  // 初始化串口通信，波特率115200
  Serial.print("Start...");  // 打印开始信息

  t.enable();  // 启用任务
}

void callback() {
  // 空回调函数 - 用于基准测试
}


void loop() {
  // 在这里放置您的主代码，重复运行：
  ts.execute();  // 执行调度器，运行所有已安排的任务
}
