ucos-II 任务就绪表学习笔记


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

 

这两个变量的对应关系是

 

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

具体的对应关系如下图

 

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

 

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

m

位表示

0

0000 0001

1

0000 0010

2

0000 0100

3

0000 1000

4

0001 0000

5

0010 0000

6

0100 0000

7

1000 0000

 

由上可知

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 , 即二进制: 01101000

 

根据低位优先级高,可知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,接下来我们画一个表格来总结一下

 

OSRdyGrp

OSUnMapTbl[OSRdyGrp]

 个数

0b xxxx xxx1

0

2^7

0b xxxx xx10

1

2^6

0b xxxx x100

2

2^5

0b xxxx 1000

3

2^4

0b xxx1 0000

4

2^3

0b xx10 0000

5

2^2

0b x100 0000

6

2^1

0b 1000 0000

7

2^0

 

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

 

 

 

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

#include

voidmain(void)
{
    int i,t;
    int tab[256]={0};
    for(i=0;i<8;i++)
        for(t=1;(t<         {
            tab[t<         }

}

 

你可能感兴趣的:(ucos-II 任务就绪表学习笔记)