ucOS查找最高优先级时所查表的生成过程和实现代码
- UID
- 1029342
- 性别
- 男
|
ucOS查找最高优先级时所查表的生成过程和实现代码
ucOS是剥夺型实时多任务内核,优先级最高的任务一旦准备就绪,便拥有cpu的所有权开始投入运行。每个任务的优先级不同并且是唯一的,所以通过任务调度ossched()查找准备就绪的最高优先级的任务并进行上下文切换。 ucOS是通过查表法找到准备就绪的优先级最高的任务,下面将说明查表的过程。既然ucOS中每一个任务的优先级是唯一的,所以ucOS根据优先级来唯一的确定任务。uc/os支持64个任务,也就是有64个优先级(0~63),二进制中可以用6位来表示,然后根据高三位将64个任务分为8个准备就绪表数组osrdytbl[7],每组又根据低3位包含8个任务,若每组有任务处于就绪态,则相应的比特置1;uc/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 |
|
|
|
|
|