UC/OS基础知识之任务就绪表

来源:互联网 发布:linux 网络库 编辑:程序博客网 时间:2024/05/18 20:32

UC/OS基础知识之任务就绪表

1.任务就绪表
系统总是从处于就绪状态的任务中选择任务运行,为此系统需要一个就绪任务登记表,它登记了系统中所有处于就绪状态的任务,在UC/OS中这个就绪表就是一个位图,系统中的每个任务都在这个位图中占据一个进制位,该位值得状态(1或者0)表示该任务是否处于就绪状态。
其示意图如下图所示:


OSRdyTbl[]数组的一个元素代表8个任务的就绪状态,一个元素构成一个任务组,数组有8个元素就能表示64个任务了,为了便于对就绪表进行查找,UC/OS有定义了一个数据类型为INT8U的变量OSRdyGrp,并使该变量的每一位对应OSRdyTbl[]的一个元素,若OSRdyTbl[]某个元素不为零,则在变量OSRdyGrp中把该位对应的位置1,。例如OSRdyGrp=11100101,那么OSRdyTbl[0],OSRdyTbl[2],OSRdyTbl[5],OSRdyTbl[6],OSRdyTbl[7]任务组中有任务就绪。
示意图如下图

由于优先级别是一个单字节的数字,而且最大值不会超过63,即二进制形式的00111111,因此可以将优先级别看成是一个6位的二进制数,用高3位(D5D4D3)来指明OSRdyGrp的具体数据位,并且用来确定就绪表数组元素下标,用低3位(D2D1D0)来指明该元素具体的数据位。

2.对任务就绪表的操作
2.1.登记
当某个任务处于就绪状态时,系统就将该任务登记在任务就绪表中,即在任务就绪表中将该任务的对应位置1。对优先级别为prio的任务设置为就绪状态:

OSRdyGrp|= OSMapTbl[prio>>3];//确定它的行,置1   Prio的次高三位可以确定OSRdyGrpOSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];//确定它的列,置1   低三位可以确定OSRdyTbl[]

OSMapTbl[]是为加快运算速度定义的一个数组
其定义如下:

2.2.注销
当某个任务脱离了就绪状态时,系统就在就绪表中将该任务的对应位设置为0。实现的代码如下。

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

2.3找出进入就绪态的优先级最高的任务

y = OSUnMapTbl[OSRdyGrp];x= OSUnMapTbl[OSRdyTbl[y]];prio = y<<3 +x;

这里 OSUnMapTbl[]同样是uC/OS-II为提高查找速度定义的一个数组,它共有256个元素,其定义如下:

INT8U  const  OSUnMapTbl[256] = {    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F */    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 0x5 */    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 */};

在查找最高级就绪任务时,如果使用循环程序在就绪表中进行查找的方法会造成查找时间的不确定,所以Jean J.Labrosse 在设计的时候设置了这样一个数组,在查找最高级就绪任务时,只要以变量OSRdyGrp为下标,就可直接在数组OSUnMapTbl[]得到就绪任务的y值了;
由于在使用数组OSUnMapTbl[]时是以OSRdyGrp为下标的因此这个数组一共有256个元素。也就是说,无论OSRdyGrp是多少,在数组OSUnMapTbl[]中总能找到对应的元素值,而且这个元素值就是最高级就绪任务优先级别的y。因为数组OSUnMapTbl[]各个元素的值是基于这样一个思想来设置的:表示任务组的变量OSRdyGrp是一个8位二进制数,从这个数的最低位向高位查找,碰到的第一个为1的位所对应的就绪任务足一定是最高优先级别任务所在的组,所以它的组号一定是最高优先级别就绪任务的级别(6位数)的高3位。例如:OSRdyGrp中第一个为1的位为D3,那么最高优先级别就绪任务级别的高3位一定为011(十进制的3),于是在数组OSUnMapTbl[]的256个元素中,凡是其下标的D3位1,且D2,D1,D0都为0的元素值均定义为3。同样,这个数组也用来查找最高级就绪任务的x值。当然,这时是以OSRdyTbl[y]为下标来进行查找的。

0 0
原创粉丝点击