OSUnMapTb[ ] 讲解


OSRdyGrp确定了优先级的次低三位(bit5-bit3),OSOSRdyTbl确定了优先级的低三位(bit2-bit0), 


OSRdyGrp = 0x011;  //0b00010001 
OSRdyTbl[0] = 0x0a; //0b00001010 
OSRdyTbl[4] = 0x01; //0b00000001 
计算出存在的几个优先级为;0*8+1=1,0*8+3=3,4*8+0=32 
假设OSRdyGrp最低位为1的是X位,OSRdyTbl[X]最低为1的是Y位, 
则优先级=X*8+Y 
因此只要知道了上述的X,Y就可算出最高优先级 
OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位数一一列举出来 
INT8U  const  OSUnMapTbl[256] = { 
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */ 
    //OSUnMapTbl[0]     
    //OSUnMapTbl[1]    1        bit0        
    //OSUnMapTbl[2]    2        bit1  
    //OSUnMapTbl[3]    3        bit0  
    //................ 


    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */ 
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */ 
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */ 
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */ 
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */ 
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */ 
}; 


X = OSUnMapTbl[OSRdyGrp]; 
Y = OSUnMapTbl[OSRdyTbl[X]]; 
最高优先级为X*8+Y 


注:


X = OSUnMapTbl[OSRdyGrp]; 


此句的试举例以得此推论(只找从低位起,首次出现就绪标志“1”的那个座位号,从0号数起....):


如:OSRdyGrp=0x00;%00000000,<-字节里没有出现“1”,默认OSUnMapTbl[1]表中第1号元素,位置号为0


如:OSRdyGrp=0x01;%00000001,<-字节里第0位出现“1”,即OSUnMapTbl[1]表中第1号元素,位置号为0


如:OSRdyGrp=0x02;%00000010,<-字节里第1位出现“1”,即OSUnMapTbl[2]表中第2号元素,位置号为1


如:OSRdyGrp=0x03;%00000011,<-字节里第0位出现“1”,即OSUnMapTbl[3]表中第3号元素,位置号为0


如:OSRdyGrp=0x04;%00000100,<-字节里第1位出现“1”,即OSUnMapTbl[4]表中第4号元素,位置号为2


...........


...........


以此推之便得到unUnMapTbl[]表,该表的最重要的作用:就是放进一个字符型数据(不大于255的数),就可以找到该数据  最低位是“1”的是哪个位!以此将就绪组放进去,查到的是最低就绪组,找到最低就绪组x后,再把改组的数据放进去,然后查到的是最低就绪组里的数据的最低位是“1”的是哪个位y........


那么:最高优先级为X*8+Y  解决!!


OSUnMapTb[ ]生成代码

#include "stdio.h"
unsigned char ucGetLowestBit1Num(unsigned char In)
{
	unsigned char i = 0;
	for(i=0; i<8; i++)
	{
		if(In & (1<<i))
		{
			return i;
		}
	}
	return 0;
}
unsigned char OSUnMapTbl[256];
int main()
{
	unsigned char In;
	unsigned short i;
	for(i=0; i<=255; i++)
	{
		OSUnMapTbl[i] = ucGetLowestBit1Num(i);

		printf("%3d", OSUnMapTbl[i]);
		if( (i+1) % 0x10==0 )
			printf("\n");
	}
	return 0;
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值