当前要闻:一款轻量级的定时器调度器(开源)
扫描关注一起学嵌入式,一起学习,一起成长
从理论上来说,以上 3 种方式中,第 3 种采用定时器设定标志位的方法最好。因为首先主程序不用阻塞,在等待的时间里,MCU 完全可以去做其他的事情,其次 在定时器中断里不用占用太多的时间,节约中断资源。
但这种方式有个缺点,就是实现起来相对麻烦一些。因为,如果你要有 N 个runlater的需求,那么就得设置N个标志位,还要考虑定时器的分配、设定。在程序主While循环里也会遍布N个查询标志位的if语句。如果N足够多,其实大于5个,就会比较头疼。这样会使主While循环看起来很乱。这样的实现不够简洁、优雅。
SmartTimer 首先解决的就是这个问题,它可以优雅地延迟调用某函数。
(资料图片仅供参考)
Runloop
在定时器编程方面还有另一个典型需求,就是“每隔xxx毫秒运行一次XXX函数,一共运行XXX次”。这个实现起来和 runlater差不多,就是加一个运行次数的技术标志。我就不再赘述了。还是那句话:
SmartTimer 可以优雅地实现 Runloop 功能。
Delay
并不是说非阻塞就一定比阻塞好,因为在某些场景下,必须得用到阻塞,使单片机停下来等待某个事件。那么,SmartTimer也可以提供这个功能。
高级用法
所谓的高级用法,并不是说 SmartTimer 有隐藏模式,能开启黑科技。而是说,如果你能转变思路,举一反三地话,可以利用 SmartTimer 提供的简单功能实现更加优化、合理的系统结构。
传统的单片机裸跑一般采用状态机模式,就是在主While循环里设定一些标志位或是设定好程序进行的步骤,根据事件的进程来跳转程序。
简单的说来,这是一种顺序执行的程序结构。其灵活性和实时性并不高,尤其是当需要处理的业务越来越多,越来越复杂时,状态机会臃肿不堪,一不留神(其实是一定以及肯定)就会深埋bug于其中,调试解决BUG时也会异常痛苦。
如果转换一下思路,不再把业务逻辑中各个模块的关系看成基于因果(顺序),而是基于时间,模块间如果需要确定次序可以采用标志位进行同步。
那么恭喜你,你已经有了采用实时系统的思想,可以尝试使用RT-thread等操作系统来完成你的项目了。
但是,使用操作系统有几个问题:
其实 利用 SmartTimer 中的 Runloop 功能可以简单的实现基于时间的主程序框架。
Demo
与源码一起提供的,还有一个 Demo 程序。这个 Demo比较简单,主要是为了测试SmartTimer的功能。Demo 程序基本可以体现 Runlater,Runloop,Delay 功能。
同时也能基本体现基于时间的编程思想(单片机裸跑程序框架)。
使用
SmartTimer.h 中声明的公开函数并不多,总共有8个:
voidstim_init(void);voidstim_tick(void);voidstim_mainloop(void);int8_tstim_loop(uint16_tdelayms,void(*callback)(void),uint16_ttimes);int8_tstim_runlater(uint16_tdelayms,void(*callback)(void));voidstim_delay(uint16_tdelayms);voidstim_kill_event(int8_tid);voidstim_remove_event(int8_tid);
下面将逐一介绍。
前提
SmartTimer 能够工作的必要条件是:
使用 SmartTimer
做好以上的搭建工作后,就可以开始使用SmartTimer了。
函数 stim_runlater
int8_t stim_runlater ( uint16_t delayms, void (*callback)(void));
该函数接受两个参数,返回定时事件的id。
参数 delayms 传入延迟多长时间,注意这里的单位是根据之前 A 步骤里,你设置的时间滴答来确定的(默认单位是1ms);第二个参数是回调函数的函数指针,目前只支持没有参数,且无返回值的回调函数,未来会考虑加入带参数和返回值的回调。
举例:
timer_runlater(100,ledflash);//100豪秒(100*1ms=100ms)后,执行voidledflash(void)函数
如果在 stim_init() 中,设置的时钟滴答为 10ms 执行一次,那么传入同样的参数,意义就会改变:
timer_runlater(100,ledflash);//1秒(100*10ms=1000ms=1S)后,执行voidledflash(void)函数
函数 stim_loop
int8_tstim_loop(uint16_tdelayms,void(*callback)(void),uint16_ttimes);
这个函数的参数意义同 runlater 差不多,就不详细说明了。
该函数接收 3 个参数,delayms 为延迟时间,callback 为回调函数指针,times是循环次数。举例(以1ms滴答为例):
timer_runloop(50,ledflash,5);//每50ms,执行一次ledflash(),总共执行5次timer_runloop(80,ledflash, TIMER_LOOP_FOREVER);//每80ms,执行一次ledflash(),无限循环。
函数 timer_delay
voidtimer_delay(uint16_tdelayms);//延迟xxms
这个函数会阻塞主程序,并延迟一段时间。
voidstim_kill_event(int8_tid);voidstim_remove_event(int8_tid);
这两个函数,可以将之前设定的定时事件取消。比如之前用stim_loop无限循环了一个事件,当获取某个指令后,需要取消这个任务,则可以用这两个函数取消事件调度。
这两个函数的区别是:
void stim_kill_event(int8_t id);//直接取消事件,忽略未处理完成的调度任务。voidstim_remove_event(int8_tid);//将已经完成计时的调度任务处理完毕之后,再取消事件
注意
SmartTimer 可接受的 Timer event 数量是有上限的,这个上限由 smarttimer.h 中的宏定义来决定的:
#defineTIMEREVENT_MAX_SIZE20
默认为20个,你可以根据实际情况增加或减少。但不可多于 128 个。
资源获取:
(1)自己从 git 仓库拉取。
(2)公众号后台回复【2012】,获取打包好的项目文件。
觉得文章不错,点击“分享”、“赞”、“在看” 呗!
关键词:
- 骑士队的第三巨头凯文·乐福沦落为替补 场均总出手数不过10.3次
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
- 重庆曝光4起违反中央八项规定精神典型问题 警示党员干部清新过节
- 云南清水河边检站查获走私玉石和玉石毛料65公斤
-
广东启用涉疫风险人员排查12320专号
中新网广州12月28日电 (记者 蔡敏婕)广东省28日正式启用涉疫风险人员排查12320专号。即日起,涉疫风险人员来(返)粤前可在“粤省事”
-
武汉协和医院开设互联网儿童医学中心
中新网武汉12月28日电 (聂文闻 彭锦弦 陈有为)记者28日从华中科技大学附属协和医院(以下简称“武汉协和医院”)获悉,该院在湖北省首
-
四川:力争三年完成638个历史遗留矿山生态修复
中新网成都12月28日电 (杨予頔)28日,四川省自然资源厅发布消息称,近日,四川省自然资源厅印发了《四川省历史遗留矿山生态修复三年行
-
不同养老模式共同推进 提升老年福祉 让老人享受“温暖夕阳”
我为群众办实事 | 不同养老模式共同推进 提升老年福祉 让老人享受“温暖夕阳” 央视网消息:近期,各地在“我为群众办实事”实
-
各地创新举措 把实事办好 把好事落细 温暖民心
我为群众办实事 | 各地创新举措 把实事办好 把好事落细 温暖民心 央视网消息:近期,各地在“我为群众办实事”实践活动中,
-
新疆伊犁州新源县发生3.3级地震 震源深度13千米
中新网12月28日电 中国地震台网正式测定:12月28日15时14分在新疆伊犁州新源县(北纬43 37度,东经82 65度)发生3 3级地震,震源深度13千米。
-
2021,比个心吧!
-
高风险岗位人员出行,会受到限制吗?
【两节防疫提示】高风险岗位人员出行,会受到限制吗?
-
【两节防疫提示】健康码“变黄”,对出行有何影响?
-
【挑战365天正能量速写画】第028期:卫国戍边英雄王焯冉表弟入伍
从小就怀揣着从军报国梦的盛冠杰,5年前就曾和哥哥王焯冉相约报名参军。却因当时体检未达标,遗憾错过军营,上了大学。去年哥哥卫国戍
X 关闭
战时防疫用!宝安首批667间集中居住板房移交管理
西安新增本土确诊病例150例 详情发布
广东最低气温跌至-6℃现冰挂 部分道路及海上交通受影响
“2022科学跨年系列活动”启动 提高公众对科学类流言“免疫力”
珠科院多举措助力大湾区抗旱防咸保供水
X 关闭
微资讯!微信键盘 iOS 内测版1.0.8(322)更新,支持颜文字
日本冲绳民众集会抗议美军基地搬迁计划
索尼WF-1000XM5耳机详细信息曝光:体验升级-快播报
环球快讯:怎样延缓衰老_延缓衰老的方法
每日聚焦:安顺体育中心