μC/OS的任务调度实现方法及PowerPC上的优化

发布者:omega34最新更新时间:2010-11-05 关键字:μC/OS  PowerPC  任务调度 手机看文章 扫描二维码
随时随地手机看文章

  μC/OS是Jean J.Labrosse开发的实时多任务内核,最初是为Motorola 8位处理器68HC11写的。在后来的相关著作中,作者将代码移植到了PC上,以便于更多的读者学习。μC/OSII继承了μC/OS的算法,有执行效率高、占用空间小、实时性强和可扩展性好等特点,被移植到几乎所有类型的CPU上,成为在嵌入式领域非常有影响力的RTOS。然而,由于该实时内核是为8位CPU设计的,对于那些具有优先级算法硬件指令的CPU,仅做移植是很不够的。

  1 基于优先级的任务调度

  一个基于优先级的实时多任务内核的任务调度机制需要实现下面三个核心的处理功能:

  ◆ 将任务置于就绪态;

  ◆ 将任务取消就绪态;

  ◆ 找出最高优先级的就绪态任务。

  在32位机上运行64个任务,可使用两个32位的整型变量数组OSRdyTbl [2],建立一个64位的任务就绪态向量;每一位表示对应优先级的任务是否处于就绪态,例如OSRdyTbl [0]的第4位为1表示优先级为4的任务处于就绪态。构造如下的三个函数,用来完成设置任务就绪、取消任务就绪和寻找当前最高优先级的就绪任务。

  上述代码可在任何处理器上实现所需的功能,没有考虑任何的优化和改进。通过这样的原理性函数,可以更好地理解多任务内核的任务调度。

  寻找最高优先级就绪态任务的函数调用频率高,其执行时间直接影响内核的任务切换延迟时间,影响系统实时性。上述寻找最高优先级的就绪态任务的代码,随当前就绪任务的优先级不同,其循环次数也不同,导致其运行时间不确定。

  2 μC/OS的任务调度实现方法

  μC/OS和μC/OSII是为8位CPU写的,采用8位机算法,支持64个任务。使用8个字节的OSRdyTbl全局数组,表示所有任务的就绪态信息:1为任务就绪,0为非就绪。数组第一个字节的b0位代表64个任务中优先级最高的任务,最后一个字节的b7位代表优先级最低的空闲任务,永远为1。当OSRdyTbl 数组的数据不为0时(表示对应的8个任务中至少有1个进入就绪态),另一个单字节全局变量OSRdyGrp 中的相应位要置1。当任务状态发生变化时,需更新OSRdyGrp和OSRdyTbl中对应的位。

  寻找最高优先级的就绪任务时,μC/OS使用了预先固化的256字节的对照表OSUnMapTbl,给出特定字节值的最低位1所在位的信息。查表算法避免了逐位检测各优先级位引起的执行时间的不确定性,程序简单,执行速度快,与就绪任务多少和优先级无关。

  对于取值0~63的任务优先级,μC/OS将其划分成高3位的Y和低3位的X,并保存在其任务控制块TCB的OSTCBX和OSTCBY中,其对应的OSUnMapTbl的值保存在OSTCBBitY和OSTCBBitX变量中,以提高运算速度。为了避免函数调用所带来的额外开销,μC/OS直接用语句实现如下的三部分功能。

  ① 设置任务进入就绪态

  OSRdyGrp |= ptcb>OSTCBBitY;

  OSRdyTbl[ptcb﹥OSTCBY] |= ptcb>OSTCBBitX;

  ② 设置任务退出就绪态。

  y = OSTCBCur>OSTCBY;

  OSRdyTbl[y] &= ~OSTCBCur>OSTCBBitX;

  if (OSRdyTbl[y] == 0) {

  OSRdyGrp &= ~OSTCBCur>OSTCBBitY;

  }

  ③ 寻找最高优先级的就绪态任务。以OSRdyGrp的值做偏移量,查OSUnMapTbl表,得到1个0到7的数Y,作为优先级高3位,再根据Y的值,找出OSRdyTbl中对应的字节,并且再次查OSUnMapTbl表,得到1个0到7的数X,作为优先级低3位的值,通过将Y左移3位再加上X的值,得到就绪任务中优先级最高的那个。

  y = OSUnMapTbl[OSRdyGrp];

  SPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);

  μC/OS的任务调度算法采用了以空间换时间的策略,将特定字节值的最低位1所在位的信息预先计算并保存到表中,运行时通过查表快速得到;每个任务的TCB中除了保存优先级信息本身外,还使用额外的4个字节保存优先级的高低3位和对应的OSUnMapTbl值,以避免运行时实时计算这几个值所带来的延迟。这些措施增加了系统ROM和RAM的开销。

  3 利用PowerPC“数出前导零数目”指令实现任务调度

  PowerPC是Motorola 、IBM和Apple三家公司于20世纪90年代初期联合设计的32位CPU。Freescale(其前身是Motorola半导体部)发展了针对汽车电子的MPC5xx系列单片机及后续基于e200内核的MPC5xxx系列单片机;更高端的e500、e600内核是用于通信领域的MPC6xxx、7xxx和8xxx系列。

  下面对μC/OS任务优先级调度算法的改进和优化是在MPC5554单片机上实现的。

  PowerPC处理器具有一条“数出前导零数目” 的指令cntlzw(count leADIng zero word),可以以硬件指令方式实现优先级的多任务调度算法。这条指令也可用于图像处理和算法加密的场合。该指令数出一个32位寄存器中前置零的数目,例如,返回0表示b0不为零,即没有前导零;返回3表示b3不为零,b3位的前面从b0到b2共有3个零;返回32表示RS寄存器中所有的位都为零。(在PowerPC架构中,最高位MSB表示为b0,低位MSB根据位宽表示为b7、b15或b31。)

  利用这条指令,用汇编语言改写寻找最高优先级的就绪任务的函数,则不需要进行循环移位判断,可以直接从64个任务中找出优先级最高的那个任务。代码如下:

  在这段代码中,首先判断前32个任务是否有处于就绪态的,如果没有的话,再对后32个任务进行判断。由于优先级最低的空闲任务总是处于就绪态,所以后32个任务总能返回一个有效值。该代码在前32个任务有就绪态时运行7条指令,在前32个任务均没有就绪时需要执行10条指令;而μC/OS原有的代码编译出来的汇编程序,则需要运行15条指令。

  使用这个方法的另一个好处是不再需要使用256字节的OSUnMapTbl表,任务控制块TCB也不需要使用OSTCBX、OSTCBY和OSTCBBitY、OSTCBBitX变量,每个ECB中也不再需要OSRdyGrp,这也减少了对ROM和RAM的占用。

  4 改进扩展任务数的优先级调度性能

  当对μC/OSII支持的任务数进行扩展时,按照μC/OSII原有的做法,需要按照高低字节分别查找OSUnMapTbl对照表。任务数为256时,寻找最高优先级就绪任务的函数将需要运行约35条指令。数出前导零数目的指令在这种情况下的作用将更加显著,对于32位PowerPC处理器,精心设计的代码可以做到仅需10条指令就将任务数扩展到1024个。

  此时OSRdyGrp扩展为32位,OSrdyTbl扩展成32个32位的数组。从OSRdyGrp得到的前导零数目,就是任务优先级高5位的值,乘以4可以得到该字的相对偏移地址;在OSRdyTbl中,定义高位对应高优先级任务,低位对应低优先级任务,则其前导零数目就是任务优先级低5位的值,和高5位的值移位相加就得到完整的任务优先级。通过将OSRdyGrp和OSRdyTbl定义成结构体,利用结构体首地址的相对寻址来分别读取其数值,可以减少一次取地址的操作。

  寻找最高优先级就绪态的最终代码如下:

  在64位的PowerPC 更有cntlzd(Count Leading Zero Double word)指令,一次就可以找出64个任务中优先级最高的那个,就更没有必要使用μC/OSII中的算法了。

  5 总结

  RTOS实时内核μC/OS和μC/OSII中,任务调度算法巧妙,性能优异,在嵌入式应用领域很有影响力,被移植到各种CPU上。然而由于是为8位CPU设计的,对于那些具有优先级硬件算法指令的16/32/64位CPU,μC/OSII的软件算法就完全失去了优势。应该利用这类CPU的特有指令,优化任务调度算法,使RTOS的实时性达到最佳。对于这类处理器,仅移植μC/OSII软件算法是很不够的,应该利用相关硬件算法指令。

关键字:μC/OS  PowerPC  任务调度 引用地址:μC/OS的任务调度实现方法及PowerPC上的优化

上一篇:“中国创造”之操作系统 崛起之时指日可待
下一篇:几种常用的单片机系统RAM测试方法研究

推荐阅读最新更新时间:2024-05-02 21:11

基于微处理器LPC2210实现μC/OS-Ⅱ关键算法的改进设计
1 引言 当前,嵌入式开发领域对产品的要求越来越多.如通信速率,稳定性,产品功能,可扩展性,可移植性,适应性等。为了适应这些要求,作者对低版本的μC/OS-II做了一些改进。并选择一款性价比高的微处理器LPC2210作为其运行的硬件平台。本文论述的高级继电器保护装置除可以动态地实现模拟量和开关量的数据采集外,还可以作为web终端通过远程主机对终端进行控制或访问。 2 μC/OS-II其内核结构 宏观的讲,μC/OS-Ⅱ大致分成内核结构、任务管理、时间管理、任务之间的通信与同步和CPU的移植等5个部分。由于嵌入式多任务应用功能软件系统是应用设计的范畴,所以并不包含在内核中。内核保留给上层应用的接口有3个,分别是软保护、任务间的通
[单片机]
基于微处理器LPC2210实现μ<font color='red'>C</font>/<font color='red'>OS</font>-Ⅱ关键算法的改进设计
μC/OS-II在C8051F上的移植
在嵌入式应用中,使用 RTOS 的最主要原因是提高系统的可靠性,其次是提高开发效率、缩短开发周期。 μC/OS-II 是一个基于优先级的抢占式实时内核,支持 56 个用户任务, 90% 的代码使用标准的 ANSI C 语言书写,程序可读性强,移植性好,代码可固化,可裁剪,非常灵活。 C8051F 是美国 Cygnal 公司生产的与 51 系列兼容的微控制器,流水线指令结构 70% 的指令的执行时间为 1 个或 2 个系统时钟周期。当时钟频率为 25MHz 时,速度可达 25MIPS ,是一款不错的片上系统。 · 1 开发工具和运行环境   实现 μC/OS-II 的移植,要求所用的 C
[单片机]
基于μC/OS-II的无线调度策略分析与实现
引言 在工业自动化中,设备信息的接收发送基本都是通过有线方式(串口,网口等)来进行传递,随着无线通信技术的发展,信息通过无线方式传递应用逐渐广泛,特别是在有线布线困难或条件恶劣的特殊工业现场。本文介绍了基于无线技术的通信平台,引入嵌入式实时操作系统μC/OS-II来实现对多个设备的无线调度。 1 无线调度平台 无线调度平台信息接收发送是基于ZIGBEE无线通信技术,ZIGBEE具有较强的网络构建功能,支持星型,树型,网状拓扑结构。图1所示为基于星型拓扑结构的无线调度平台系统,调度系统包括一个调度设备和多个节点,调度设备负责微网的调度和数据包的转发,该设备在系统中充当主设备;节点连接工业设备,在系统中充当从设备,在调度设
[嵌入式]
μC/OS-II实时内核下的A/D驱动程序设计
摘要:详细分析在μC/OS-II实时内核下驱动程序读取A/D的三种方法;阐述C8051F015单片机的A/D转换器的配置、转换特点及其驱动程序读取A/D采用的方法;针对C8051F015单片机分析A/D驱动程序设计的方法和思想。这些方法和思想为在μC/OS-II下访问其它类型的A/D提供了很好的借鉴。 关键词:μC/OS-II A/D 驱动程序 C8051F015 A/D转换是单片机数据采集系统的重要组成部分,实时内核下A/D驱动程序的实现过程主取决于A/D转换器的转换时间。本文首先比较和分析μC/OS-II下A/D采样数据的三种方法;其次介绍C8051F015单片机A/D模数转换器配置及特点;最后,在μC/OS-II内核移
[嵌入式]
基于LPC2214和μC/OS-II的iButton接口
摘要:为了在电力设备点检中正确区分各设备,采用iButton作为设备的电子数据标识。通过对iButton初始化及写入相应的操作时序,从硬件接口和软件编程两个方面,详细介绍在μC/OS-II实时操作系统中使用LPC2214读取iButton 64位标识码的设计方法。其接口设计已成功应用于点检机中。 关键词:iButton 1-Wire LPC2214 μC/OS-II   电力设备点检管理是利用检测设备和仪器,按照预先制订的技术标准,定人、定点、定路线、定周期、定方法、定检查记录,施行全过程对运行设备进行动态检查。点检人员按要求将手持的个人点检机与安置在设备现场的ID钮扣相接触后,该位置相应的若干作业指令应逐条显示在个人点检服务器
[单片机]
μC/OS-II在S3C44BOX处理器上的移植
摘要:介绍实时操作系统μC/OS-II的特点和内核结构,给出μC/OS-II在Samsung嵌入式S3C44BOX ARM7微处理器上的移植的步骤及详细相关代码,同时阐述μC/OS-II在应用中应注意的问题。 μC/OS-II功能强大,支持56个用户任务,其内核为占先式,支持信号量、邮箱、消息队列等多种常用的进程间通信机制,现已成功应用到众多商业嵌入式系统中,是一个成熟稳定的实时内核。与大多商用RTOS不同的是,μC/OS-II公开所有的源代码,90%的代码使用标准的ANSI C语言书写,程序可读性强、移植性好;同时它可免费获得,即使商业应用也只收取少量的许可费用。因此,对μC/OS-II实时操作系统的学习研究、开发、应用具有
[单片机]
μ<font color='red'>C</font>/<font color='red'>OS</font>-II在S3<font color='red'>C</font>44BOX处理器上的移植
在MOTOROLA A68K系列MCU上移植μC/OS-II
一、MC68K CPU简介 MC68K及68020、68040等的著名的MOTOROLA32位微处理器,和与之兼容的68K、CPU32、CPU32+等CPU扩充定时处理单元TPU、队列串行模块QSM、系统控制模块和RAM等组成MC683xx系列单片机。 CPU32 内部有8个32位通用数据寄存器,8个32位通用地址寄存器。8个通用数据寄存器可作为累加器使用,也可看成C语言中各种类型的变量;8个通用地址寄存器,可作为变址寄存器使用,也可看成C语言中的指针型变量。CPU32有独立的用户堆栈指针和系统堆栈指针,可区分程序区、数据区、系统区、用户区等存储空间,有7级中断。 要实现μC/OS-II向MC68K的移值,需要有M
[单片机]
在MOTOROLA A68K系列MCU上移植μ<font color='red'>C</font>/<font color='red'>OS</font>-II
基于PowerPC405EP的网络打印机控制器设计
摘 要: 本文介绍了一种新型的32位高性能RISC处理器PowerPC405EP,提出了一种基于PowerPC405EP的网络打印机产品控制器硬件设计方案并给出了部分设计细节,然后讨论了基于此网络打印机控制器的嵌入式操作系统VxWorks的开发,移植以及BSP引导程序的开发流程。 关键词: RISC,PowerPC,网络打印机控制器,VxWorks BSP, bootroom 引言 网络打印机是一种将网络服务器功能与打印功能合二为一的新型网络设备,其控制器设计要求处理器速度快,功能强大,能够满足网络处理、打印数据交换以及嵌入式操作系统开发等对硬件的各种资源要求。PowerPC405EP是IBM公司推出的一种高性能的32位
[应用]
热门资源推荐
热门放大器推荐
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved