μC/OS优先级调度机制在PowerPC上的优化

摘要: μC/OSII实时操作系统被移植到几乎所有CPU上,在我国嵌入式领域颇具影响力。μC/OS和μC/OSII是为8位CPU设计的,对于具有优先级算法硬件指令的32位中高端CPU,则应该对其任务调度算法做进一步优化,以得到更好的系统实时响应。本文以一款PowerPC系列中的中低端单片机为例,说明如何使用优先级算法硬件指令改进任务调度算法。

关键词: μC/OS;PowerPC;优先级调度;前导零计算

Optimization of μC/OS Task Switching Scheme in PowerPC Architecture

Gong Guanghua1,Che Huijun2

(1. Dept. of Engineering Physics, Tsinghua Univ.,Beijing 100084,China;2. Beijing National Railway Research&Design Institute of Signal&Communication)

Abstract: Realtime multitask kernel μC/OS and μC/OSII are ported to almost all popular processors and are widely used in China. As originally designed for 8 bit microcontroller, the kernel is not aware of nor utilizes the hardware priority calculation instruction that exists in some highperformance 32 bit microcontroller families. Based on MPC5554 from Freescale PowerPC embedded microcontroller, this article shows how the hardware priority calculation instruction is used to improve the system response latency.

Key words: μC/OS; PowerPC; task switching; count leading zero instruction

μ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的任务处于就绪态。构造如下的三个函数,用来完成设置任务就绪、取消任务就绪和寻找当前最高优先级的就绪任务。

void SetTaskRdyBit(INT8U Prio){/*设置任务就绪态*/

  if(Prio>32) OSRdyTbl [1] |= (1 << (63Prio) );

  else OSRdyTbl [0] |= (1 << (31Prio) );

}

void ClrTaskRdyBit(INT8U Prio){ /*取消任务就绪态*/

  if(Prio>32) OSRdyTbl[1] &= ~(1 << (63Prio) );

  else OSRdyTbl[0] &= ~(1 << (31Prio) );

}

INT8U FindHighestRdyTask(void){ /*寻找最高优先级的就绪态任务*/

  INT32U temp;//中间变量

  INT8Uprio=0;

  if(OSRdyTbl[0] != 0){

    temp = OSRdyTbl[0];//就绪态任务中优先级最高者在OSRdyTbl[0]中

  }

  else{

    temp = OSRdyTbl[1]; //就绪态任务中优先级最高者在OSRdyTbl[1]中

    prio +=32;

  }

  while(temp <0x80000000){//逐位查找就绪态任务中优先级最高者

    temp <<=1;

    prio ++;

  }

  return(prio);

}

作者:龚光华,车惠军 清华大学 来源:单片机与嵌入式系统


微信扫描分享本文到朋友圈
扫码关注5G通信官方公众号,免费领取以下5G精品资料
  • 1、回复“LTBPS”免费领取《《中国联通5G终端白皮书》
  • 2、回复“ZGDX”免费领取《中国电信5GNTN技术白皮书
  • 3、回复“TXSB”免费领取《通信设备安装工程施工工艺图解
  • 4、回复“YDSL”免费领取《中国移动算力并网白皮书
  • 5、回复“5GX3”免费领取《R1623501-g605G的系统架构1
  • 7、回复“6G31”免费领取《基于云网融合的6G关键技术白皮书
  • 8、回复“IM6G”免费领取《6G典型场景和关键能力白皮书
  • 本周热点本月热点

     

      最热通信招聘

      最新招聘信息

    最新技术文章

    最新论坛贴子