原创 μC/OS-ll中任务调度算法的改进

2008-7-11 08:04 2970 6 6 分类: MCU/ 嵌入式
作者:吴平

引  言

目前,操作系统内核的软件中,μC,0S-II称得上是小型实时操作系统。它由Jean J.Labrosse于1992年推出第l版,立刻在嵌入式系统领域引起强烈反响。μC/OS II是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性。它最鲜明特点就是源码公开,便于移植和维护,而且对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。自问世以来,其稳定性和可靠性得到了广泛的认可,现已经通过美国FAA认证。在嵌入式领域,μc/OS凭借优越特性得到了越来越广泛的应用,众多的研究开发者将其作为操作系统的样板,移植到各种硬件平台,其外围的应用也越来越多。

1 μC/0S在嵌入式产品应用中存在的问题

随着移动通信、信息家电以及工业控制等领域的快速发展,嵌入式软件产业迎来了极佳的发展时机。强劲的市场需求带来了研发的快速增长,越来越多的软件公司投入到嵌入式产品的研发中。但另一方面,大部分软件公司却缺乏嵌入式操作系统这个嵌入式产品的核心技术,无法提供给各种应用多任务等现代操作系统所必备的功能,极大地限制了产品的性能和发展。μC/OS具有源码公开,商业授权费极低等特点,成为嵌入式产品开发的一种选择。

μC/OS—II在设计时强调实时性。它采用单一的基于优先级的抢先式调度算法,有效地保证了实时性的要求。在各种嵌入式操作系统中,其任务切换带来的时延窗口很小。非常适合强实时性的任务要求,但是对于大部分周期性和实时性要求不高的任务来说,μC/O一II还存在一些不足:

①缺乏时间片调度,低优先级的任务很难得到执行。μC/OS—II不支持时间片调度,优先级高的任务如果不主动放弃CPU,低优先级任务永远都不可能运行。这对于那些分别编写,但叉可能同时运行的任务来说,只能通过任务之间的同步等动作来完成交替运行。这不但增加了编程难度,而且破坏了模块的独立性。

②任务创建和销毁的接口复杂。μC/OS—ll的上层软件开发需要关心底层具体实现,接口比较复杂。对于经验不多的程序员来说,第一,创建任务时需要用户自行指定优先级。这必然牵涉到如何管理分配优先级的问题。第二,μC/OS—II中任务的栈空间完全由用户管理,系统只是简单地要求用户创建任务时传人栈地址,而不参与栈空间的申请和释放。为了简化μC/OS的示例程序,更是简单地以静态数组作为任务栈。栈空间的放任自流在带来一定灵活性的同时也会带来问题的隐患。第三,因为μC/OS—II规定任务必须为无限循环或自销毁形式,所以其任务在结束时,需要手工调用OSTaskDel,使该任务进入睡眠态,不能简单地返回。与现在流行的大多数操作系统用法差异较大。

结合国内的产业现状,从程序员素质和应用程序的实时性分类,在数量上都呈现金字塔状;而且往往是高级程序员负责开发实时应用,普通程序员开发非实时应用。如果希望能在包括数目庞大的非实时应用的产品中利用μC/OS—II,则必须对它作出扩充,在保留实时任务支持的前提下,增添时间片调度,并对任务的接口作出简化处理。

2 μC/OS调度算法的改进

μC/OS中的每个任务具有一个任务控制块0S_TCB,任务控制块记录任务执行的环境,包括任务的优先级、任务的堆栈指针、任务的相关事件控制块指针等。内核将系统中处于就绪态的任务在就绪表中进行标注,通过就绪表中的两个变量OSRdyGrp和OSRdyTbl[]可快速查找系统中就绪的任务。在μC/OS—II中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一标识。内核可用控制块优先级表OSTCBPrioTbl[]通过任务的优先级查到任务控制块的地址。μC/OS—II主要就是利用任务控制快OS_TCB、就绪表和控制块优先级表0STCBPrioTbl[]来进行任务调度。任务调度程序OSSched()首先由就绪表中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表0STCBPrioTbl[]取得相应任务控制块的地址,由OS_TASK—SW()程序进行运行环境的切换。若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单地返回中断调用处,而是由OSIntExit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。

本文拟在不破坏μC/OS实时性的前提下,增加时间片调度,以适于非实时性场合,并参考Windows和Linux多种通用操作系统任务调用接口函数,对μC/0S任务接口作出改进,提供通用简单的编程接口,降低应用软件开发难度,增加系统稳定性和可靠性。

2.1  时间片调度算法的设计与实现

μC/OS中共有64个任务,其中作者保留了8个任务以备将来使用,因此用户可以有多达56个应用任务。将这些任务划分为3个层次,如图l所示实时任务保留原本设计的绝对优先级调度,对系统驱动或通信等实时性要求高的场合提供支持,任务的创建接口保持不变,由高级程序员编写相应程序;在分时任务空间采用时间片调度,各种任务轮流执行,适用于事务性处理或实时性要求不高的场合,普通程序员在此区间内编写任务,并对此空间任务的创建和销毁提供了新的编程接口,使之适合普通程序员的编程习惯;后台任务是指idle任务、统计任务等在系统空闲时运行的任务,其在实时任务和分时任务都没有就绪时才有机会运行,此区间也采用绝对优先级调度。

qrs_082733d-1.jpg

分时任务在μC/OS原先的五种状态中添加了等待态,定义为OS_STAT_WAITSLICE,表示正在等待时间片的重新产生。增添新状态后的状态迁移如图2所示。

qrs_082733d-2.jpg
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条