首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ucOS查找最高优先级时所查表的生成过程和实现代码

ucOS查找最高优先级时所查表的生成过程和实现代码

  ucOS是剥夺型实时多任务内核,优先级最高的任务一旦准备就绪,便拥有cpu的所有权开始投入运行。每个任务的优先级不同并且是唯一的,所以通过任务调度ossched()查找准备就绪的最高优先级的任务并进行上下文切换。   ucOS是通过查表法找到准备就绪的优先级最高的任务,下面将说明查表的过程。既然ucOS中每一个任务的优先级是唯一的,所以ucOS根据优先级来唯一的确定任务。uc/os支持64个任务,也就是有64个优先级(0~63),二进制中可以用6位来表示,然后根据高三位将64个任务分为8个准备就绪表数组osrdytbl[7],每组又根据低3位包含8个任务,若每组有任务处于就绪态,则相应的比特置1uc/os还定义了一个8比特字节变量,osrdygrp准备就绪组。osrdygrp中的每一位表示8组任务中每一组是否有准备就绪的任务。假设任务0和任务7处于就绪态,则osrdytbl[0]=0x81,osrdygrp =0x01;任务60和任务63处于就绪态,则osrdytbl[7]=0x90,osrdygrp =0x80
   
//--------------------------------------------------------------
#include<stdio.h>
unsignedchar GetDatHighPriority(unsigned char val)
{
unsigned char cmpDat;
unsigned char indexPriority;

cmpDat =0x01;   // 0x01, 0x02, 0x04,0x08, 0x10, 0x20, 0x40, 0x80
indexPriority = 0;
while(1)
{
   if((val&cmpDat)==cmpDat )
    returnindexPriority;

  cmpDat <<= 1;
  if(++indexPriority>7)
    return0;
}

return0;
}

voidmain(void)
{
unsigned long i;
unsigned char tmp, buf[256];
FILE *fp;

for(i=0;i<256; i++)
{
   tmp = GetDatHighPriority((unsigned char)i );
   buf =tmp;

//  if( !(i%8) )
//   printf("\n");
//   printf(" %d ", tmp );
}

fp =fopen("ucOSTab.bin", "wb");
if( fp==NULL )
  return;

fwrite(buf,256, 1, fp);
fclose(fp);
}

//--------------------------------------------------------------
将如上文件放置在VC工程中编译运行后,会生成一个二进制文件ucOSTab.bin,打开后可以看到里面的数据与ucOS中的相关Table数据一样。
0 0 1 0 20 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
7 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
6 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
5 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
4 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
继承事业,薪火相传
返回列表