非实时多任务调度内核实现方法

文档序号:6444716阅读:126来源:国知局
专利名称:非实时多任务调度内核实现方法
技术领域
本发明涉及一种多任务调度内核实现方法,具体涉及一种非实时的多任务调度内核实现方法,属于计算机技术领域。
技术背景
采用多任务的设计方法,能够简化软件的设计流程,增加软件的模块化程度,提高可维护性。目前,公知的多任务调度内核大多基于实时操作系统,如Vxworks、ucos等, 但是在某些应用场合,使用实时内核不利于提高软件的运行效率。例如,在飞行控制系统的仿真验证中,一个仿真用例所对应的物理时间一般为几十分钟甚至几个小时,而进行 Monte-Carlo验证时,需要进行上百次仿真。如果采用实时内核,仿真软件的运行时间与其所对应物理相同,开发人员将在仿真上耗费大量的时间,影响开发进度。而事实上,计算机本身具有提高效率的能力,只是大部分时间CPU都处于空闲状态
发明内容
为了克服实时内核在运行效率上的局限性,本发明提供了一种非实时的多任务调度内核实现方法。该方法能充分利用CPU资源,提高软件运行效率,适合在追求运行效率, 不要求实时性,而又希望采用多任务方式来进行软件设计的场合使用。
本发明解决其技术问题所采用的技术方案是一种非实时多任务调度内核实现方法,其特征在于通过三个内核数据结构WaitTask、 WaitTaskTimerjctivtTask分别用来存储等待任务、等待任务对应的等待时间以及就绪任务,并通过伪时钟节拍来实现任务在等待、就绪和运行状态之间的切换,从而实现多任务的调度。
其中,实现多任务调度的具体方法是系统每运行一个伪时钟节拍, WaitTaskTimer中每个任务的等待时间减1,若某个任务的等待时间为0,则将其从 WaitTask等待队列中转入Activthsk就绪队列中,准备运行。就绪队列Activthsk中的任务运行结束后,再次回到等待队列Waithsk中,同时在WaitI^skTimer中存储该等待任务对应的延时时间,通过以上步骤实现任务在等待、就绪和运行状态之间的循环切换,从而实现多任务的调度。
需要指出的是,内核中的时间都是以伪时钟节拍为基本单位,伪时钟节拍代表一个调度周期,只具有逻辑时间涵义,而不具有物理时间涵义,其所对应的真实时间为将就绪队列中所有任务遍历一遍的时间,与软件的复杂度和计算机的运行速度有关,但是远小于其逻辑时间,这也是非实时内核得以提高软件运行效率的基础。
该方法取得的有益收效是本发明的非实时多任务调度内核实现方法采用伪时钟节拍来实现任务的调度,充分利用了 CPU的运行时间,提高了软件运行效率。适合在追求运行效率,不要求实时性,而又希望采用多任务方式来进行软件设计的场合使用。


图1是多任务调度内核数据结构。
图2是多任务调度内核状态图。
图3是等待状态到就绪状态函数流程图具体实施方式
所谓一个任务,就是一个线程,一个简单程序。对于一个任务具有睡眠、就绪、运行、等待等状态。数据结构WaitTask 、WaitTaskTimer, ActiveTask,用来存储、标志任务和任务状态。图1为三个内核数据结构的示意图。
WaitTask 是一个用来存储等待任务函数指针的数组。通过函数指针能够访问其所对应的任务函数。
WaitTaskTimer 是用来存储对应WaitTask中任务延迟时间的数组,如一个任务的函数指针为fun_ptr,延迟时间为delay_t,存储在WaitTask中的索引idx,则可对数组 WaitTask 和 WaitTaskTimer 进行如下操作WaitTask[idx]=fun_ptr; WaitTaskTimer[idx]=delay_tActiveTask 是定义的一个栈,用来存储处于就绪状态任务的函数指针,定义head和 tail是两个指向ActiveTask数组的指针,其中tail指向栈的底部,head指向栈的顶部。 对于ActiveTask的操作如下就绪的任务入栈ActiveTask[head]= fun_ptr head=head+l;就绪的任务出栈fun_ptr= ActiveTask[tail] tail=tail+l ;WaitTask和WaitTaskTimer结合使用,当WaitTaskTimer [idx]为零时,表示其对应的任务延迟时间已到,任务要由等待状态变成就绪状态,即把WaitTaSk[idX]的任务名写入到就绪栈ActiveTask中,准备运行。
多任务系统中,内核负责管理各个任务,为每个任务分配运行时间,并且负责任务间通信。一个基本的内核应包含内核初始化、任务创建、任务调度和时间管理等函数,使用这些函数可以实现任务的睡眠状态、就绪状态、等待状态和运行状态等各个状态间的转换, 达到对任务调度和切换的目的。非实时多任务调度内核正是由这些基本的任务创建和管理函数构成,图2表示了内核函数对任务的操作过程。
1)内核初始化内核初始化函数tmX_init,具体进行如下的操作a)定义内核中最大管理的任务数,定义内核的一个时间节拍对应的仿真时间。
b)为 WaitTask、WaitTaskTimer ,ActiveTask 等数组分配存储空间,并以“空”或 “零”初始化这些数组。
c)定义内核伪时钟节拍与逻辑时间的对应关系,为内核运行的最小时间单位,以此将任务的逻辑延时时间转化为伪时钟节拍数。
内核只有在初始化后才能正常启动,在任务创建和任务调度之前应该首先调用内核初始化函数,完成内核初始化工作。
2)睡眠到就绪调用任务创建函数tmX_Creat_task(fun_ptr),创建任务,使任务由睡眠态到就绪态。 一个任务即对应一个函数。任务创建函数tmX_creat_task传递的是函数指针,即fun_ Ptr的数据类型为一函数指针。任务创建函数把任务对应的函数指针fim_ptr压入到 ActiveTask栈中,同时指向ActiveTask的指针head后移,此时任务变成了就绪状态,准备执行。
3)就绪到运行在每个节拍内,检测是否有就绪的任务,如果有,则进行运行。如图2,调用tmX_get_ activetaskO函数,检测栈ActiveTask,取出栈头和栈尾之间存储的函数句柄,并进行执行,即完成了就绪态任务到运行态的转变。
4)运行到等待任务运行完毕后,需要归还CPU资源,任务由运行态转变为等待态,等待下个时间片的到来。如图3所示,时间管理函数tmx_sle印(fun_ptr,milliseconds)实现任务由运行态变为等待态。该函数首先把延迟时间milliseconds转换为伪时钟节拍数,然后把函数句柄 fun_ptr和延迟节拍写入到数组WaitTask和WaitTaskTimer中,完成了运行态的任务到等待态的转变。
5)等待到就绪当任务完成等待时间,将由等待态转变为就绪态。如图2所示,调用tmX_get_ readytaskO,其函数流程如图3所示,idx为存储在数组WaitTask中函数句柄的索引,在每个节拍内,首先判断idx是否超出Waithsk数组边界,若超出,则tmX_get_readytaSk() 函数完成一个周期,即已遍历完WaitTask中存储的所有任务句柄,若没有超出,则将 WaitTaskTimer [idx]中的存储的延迟节拍减1。然后判断WaitTaskTimer [idx]是否为零若为零,则说明任务WaitTaSk[idX]的等待时间结束,将该任务的函数句柄写入到 ActiveTask中,完成了任务等待态到就绪态的转变,同时idx加1,判断feitTask中存储的下一个任务句柄;若不为零,idx直接加1,判断下一个任务句柄。
权利要求
1.一种非实时多任务调度内核实现方法,其特征在于通过三个内核数据结构 WaitTask, WaitTaskTimer, ActivtTask分别用来存储等待任务、等待任务对应的等待时间以及就绪任务,并通过伪时钟节拍来实现任务在等待、就绪和运行状态之间的切换,从而实现多任务的调度。
2.根据权利要求1所述的非实时多任务调度内核实现方法,其特征在于系统每运行一个伪时钟节拍,WaitTaskTimer中每个任务的等待时间减1,若某个任务的等待时间为0,则将其从WaitTask等待队列中转入ActivtTask就绪队列中,准备运行,就绪队列ActivtTask中的任务运行结束后,再次回到等待队列WaitTask中,同时在 WaitTaskTimer中存储该等待任务对应的延时时间,通过以上步骤实现任务在等待、就绪和运行状态之间的循环切换,从而实现多任务的调度。
3.根据权利要求1或2所述的非实时多任务调度内核实现方法,其特征在于内核运行的基本时间单位为伪时钟节拍,伪时钟节拍不具备真实的物理时间涵义,只具备逻辑时间涵义,一个伪时钟节拍的真实时间为系统将就绪表中所有任务遍历完的时间。
全文摘要
本发明公开了一种非实时多任务调度内核实现方法,它通过三个内核数据结构WaitTask、WaitTaskTimer、ActivtTask分别来存储等待任务、等待任务对应的等待时间以及就绪任务,并通过伪时钟节拍来驱动任务实现等待、就绪、运行状态之间的切换,最终实现多任务的调度。伪时钟节拍为内核调度的基本单位,其没有具体的时间涵义,其真实周期与软件的复杂度和计算机速度相关,但远小于其所代表的逻辑时间周期。相比实时内核,本发明的非实时内核实现方法能够充分利用CPU资源,适合在追求运行效率,不要求实时性,而又希望采用多任务方式来进行软件设计的场合使用。
文档编号G06F9/48GK102521045SQ20111045757
公开日2012年6月27日 申请日期2011年12月31日 优先权日2011年12月31日
发明者周宇, 孙春贞, 尹亮亮 申请人:南京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1