查看“第五十八课--Microduino执行多线程任务/zh”的源代码
←
第五十八课--Microduino执行多线程任务/zh
跳转至:
导航
、
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
{| style="width: 800px;" |- | ==目的== 本教程将向大家介绍如何使Microduino执行多线程任务。 ==设备== *'''[[Microduino-Core/zh]]''' *'''[[Microduino-USBTTL/zh]]''' *其他硬件设备 **USB数据连接线 一根 **面包板跳线 一盒 **LED灯 两个 **1K欧姆电阻 两个 ==介绍== 一般情况下,处理 Microduino的多个任务,是把所有任务放在 void loop() 里,然后用 delay() 控制时间。不过,任务一多,这种方法就不太方便了。 《时间触发嵌入式系统设计模式》,里面介绍的调度器,可以以特定的周期执行特定的任务,值得在 Microduino项目中借鉴。 出处:http://blanboom.org/arduino-task-scheduler-library.html ==原理图== [[File:MicroduinoMultiThreadSchematic.png|600px|center|thumb]] ==程序== <source lang="cpp"> // 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); } } </source> ==调试== 步骤一: 下载多线程函数库:[[https://github.com/blanboom/Arduino-Task-Scheduler TaskScheduler]] 复制到IDE的libraries文件夹中,重启IDE. 步骤二: 按照原理图搭建电路图 [[File:MicroduinoMultiThreadConnected.png|600px|center|thumb]] 步骤三: 下载代码并运行 ==结果== 程序执行后,两个 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 和需要优化的地方。 ==视频== |}
返回至
第五十八课--Microduino执行多线程任务/zh
。
导航菜单
个人工具
创建账户
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
Welcome
首页
创客大赛
大赛详情
3D打印
安装月球车
图形化编程
操控月球车
升级月球车
编程工具下载
软件下载
Arduino
Processing
Mixly
Scratch
模块套件
Microduino 102
mCookie 102
mCookie 202
mCookie 302
IBC
其他
应用套件
四轴飞行器
平衡车
小车CUBE
音乐播放器
刷卡音乐播放器
wifi气象站
彩虹音乐触摸灯
分贝检测仪
迎门汇报
LED点阵时钟
LED点阵屏幕
硬件
mCookie
Sensor
Microduino
MicroWrt
MicroNux
MicroRobot-Core
MicroRobot-CoreESP
ideaBoard
ideaBox
MicroMV
MicroAI
帮助
常见问题
帮助
工具
链入页面
相关更改
特殊页面
页面信息