UC/OS-II是常用的嵌入式实时操作系统,该操作系统最多支持64个任务,由于操作系统是优先级抢占型实时系统,因此对任务最高优先级如何查找是比较重要的。
在UC/OS-II中采用位图法的方式表示,也就是每一个bit表示一个任务,因此可以将一个8bits的数组成含有8个元素的数组即可。当任务已经准确就绪以后就会将相应的位设置为1。通常采用OSRdyTbl[i],0=
由于在UC/OS-II中优先级号越小,优先级越高,因此我们在实际的调度过程中需要知道优先级别最高的。本来只有64bits,可以采用简单的查询实现,但是我们可以知道对于不同的优先级号,查询的时间是不相同的,这样也就是的我们的实时系统有了一定的延时。在UC/OS-II中的实现体现了一定的优越型,对于不同的优先级别都是相同的时间,这样也就使得实时型进一步提高。他的实现方法主要是依据了查表法。具体的表格设计思路如下。根据上面的分析可以知道,我们只需要分别知道行列就能知道有限级别号。那么找到最优先的行号和最优先的列号也就实现了最高优先级的查找。
实现的思路如下:
因为OSRdyGrp有8bits,那么可能存在256种情况,通过OSRdyGrp就能知道最优先的行i,同样OSRdyTbl[i]也是8bits,那么也有8bits,一共存在256种情况,通过他也就能知道最优先的列j。因此我们也可以根据同样的表实现判断。
表的设计过程如下:
由于OSRdyGrp存在256种情况,我们只需要知道为1的最低bit就知道了最优的行号,比如OSRdyGrp=98(d)=1100010(b),为1的最低bit为bit1,因此我们就可以根据OSRdyGrp知道最高优先级号是在第1组中,即找到行号为1。同样的方法也可以适用于最优列的查找。
因此可以设计表为如下:
- INT8U const OSUnMapTbl[256] = {
- /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
- 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 0x5F */
- 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 */
- };
根据上面的表格能找到每一个OSRdyGrp值对应的最高优先级号所在的行,同样依据上表能找到OSRdyTbl[i]每一个值对应的最高优先级号所在的列。然后依据上面的等式TaskPrior = 8*i+j=(i<<3)+ j,分别确定i,和j。
即:
i = OSUnMapTbl[OSRdyGrp] ;// 找到行号
j = OSUnMapTbl[OSRdyTbl[i]];//找到列号
TaskPrior = 8*i+j=(i<<3)+ j;//找到最高优先级号。
以上的位图和查表法的相结合就很好的解决了UC/OS-II的优先级管理问题。
拓展:如果优先级别号越高,表示的有限级越高时,同样也可以采用这种位图法和查表相结合的原理。只是表格的内容存在差别而已,那时就应该选择最高bit为1时对应的bit值。这样就能很快的找到就绪的最大的优先级别号。
阅读(2613) | 评论(0) | 转发(0) |