
/**
 * 这是一个测试，证明处理器是否真的进入空闲睡眠状态。
 * 对于此设置：
 * 
 *
 
Task c(10, -1, &Count, &ts);
Task t(10000, 1, NULL, &ts, true, &tOn, &tOff);

结果是：

1): 启用 #define _TASK_SLEEP_ON_IDLE_RUN
在Arduino Uno上：
  开始
  c1=10771 - v2.5.0 (v1.9.0: 相同)
  c2=1001

在Teensy 3.5 (120MHz ARM)上：
  开始
  c1=21065
  c2=1001

在esp8266 (80 MHz)上
  开始
  c1=10492
  c2=1001
  
在STM32F103RCBT6 (Maple Mini @72 MHz)上：
  开始
  c1=21004
  c2=1001

和

2): 禁用（注释掉）#define _TASK_SLEEP_ON_IDLE_RUN
Arduino Uno:
  开始
  c1=722426 - v3.0.2
  c1=635735 - v2.5.0  
  c1=551947 - v1.9.0
  c2=1001

在Teensy 3.5 (120MHz ARM)上：
  开始
  c1=2690322
  c2=1001

在esp8266 (80 MHz)上
  开始
  c1=351085 (在160Mhz时为689833)
  c2=1001
  
在STM32F103RCBT6 (Maple Mini @72 MHz)上：
  开始
  c1=4665019
  c2=1001
  
场景2)中的C1远高于场景1)，因为处理器在1)中被置于睡眠状态，而在2)中则没有

 */


/**
 * 编译并运行一次启用_TASK_SLEEP_ON_IDLE_RUN，然后禁用_TASK_SLEEP_ON_IDLE_RUN再运行一次。
 * 比较结果。
 */
 
//#define _TASK_SLEEP_ON_IDLE_RUN  // 启用空闲时睡眠功能（注释掉以禁用）
#include <TaskScheduler.h>  // 包含任务调度器库

Scheduler ts;  // 创建调度器对象

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

// 任务定义
Task c(10, TASK_FOREVER, &Count, &ts);  // 计数任务：每10毫秒运行一次，无限期运行
Task t(10000, TASK_ONCE, NULL, &ts, true, &tOn, &tOff);  // 定时任务：10秒运行一次，运行一次，启用状态，有使能和禁用回调


volatile unsigned long c1, c2;  // 计数器变量

bool tOn() {
  c1 = 0;  // 重置计数器1
  c2 = 0;  // 重置计数器2
  c.enable();  // 启用计数任务
  
  return true;  // 返回true使任务启用
}

void tOff() {
  c.disable();  // 禁用计数任务
  Serial.print("c1=");Serial.println(c1);  // 打印计数器1值
  Serial.print("c2=");Serial.println(c2);  // 打印计数器2值
}

void setup() {
  Serial.begin(115200);  // 初始化串口通信，波特率115200
  delay(1000);  // 延时1秒等待串口稳定
  Serial.println("Start");  // 打印开始信息

  ts.startNow();  // 设置调度开始的时间点，从现在开始调度
  t.delay();  // 延迟启动定时任务
}

void Count() {
  c2++;  // 计数器2递增
}


void loop() {
  ts.execute();  // 执行调度器，运行所有已安排的任务
  c1++;  // 计数器1递增（在调度器空闲时执行）
}