原创 ucos-II中就绪表学习笔记

2011-12-6 19:23 998 13 13 分类: MCU/ 嵌入式

 

 

就绪表中有两个变量:OSRdyGrp 和 OSRdyTbl[].

 

这两个变量的对应关系是

 

OSRdyTbl[ n ] 中任何一位是1时, OSRdyGrp  的第n 位 是1。相当于OSRdyGrp  是OSRdyTbl[]的索引。

具体的对应关系如下图

 

#

数组OSRdyTbl[8] 按位来算的话正好是64个位---64个优先级。接下来我们再分析一下任务优先级变量: prio。由上图可知优先级变量的低三位 :在OSRdyTbl[OS_LOWEST_PRIO/8+1] 中 “位”的位置; 次高三位: 在OSRdyGrp 中 “位”的位置。

 

 数值m 换算成“位”的位置(OSMapTbl[]的值)

<table border="1" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="width:284px;">

m

</td> <td style="width:284px;">

位表示

</td> </tr> <tr> <td style="width:284px;">

0

</td> <td style="width:284px;">

0000 0001

</td> </tr> <tr> <td style="width:284px;">

1

</td> <td style="width:284px;">

0000 0010

</td> </tr> <tr> <td style="width:284px;">

2

</td> <td style="width:284px;">

0000 0100

</td> </tr> <tr> <td style="width:284px;">

3

</td> <td style="width:284px;">

0000 1000

</td> </tr> <tr> <td style="width:284px;">

4

</td> <td style="width:284px;">

0001 0000

</td> </tr> <tr> <td style="width:284px;">

5

</td> <td style="width:284px;">

0010 0000

</td> </tr> <tr> <td style="width:284px;">

6

</td> <td style="width:284px;">

0100 0000

</td> </tr> <tr> <td style="width:284px;">

7

</td> <td style="width:284px;">

1000 0000

</td> </tr> </tbody> </table>

 

由上可知

1.使进入就绪态的方法:

 

Prio的次高三位可以确定OSRdyGrp

OSRdyGrp  |=  OSMapTbl[Prio>>3];

 

低三位可以确定OSRdyTbl[]

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

 

2. 使脱离就绪态的方法:

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

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

 

 

由就绪表找出优先级最高的任务:上面的反运算,须查表

 

y = OSUnMapTbl[OSRdyGrp ];

x = OSUnMapTbl[ OSRdyTbl[y] ];

 

Prio = y<<3+x;

 

OK,那我们看看这个OSUnMapTbl[] 表是如何建立起来的

假设 OSRdyGrp= 0x68 , 即二进制: 0110 1000

 

根据低位优先级高,可知 OSRdyGrp 中bit3 优先级最高。在OSRdyTbl[3] 中查找,如果OSRdyTbl[3]=0xE4 ,即二进制 1110 0100 ,可知 bit2 优先级最高。 于是乎Prio = 3<<3+2=26

 

 

#

 

 

 

当OSRdyGrp= = 0bxxxx xxx1 时,最高优先级在OSRdyTbl[0]中 ,即OSUnMapTbl[OSRdyGrp] = 0

同理

当OSRdyGrp= = 0bxxxx xx10 时,最高优先级在OSRdyTbl[1]中 ,即OSUnMapTbl[OSRdyGrp] = 1  , 以此类推

 

OK,接下来我们画一个表格来总结一下

 

<table border="1" cellpadding="0" cellspacing="0"> <tbody> <tr> <td style="width:142px;">

OSRdyGrp

</td> <td style="width:142px;">

OSUnMapTbl[OSRdyGrp]

</td> <td style="width:142px;">

 个数

</td> </tr> <tr> <td style="width:142px;">

0b xxxx xxx1

</td> <td style="width:142px;">

0

</td> <td style="width:142px;">

2^7

</td> </tr> <tr> <td style="width:142px;">

0b xxxx xx10

</td> <td style="width:142px;">

1

</td> <td style="width:142px;">

2^6

</td> </tr> <tr> <td style="width:142px;">

0b xxxx x100

</td> <td style="width:142px;">

2

</td> <td style="width:142px;">

2^5

</td> </tr> <tr> <td style="width:142px;">

0b xxxx 1000

</td> <td style="width:142px;">

3

</td> <td style="width:142px;">

2^4

</td> </tr> <tr> <td style="width:142px;">

0b xxx1 0000

</td> <td style="width:142px;">

4

</td> <td style="width:142px;">

2^3

</td> </tr> <tr> <td style="width:142px;">

0b xx10 0000

</td> <td style="width:142px;">

5

</td> <td style="width:142px;">

2^2

</td> </tr> <tr> <td style="width:142px;">

0b x100 0000

</td> <td style="width:142px;">

6

</td> <td style="width:142px;">

2^1

</td> </tr> <tr> <td style="width:142px;">

0b 1000 0000

</td> <td style="width:142px;">

7

</td> <td style="width:142px;">

2^0

</td> </tr> </tbody> </table>

 

个数总和为255个 ,另外加上无法计算的OSUnMapTbl [0 ]  ,一共256个。

 

 

 

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

#include <stdio.h>

void main(void)
{
    int i,t;
    int tab[256]={0};
    for(i=0;i<8;i++)
        for(t=1;(t<<i)<256;t++)       //算法有重复的部分
        {
            tab[t<<i]=i;
        }

}

 

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条