查看: 12431|回复: 24
[Arduino库]又一个任务调度器,更好地处理多任务
本帖最后由 Blanboom 于
23:09 编辑
论坛里也有人写过类似的库,看样子更简洁一些,占用资源应该会更小:
而我写的就复杂了点,不过功能多了点,例如支持抢占式任务,错误报告,以及自动进入空闲模式。
可根据实际情况选择使用哪个库。
[2015 年 2 月 8 日更新]:由于此类任务调度器不能主动结束掉任务,所以在使用时,需要尽可能降低各个任务在每次执行时消耗的时间。这个帖子介绍了一种方法:
下载地址:
我的博客中的介绍:
一般情况下,处理 Arduino 的多个任务,是把所有任务放在 void loop() 里,然后用 delay() 控制时间。不过,任务一多,这种方法方便了。
最近刚刚看了一本书:《时间触发嵌入式系统模式设计》,里面介绍的调度器,可以以特定的周期执行特定的任务,值得在 Arduinio 项目中借鉴。我也刚刚把这个调度器移植到 Arduino 中:
基本使用方法
这是一个使用调度器的例子,各个函数的功能都已在注释中标出:
[pre lang=&arduino& line=&1&]// Arduino 任务调度器 演示程序
// Created by Blanboom
#include &TaskScheduler.h&&&//包含此头文件,才能使用调度器
// 用于储存 LED 状态
boolean g_led1State=1;
boolean g_led2State=0;
void setup()
& & // 第12、13脚接有 LED
& & pinMode(13,OUTPUT);
& & pinMode(12,OUTPUT);
& & Sch.init(); //初始化调度器
& & //向调度器中添加任务
& & //第一个参数为要添加任务的函数名
& & //第二个参数为任务第一次执行的时间,
& & //& & 合理设置有利于防止任务重叠,有利以提高任务执行的精度
& & //第三个参数是任务执行的周期
& & //第二、三个参数的单位均为毫秒,也可配置定时器修改其单位
& & //第四个参数代表任务是合作式还是抢占式
& & //& & 一般取1就可以,更多用法请参考下文
& & Sch.addTask(led1Update,0,1000,1);&&//从第 0 毫秒开始闪烁 LED,每隔 1s, LED 状态改变一次
& & Sch.addTask(led2Update,20,500,1);&&//从第 20 毫秒开始闪烁 LED,每隔 0.5s, LED 状态改变一次
& & Sch.start();//启动调度器
void loop()
& & Sch.dispatchTasks();&&// 执行被调度的任务,用调度器时放上这一句即可
// 把要调度的任务函数放下面
// 闪烁第 13 脚的 LED
void led1Update()
& & if(g_led1State==0)
& && &&&g_led1State=1;
& && &&&digitalWrite(13,HIGH);
& && &&&g_led1State=0;
& && &&&digitalWrite(13,LOW);
// 闪烁第 12 脚的 LED
void led2Update()
& & if(g_led2State==0)
& && &&&g_led2State=1;
& && &&&digitalWrite(12,HIGH);
& && &&&g_led2State=0;
& && &&&digitalWrite(12,LOW);
程序执行后,两个 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. 调整被调度的任务数量
打开 Scheduler.h,找到 #define MAX_TASKS& &(10) ,将 10 修改为需要被调度的任务的数量。
5. 自动进入空闲模式
这个调度器能在没有任务的情况下自动进入空闲模式,以节省电量。不需要对程序进行其他修改。
6. 错误报告
打开 Scheduler.h,找到
//#define REPORT_ERRORS // Remove “//” to enable error report,
将前面的 // 去掉,打开错误报告功能。
然后,这条语句的下面,定义了相关错误代码,可根据情况修改。
最后,打开 Scheduler.cpp,找到函数 void Schedule::_reportStatus(void),在里面添加合适的错误报告代码即可。
欢迎大家对这个调度器进行测试,找出 bug 和需要优化的地方。
楼主高人&&
很不错的说.......
Mark........
学习了~~~~
学习学习学习
学习学习………
好是好,但是真正的问题是,A任务需要执行80ms,B任务需要执行10ms, A任务占用很长时间,如果按时间片轮转的话, A任务需要打断,切换到B任务, 但是怎么保存切换的上下文,让A任务能够继续运行呢,就好像中断返回一样。
能自己写类就是好。LS考虑的对,如何考虑任务本身的时间?要有个策略。
本帖最后由 picfan 于
21:40 编辑
这个库主要是靠timer中断方式写出来的(没仔细看过,但八九不离十)
既然是中断
就还是回归单晶片的观念
&进入中断,执行中断副程式的时间越短越好&
一般使用(特殊例外)上都是查询并记录后即跳出居多
回主程式后再依纪录结果作相对应的处理工作
在中断副程式内使用大量运算甚至使用delay是大忌
Powered by热门搜索:
您的位置: -&
突飞电竞CZ 单人任务版 中文版
游戏大小:845.1MB
游戏语言:简体中文
游戏类型:
更新日期:
游戏环境:Win7/Vista/WinXP/
游戏专题:
【突飞电竞CZ 单人任务版 中文版游戏截图】
【突飞电竞CZ 单人任务版 中文版介绍】
这是零点行动(CZ)的单人任务版,与CS1.6和CZ一样,都是基于HL引擎,该版本包括众多的国际反恐任务,让你亲自扮演自不同国家的反恐***,与不同地区的恐怖分子斗智斗勇,任务紧张而丰富,值得一试。
点新建游戏即可开始任务
点世界地图即可选择任务
界面全中文,语音英文,有中文提示
难得的机会~多达20多种任务~
有秘密潜入侦察任务,有秘密潜入营救任务,有突击大楼、恐怖份子轮船、恐怖份子营地任务,有秘密潜入仓库偷拍证据任务、夺回恐怖分子持有的核
重要提示:
此款游戏需在游戏盒环境下运行使用,游戏盒会随此游戏一起***。
突飞电竞CZ 单人任务版 中文版全部攻略
游戏标签:
玩过突飞电竞CZ 单人任务版 中文版的人还玩过
大小:2.42GB
大小:4.81GB
大小:1.4MB
大小:15MB
大小:201.9MB
飞行射击/303.99MB
飞行射击/29.97MB
飞行射击/303.94MB
飞行射击/14242.2MB
飞行射击/151.55MB
飞行射击/5609.11MB
飞行射击/2450.83MB
飞行射击/325.49MB
单机游戏排行榜
大小:2.7GB
大小:2.16GB
大小:875KB
大小:5.0GB
大小:1.16GB
大小:4.54GB
大小:1.8MB
大小:67.5MB
大小:4.6GB
大小:145.8MB
大小:3.38GB
大小:289.2MB
资源统计:无插件软件:96334个 无病毒软件:96632个 昨日已处理148个带插件、病毒的软件
本站总软件:96632个 软件总下载次数:22.601亿次
软件教程文章:99849篇 总浏览次数:3.206亿次 上传我的文档
下载
收藏
该文档贡献者很忙,什么也没留下。
下载此文档
正在努力加载中...
信息技术会考题一
下载积分:1000
内容提示:信息技术会考题一
文档格式:TXT|
浏览次数:2|
上传日期: 09:55:05|
文档星级:
该用户还上传了这些文档
信息技术会考题一
官方公共微信