ucOS找最高级任务--空间换时间

   用空间换时间,通过对OSRdyGrp查表找到高优先级组SRdyTbl[prio],然后把OSRdyTbl查表找到高优先级任务。

    只需两次查表即可找到,时间确定。表考虑了所有的情况,通过数组编号找到相应的情况。

ucOS找最高级任务--空间换时间_第1张图片


ucOS找最高级任务--空间换时间_第2张图片

在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态: 

OSRdyGrp |=OSMapTbl[prio>>3];

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

如果要使一个优先级别为prio的任务脱离就绪状态则可使用如下类似代码: 

if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==0)//去除相应位后寻找是否还是零

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

优先级判定表OSUnMabTbl[],其内容如下:

INT8U  const  OSUnMapTbl[]= {

    0, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    6, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       

    5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    7, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    6, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    5, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      

    4, 0, 1,0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0       

};

因为8位参数的取值为0—255,所以它一共有256个值。数组的下标是优先级,8位正好256个状态,256个下标。每个下标对应的数字的第几个二进制数字先是一,就为几(因为这个是我们最关心的).例如

1二进制表示为00000001,第0个数字为1,就为0;

2二进制表示为00000010,第1个数字为1,就为1;

3二进制表示为00000011,第0个数字为1,就为0;

4二进制表示为00000100,第3个数字为1,就为3;

依次类推,当8位参数(n)最低位为1时,即奇数的表示都为0.

此表作用是找出8位参数中逻辑1所在的最低位,即将8位参数转换为二进制,然后从第0为开始查找,看第几位首先出现逻辑1。此表中元素的取值从0—7,用其查找最高优先级任务的算法如下:

y  =OSUnMapTbl[OSRdyGrp];

x  =OSUnMapTbl[OSRdyTbl[y]];

prio =(y<<3)+x;

   详细内容:http://note.youdao.com/share/?id=fc8d4d97dae2a5b676a2c53ce926ed57&type=note

你可能感兴趣的:(OS)