新闻中心

EEPW首页>嵌入式系统>设计应用> μC/OS优先级调度机制在PowerPC上的优化

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

作者: 时间:2010-11-25 来源:网络 收藏

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

本文引用地址://m.amcfsurvey.com/article/151312.htm

关键词: μ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 ResearchDesign Institute of SignalCommunication)
Abstract: Realtime 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 highperformance 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 (63Prio) );
  else OSRdyTbl [0] |= (1 (31Prio) );
}
void ClrTaskRdyBit(INT8U Prio){ /*取消任务就绪态*/
  if(Prio>32) OSRdyTbl[1] = ~(1 (63Prio) );
  else OSRdyTbl[0] = ~(1 (31Prio) );
}
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);
}

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

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

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 下一页

关键词:嵌入式CPU

评论


相关推荐

技术专区

关闭