单片机多任务框架设计
单片机应用广泛,内部资源搭配丰富。虽然丰俭由人,但是在单片机选型的时候,我们往往会选择性价比相对较高的。选定了单片机,程序设计工作量也不小。如何方便快捷的移植、开发调试以及维护,可以实现是程序设计人员追求的缩短设计周期的目标。
本文引用地址://www.cazqn.com/article/202111/429669.htm1 框架分析
跑系统的单片机可以更有效支持多任务,完成更加复杂的任务,但需要更大的存储空间用于系统程序和用户程序;裸跑的单片机只能进行单任务,对存储空间需求较低。在这里主要研究一种多任务程序框架设计,让裸奔的单片机跑出操作系统的感觉,单片机虽然是裸机奔跑,但是往往现实的需要决定了我们必须跑出操作系统的姿态——多任务程序。
系统实现多任务,最重要的特点是分时和消息传递与处理。引用一个网友的总结:stateMachine +timerTick + queue。
queue,在设计框架时需要设计一个消息队列贯穿整个系统,把这个队列机制做成通用模块,在不同的程序执行模块中调用。消息队列用于缓冲事件,事件不知道什么时候会到来,也不能保证来了就能迅速得到处理,使用消息队列,可以保证每个事件都能处理到。消息通常分为两种类型:①外部事件收集,然后存储到队列,如按键、IO 中断、时钟任务等硬件发出;②在任务处理过程中,一个任务触发新的任务,例如在蓝牙遥控器中,接收解析串口数据的任务中发出按键消息。timerTick,系统的时钟基准。用一个定时器来建立通用定时器任务,管理不同任务相关的多个定时器,在定时到达时,由定时器任务发出消息。
stateMachine,任务收到消息后,根据当前状态决定如何处理消息。
2 框架设计
我们以包含按键开关一个定时1 s 的LED 灯闪烁为例,示例包含框架的全部内容。
图1是程序流程图。
图1 程序流程
首先是消息队列、时钟任务、消息的定义:
其次是从顶层主程序设计开始,再到各功能模块的设计:
1)顶层主程序设计,系统开始进行硬件初始化、任务初始化、时钟初始化;然后在1 个循环中不停地进行循环事件收集、时间事件收集和处理、消息队列时间处理。
2)在时钟基准的设置上,建立1 个1 ms 的定时器,在定时器中断里判断开启的定时任务是否发生,满足条件设置定时标志,同时关闭此项定时任务。
3)循环事件收集:在循环中判断是否有按键按下,如有按键按下,发送按键消息。
4)时间事件收集:判断定时服务里设置的定时标志做相关的时间事件处理。
5)消息队列处理:判断消息队列是否为空,当不为空时进行消息处理。
3 任务添加
如何根据实际应用的需要在主体结构中加入新的任务,如下以串口通信为例。
1)添加消息定义:在消息定义enumEventList 里面加入串口功能定义。
2)添加消息收集程序:在串口中断里接收数据,并把数据写到串口数据缓冲器,在循环事件收集里面进行串口数据分析,根据收到的数据完整性和协议分析,发出串口功能的消息到消息队列。
3)添加消息处理程序:在消息队列处理里面加入串口功能对应的处理功能。
4 结束语
整体看来我们的程序框架就成了通用的模板了,根据自己选定的MCU,选个定时器,再添加自己的事件收集、事件处理以及时间任务即可,非常灵活方便实用。
参考文献:
[1] 李宁.基于MDK的STM32处理器开发应用[M].北京:北京航空航天大学出版社,2008.
[2] LABROSSE J J.嵌入式实时操作系统μC/OS-II[M].邵贝贝,等,译.北京:北京航空航天大学出版社,2003.
[3] 孙涵芳,徐爱卿.MCS-51/96系列单片机原理与应用[M].北京:北京航空航天大学出版社,1988.
[4] 郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略.北京:电子工业出版社,2009.
[5] 徐爱钧.Keil C51单片机高级语言应用编程技术.北京:电子工业出版社,2015.
(本文来源于威廉希尔 官网app
杂志2021年10月期)
评论