tqOS中使用了OsMapTable任务优先级映射表来查找最高有效位。这在8*8任务的系统中是可行的,需要的查找表有256个元素。但是如果进一步提升系统的最大可支持的任务数量,比如16*16最大支持256个任务的话,就需要查找表中有2^16=65535个元素,每个元素2个字节,也就是一共128KB......不可思议,所以如果扩展最大任务数量至16*16甚至是32*32,用查找表就不合适了。可以使用循环判断最高有效位的方法,但是毕竟循环的时间复杂度不稳地,所以有了下面的基于二分查找法的最高有效位查找算法,这是我在EEWORLD里面发的一个帖子,保存下来,以后如果要修改tqOS可能会用上,也有可能在其他场合用上。程序也能修改为最高有效bit0位的查找。原理相似。
帖子链接:
删繁就简--1 bit的查找,看了白版主的0bit查找的感想
#include "stdio.h"
int bit1search(unsigned int data)
{
int pos = 0;
if((data | 0x0000ffff) != 0x0000ffff)
{
data >>= 16;
pos += 16;
}
if((data | 0x000000ff) != 0x000000ff)
{
data >>= 8;
pos += 8;
}
if((data | 0x0000000f) != 0x0000000f)
{
data >>= 4;
pos += 4;
}
if((data | 0x00000003) != 0x00000003)
{
data >>= 2;
pos += 2;
}
if((data | 0x00000001) != 0x00000001)
{
data >>= 1;
pos += 1;
}
return pos;
}
int bit1search_for(unsigned int data)
{
int pos = 0,i;
for(i=0;i<32;i++)
{
if(data & (1 << i))
pos = i;
}
return pos;
}
void main()
{
printf("%d %d\r\n",bit1search(0x00000008),bit1search_for(0x00000008));
printf("%d %d\r\n",bit1search(0x86716545),bit1search_for(0x86716545));
printf("%d %d\r\n",bit1search(0x69874861),bit1search_for(0x69874861));
printf("%d %d\r\n",bit1search(0xe987d986),bit1search_for(0xe987d986));
printf("%d %d\r\n",bit1search(0x04898646),bit1search_for(0x04898646));
printf("%d %d\r\n",bit1search(0x14584646),bit1search_for(0x14584646));
printf("%d %d\r\n",bit1search(0x35168468),bit1search_for(0x35168468));
printf("%d %d\r\n",bit1search(0x81763422),bit1search_for(0x81763422));
int i,a,b;
for(i=0;i<0xFFFFFFFF;i++)
{
a = bit1search(i);
b = bit1search_for(i);
if(a != b)
printf("error%d\r\n",i);
}
}