![]() |
|
||||||||||||||
| | 网站首页 | 文章中心 | 下载中心 | ARM技术交流社区 | 供求信息 | 在线咨询 | 数据手册 | | ||
|
||
|
|||||
| μC/OS-ll中任务调度算法的改进 | |||||
作者:英特尔中… 文章来源:单片机及嵌入式系统应用 点击数: 更新时间:2007-4-14 ![]() |
|||||
摘 要:介绍μC/OS—II嵌入式实时操作系统的特点,分析单一的基于优先级调度算法存在的不足。根据嵌入式应用不同的实时性要求,将应用划分为实时任务、分时任务和后台任务三种类型。针对分时任务,新增加时间片调度算法,给出调度算法的实现方法,同时增加任务创建和销毁的接口;降低基于μC/OS—1I操作系统的嵌入式产品开发难度和设计成本,有利于该操作系统的应用推广。 关键词:μC/OS—II 嵌入式系统 任务调度算法 时间片调度
引 言 目前,操作系统内核的软件中,μC,0S-II称得上是小型实时操作系统。它由Jean J.Labrosse于1992年推出第l版,立刻在嵌入式系统领域引起强烈反响。μC/OS II是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性。它最鲜明特点就是源码公开,便于移植和维护,而且对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。自问世以来,其稳定性和可靠性得到了广泛的认可,现已经通过美国FAA认证。在嵌入式领域,μc/OS凭借优越特性得到了越来越广泛的应用,众多的研究开发者将其作为操作系统的样板,移植到各种硬件平台,其外围的应用也越来越多。
1 μC/0S在嵌入式产品应用中存在的问题 随着移动通信、信息家电以及工业控制等领域的快速发展,嵌入式软件产业迎来了极佳的发展时机。强劲的市场需求带来了研发的快速增长,越来越多的软件公司投入到嵌入式产品的研发中。但另一方面,大部分软件公司却缺乏嵌入式操作系统这个嵌入式产品的核心技术,无法提供给各种应用多任务等现代操作系统所必备的功能,极大地限制了产品的性能和发展。μC/OS具有源码公开,商业授权费极低等特点,成为嵌入式产品开发的一种选择。
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中共有64个任务,其中作者保留了8个任务以备将来使用,因此用户可以有多达56个应用任务。将这些任务划分为3个层次,如图l所示。
实时任务保留原本设计的绝对优先级调度,对系统驱动或通信等实时性要求高的场合提供支持,任务的创建接口保持不变,由高级程序员编写相应程序;在分时任务空间采用时间片调度,各种任务轮流执行,适用于事务性处理或实时性要求不高的场合,普通程序员在此区间内编写任务,并对此空间任务的创建和销毁提供了新的编程接口,使之适合普通程序员的编程习惯;后台任务是指idle任务、统计任务等在系统空闲时运行的任务,其在实时任务和分时任务都没有就绪时才有机会运行,此区间也采用绝对优先级调度。
其中睡眠态(dormant)异于多数操作系统的定义,是指任务驻留在程序空间之中,还没有交给μC/OS—II管理。所有任务开始于睡眠态,通过调用任务创立函数把任务交给μC/0S—II。当任务一旦建立,就进入就绪态准备运行。在任务销毁时,可以通过调用OSTaskDel()返回到睡眠态。其余阻塞态、就绪态、运行态和中断态较常见,这里不再详述,可以参考文献[1]第3章。
图3中,模块②之前的流程与在μC/()S—II中几乎完全相同,主要负责对所有任务时延值的处理。模块②判断处于就绪态的分时任务是否时间片用完,如是,则将其设置为等待态。模块③查出就绪的最高优先级任务。如果低于分时任务区间,说明没有分时任务或所有的分时任务都处于等待态,此时为所有的分时任务重新分配新的时间片,并将其变更为就绪态。模块④中,如果当前任务是分时任务,则说明该任务已经消耗了一个时间片,将该任务时间片减1。
为了简化应用编程接口,屏蔽低层任务管理细节,为用户提供新的任务接口OSNTaskCreate和OSNTaskDel。0SNTaskCreate用于创建分时任务,该函数在分时区间自动分配优先级,代替用户申请栈空间,并在初始化栈内容时压人OSNTaskDel地址。在用户任务退出后,就会自动调用()SNTaskDel,以释放栈空间,并调用()STaskDel。如此更符合用户在Windows等系统的情况,任务结束后只是简单返回,减小了错误出现的机会。改进后的OSNTaskCreate伪码如下:
if(区间已满) 设置错误码并退出; if(dwStackSize为零) dwStackSize为缺省大小; 分配栈空间并记人TCB; 初始化栈空间()SNewTaskStklnit(); 调用0S_TCBInit初始化TCB; if(成功) 调度0S_Sched(); 设置错误码并退出; }
本文对μC/0S—II的调度算法作了改进,划分了实时任务、分时任务和后台任务;并对任务的用户接口进行了改善,使之更加方便易用。以上方法已成功应用在好易通系列电子产品的开发中,对μC/OS—II在嵌入式产品应用和推广中具有广泛意义。 欢迎进入超前MCU技术论坛对 μC/OS-ll中任务调度算法的改进进行讨论! |
|||||
| 文章录入:armopen 责任编辑:armopen | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系我们 | 友情链接 | 版权申明 | 网站公告 | |||
|