第五十八课--Microduino执行多线程任务/zh
目的本教程将向大家介绍如何使Microduino执行多线程任务。 设备
介绍一般情况下,处理 Microduino的多个任务,是把所有任务放在 void loop() 里,然后用 delay() 控制时间。不过,任务一多,这种方法就不太方便了。 《时间触发嵌入式系统设计模式》,里面介绍的调度器,可以以特定的周期执行特定的任务,值得在 Microduino项目中借鉴。 出处:http://blanboom.org/arduino-task-scheduler-library.html 原理图程序 // Blink LEDs on digital pin 12 and 13
#include "TaskScheduler.h" // include this file to use this library
// the state of LEDs
boolean g_led1State=1;
boolean g_led2State=0;
void setup()
{
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
Sch.init(); // Initialize task scheduler
/*
* use Sch.addTask(task, start_time, period, priority) to add tasks
* task - tasks to be scheduled
* start_time - when the task starts (ms)
* period - repeat period of the task (ms)
* priority - 1: mormal priority, 0: high priority
*/
Sch.addTask(led1Update,0,1000,1); //从第 0 毫秒开始闪烁 LED,每隔 1s, LED 状态改变一次
Sch.addTask(led2Update,20,500,1); //从第 20 毫秒开始闪烁 LED,每隔 0.5s, LED 状态改变一次
Sch.start(); // Start the task scheduler
}
void loop()
{
Sch.dispatchTasks();
}
// Put task to be scheduled below
// Blink LED on pin 13
void led1Update()
{
if(g_led1State==0)
{
g_led1State=1;
digitalWrite(13,HIGH);
}
else
{
g_led1State=0;
digitalWrite(13,LOW);
}
}
// Blink LED on pin 12
void led2Update()
{
if(g_led2State==0)
{
g_led2State=1;
digitalWrite(12,HIGH);
}
else
{
g_led2State=0;
digitalWrite(12,LOW);
}
}
调试步骤一: 下载多线程函数库:[TaskScheduler] 复制到IDE的libraries文件夹中,重启IDE. 步骤二: 按照原理图搭建电路图
下载代码并运行 结果程序执行后,两个 LED 分别会以程序中指定的周期和时间闪烁。 更多功能介绍1. 添加抢占式任务 抢占式任务,简单说,就是优先级比正常任务(合作式任务)高的任务。在这个调度器中,抢占式任务可以打断正常任务,优先执行。 对于一些对时间精度要求较高的任务,可以将任务模式改为抢占式。 修改方法: 在添加任务的函数 Sch.addTask(任务名称,开始时间,执行周期,1) 函数中,将最后一个参数由 1 改为 0,即: Sch.addTask(任务名称,开始时间,执行周期,1) 这样,该任务就成了抢占式任务。 2. 添加单次执行的任务 可以添加只执行一次的任务,在一段时间后执行。 只需把 Sch.addTask(任务名称,开始时间,执行周期,1) 中的执行周期改为 0 即可。 3. 删除任务 使用函数 Sch.addTask(任务名称,开始时间,执行周期,1) 时,会返回这个任务的 ID,将这个 ID 赋给一个变量。需要删除任务时,用删除任务函数 Sch.DeleteTask(任务ID) ,就能把任务删除。 4. 调整被调度的任务数量 打开 TaskScheduler.h,找到 #define MAX_TASKS (10) ,将 10 修改为需要被调度的任务的数量。 5. 自动进入空闲模式 这个调度器能在没有任务的情况下自动进入空闲模式,以节省电量。不需要对程序进行其他修改。 6. 错误报告 打开 TaskScheduler.h,找到 //#define REPORT_ERRORS // Remove “//“ to enable error report, 将前面的 // 去掉,打开错误报告功能。 然后,这条语句的下面,定义了相关错误代码,可根据情况修改。 最后,打开 TaskScheduler.cpp,找到函数 void Schedule::_reportStatus(void),在里面添加合适的错误报告代码即可。 欢迎大家对这个调度器进行测试,找出 bug 和需要优化的地方。 视频 |