微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络技术文库 > μC/OS优先级调度机制在PowerPC上的优化

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

时间:10-26 来源:单片机与嵌入式系统 点击:

μC/OSII实时操作系统被移植到几乎所有CPU上,在我国嵌入式领域颇具影响力。μC/OS和μC/OSII是为8位CPU设计的,对于具有优先级算法硬件指令的32位中高端CPU,则应该对其任务调度算法做进一步优化,以得到更好的系统实时响应。本文以一款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);
}

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

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

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中对应的位。

寻找最高优先级的就绪任务时,&mu;C/OS使用了预先固化的256字

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top