您的位置:首页 > 其它

ucos学习笔记01---OSUnMapTbl的理解

2008-10-10 01:11 302 查看
/*----------------------------------

ucos中的OSUnMapTbl,用来快速查询优先级。这个算法在ucos里面用的较多,比如后面的任务管理、任务间通信等都用到了。

每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。

在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。

就绪表OSRdyTbl[]的一个元素元素对应着一组任务,这个元素的每一位对应表示这一组的那个任务是否进入就绪态。

算法分析:寻找最高优先级任务的所在组 , 找一组8个中的那个优先级最高的

----------------------------------

计算出总优先级。

y = OSUnMapTbl[OSRdyGrp];

x = OSUnMapTbl[OSRdyTbl[y]];

prio = (y << 3) + x;

使任务进入就绪状态

OSRdyGrp |= OSMapTbl[prio >> 3];

OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];

从就绪表中删除一个任务

if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)

OSRdyGrp &= ~OSMapTbl[prio >> 3];

----------------------------------*/

//下面是生成OSUnMapTbl[256]的代码

#include <stdio.h>

int main(void)

{

int i,t,n;

int tab[256]={0};

for(i=0;i<8;i++)

for(t=1;(t<<i)<256;t++)

{

tab[t<<i]=i;

}

//output this tab

for(n=0;n<=0xff;n++)

{

if(n%0x10==0)

printf("/n");

printf("%3d" , tab
);

}

printf("/n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: