当前位置:首页>> μC/OS的任务调度实现方法及PowerPC上的优化

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

发布时间:2016-02-08作者:智汇小新

  μ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软件算法是很不够的,应该利用相关硬件算法指令。

公司简介

宜科(天津)电子有限公司是中国工业自动化的领军企业,于2003年在天津投资成立,销售和服务网络覆盖全国。作为中国本土工业自动化产品的提供商和智能制造解决方案的供应商,宜科在汽车、汽车零部件、工程机械、机器人、食品制药、印刷包装、纺织机械、物流设备、电子制造等诸多领域占据领先地位。宜科为智慧工厂的整体规划实施提供自系统层、控制层、网络层到执行层自上而下的全系列服务,产品及解决方案涵盖但不局限于云平台、MES制造执行系统、工业现场总线、工业以太网、工业无线通讯、机器人及智能设备组成的自动化生产线、自动化电气控制系统集成、智能物流仓储系统等,以实现真正智能化的生产制造,从而带来生产力和生产效率的大幅提升,以及对生产灵活性和生产复杂性的管理能力的大幅提升。多年来,宜科以创新的技术、卓越的解决方案和产品坚持不懈地为中国制造业的发展提供全面支持,并以出众的品质和令人信赖的可靠性、领先的技术成就、不懈的创新追求,在业界独树一帜。帮助中国制造业转型升级,加速智能制造进程,成为中国工业4.0智慧工厂解决方案当之无愧的践行者。

更多详情>>

联系我们

  • 联系人:章清涛
  • 热线:18611695135
  • 电话:
  • 传真:
  • 邮箱:18210150532@139.com

Copyright © 2015 ilinki.net Inc. All rights reserved. 智汇工业版权所有

电话:010-62314658 邮箱:service@ilinki.net

主办单位:智汇万联(北京)信息技术有限公司

京ICP备15030148号-1