一种基于单片机的任务调度和电源管理方法与流程

文档序号:15444957发布日期:2018-09-14 23:15阅读:697来源:国知局
本发明属于自动控制
技术领域
,具体涉及一种基于单片机的任务调度和电源管理方法。
背景技术
:上下文处理是任务调度的一个原则,把需要紧急处理的且相对不耗时的处理放在任务的上文,然后耗时长的处理放在任务的下文。当处理完当前任务的上文后,在单片机没有接收到中断的空闲时间就根据下文优先级来处理下文任务。中断处理函数可以打断比其优先级低的中断函数或者业务流程,当处理完中断函数后会继续执行原来的代码。在单片机中依赖于每一毫秒触发一次的时钟中断,来做任务的调度。系统休眠的触发条件是当前再也没有活跃的任务,而电源管理本身也是作为一个任务系统里面的子任务运行在调度规则中,也就是说当轮到电源管理任务运行时,不会有其他任务打断其运行,则可以判断任务状态表中的状态来决定是否进入系统休眠。目前大多数单片机是根据硬件中断来处理任务全部内容的,如果遇到耗时较大的任务,此时就会霸占着cpu的资源导致无法响应其他中断;当系统需要休眠时,往往缺乏对资源的保护而直接对资源进行释放然后模块下电,这会导致模块数据有几率处理不完然后强迫下电而产生异常。技术实现要素:本发明实施方式的目的在于提供一种基于单片机的任务调度和电源管理方法,能够较好的改善上述问题。本发明的实施方式是这样实现的:本发明的实施方式提供了一种基于单片机的任务调度和电源管理方法,该单片机程序中设有主循环函数和中断处理函数,该任务调度方法包括以下步骤:s1:对系统环境进行初始化,建立注册任务,注册任务中包括至少一个任务列表list;s2:通过时钟周期性的触发中断处理函数,中断处理函数轮询注册任务,获取满足条件的任务列表list,任务列表list中包括多个任务task,然后中断处理函数再轮询任务列表list并获取任务列表list中优选级最高的任务taska,在中断处理函数内运行任务taska;s3:在任务taska被执行期间,对执行任务taska的耗时进行判断,若执行任务taska的耗时少于设定值,则执行完任务taska后退出中断处理函数;若执行任务taska的耗时多于设定值,则将任务taska分成多个子任务subtask并挂载到子任务队列workset中,同时记录子任务subtask的索引,当任务taska挂载完子任务subtask后,退出中断处理函数;s4:在系统空闲运行期间,主循环函数不间断的运行去执行子任务队列workset里面的子任务subtask;s5:用若干个字节的每个位记录对应的任务task或者子任务subtask的状态并生成任务状态表,任务task或者子任务subtask的状态包括running状态和suspend状态;s6:在系统运行期间,当轮到某个任务task运行时,任务task首先在对应的任务状态表中把自身的状态设置为running,然后判断是否存在子任务subtask,若没有,则在运行完任务代码后把状态表对应项设置为suspend;若存在子任务subtask,则轮询所有子任务subtask的状态,判断是否都已经执行完成,若是,则重新挂载下一轮新的子任务,然后把自身状态设置为suspend,若否,则退出当前任务并继续中断前的主循环操作;s7:当电源管理任务开始运行时,检查任务状态表中是否所有位都处在suspend状态,若是,则进入系统休眠;若否,则等待下一轮电源管理任务运行周期执行。进一步的,在步骤s2中,时钟触发中断处理函数的周期为1毫秒。进一步的,在步骤s2中,taska在中断处理函数内运行时,不会被其他时钟触发中断处理函数而中断。进一步的,在步骤s4中,具体操作为:通过主循环函数判断当前子任务队列workset是否为空,若是,则继续轮询,若否,则轮询所有子任务subtask里面最高优先级类别的子任务列表subtasklist,在subtasklist中找出等待时间最长的子任务subtask,然后执行子任务subtask,执行完子任务subtask后释放子任务subtask。进一步的,步骤s5中的子任务subtask状态是指有业务需求需要电源管理模块特别判断的子任务。进一步的,在步骤s7中,当任务状态表所有有效位都为suspend状态时,最长延时一个电源管理任务周期执行系统休眠。进一步的,在步骤s7中,电源管理任务的运行周期在所有任务中是最长的。本发明的有益效果为:1、能及时响应所有中断,处理紧急事件,另一方面还能有效利用空闲资源处理费时任务。2、免除全局系统锁,任务自身管理自己的状态。3、确立电源管理框架,易于扩展新功能。4、任务状态表可以用于调试跟踪低功耗或者任务调度。附图说明图1为本发明的中断触发流程图;图2为任务执行流程图;图3为任务状态管理流程图;图4为电源管理流程图。具体实施方式为使本发明实施方式的目的、技术方案和优点更加清楚,下面将结合本发明实施方式中的附图,对本发明实施方式中的技术方案进行清楚、完整地描述。显然,所描述的实施方式是本发明一部分实施方式,而不是全部的实施方式。本发明实施方式提供了一种基于单片机的任务调度和电源管理方法,单片机程序中设有主循环函数和中断处理函数,该任务调度方法包括以下步骤:s1:对系统环境进行初始化,建立注册任务,注册任务中包括至少一个任务列表list。s2:参考图1所示,通过时钟周期性的触发中断处理函数,中断处理函数轮询所有的注册任务,获取满足条件的任务列表list,任务列表list中包括多个任务task,然后中断处理函数再轮询任务列表list并获取任务列表list中优选级最高的任务,比如是任务taska,然后在中断处理函数内运行任务taska;需要说明的是,时钟触发中断处理函数的周期为1毫秒。还需要说明的是,taska在中断处理函数内运行时,不会被其他时钟触发中断处理函数而中断。s3:参考图2所示,在任务taska被执行期间,对执行任务taska的耗时进行判断,若执行任务taska的耗时少于设定值,则执行完任务taska后退出中断处理函数;若执行任务taska的耗时多于设定值,则将任务taska分成多个子任务subtask并挂载到子任务队列workset中,同时记录子任务subtask的索引,当任务taska挂载完子任务subtask后,退出中断处理函数。子任务subtask包括subtask1、subtask2等。s4:再次参考图2所示,在系统运行期间,主循环函数不间断的运行去执行子任务队列workset里面的子任务subtask。具体操作为:通过主循环函数判断当前子任务队列workset是否为空,若是,则继续轮询,若否,则轮询所有子任务subtask里面最高优先级类别的子任务列表subtasklist,在subtasklist中找出等待时间最长的子任务subtask,然后执行子任务subtask,执行完子任务subtask后释放子任务subtask。s5:用若干个字节的每个位记录对应的任务task或者子任务subtask的状态并生成任务状态表,任务task或者子任务subtask的状态包括running状态和suspend状态。其中子任务subtask状态是指有业务需求需要电源管理模块特别判断的子任务。任务状态表如下表所示taskataskbtaskc...subtask1subtask2...预留s6:参考图3所示,在系统运行期间,当轮到某个任务task运行时,任务task首先在对应的任务状态表中把自身的状态设置为running,然后判断是否存在子任务subtask,若没有,则在运行完任务代码后把状态表对应项设置为suspend;若存在子任务subtask,则轮询所有子任务subtask的状态,判断是否都已经执行完成,若是,则重新挂载下一轮新的子任务,然后把自身状态设置为suspend,若否,则退出当前任务并继续中断前的主循环操作。s7:参考图4所示,当电源管理任务开始运行时,检查任务状态表中是否所有位都处在suspend状态,若是,则进入系统休眠;若否,则等待下一轮电源管理任务运行周期执行。需要说明的是,当任务状态表所有有效位都为suspend状态时,最长延时一个电源管理任务周期执行系统休眠。还需要说明的是,电源管理任务的运行周期在所有任务中是最长的,这样才能保证其运行能覆盖到所有任务的状态变换周期。本发明不局限于上述可选实施方式,基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1