1.任务优先级
OSRdyGrp与OSRdyTbl类似于一个二维数组,可大概表达为prio[OSRdyGrp][OSRdyTbl]
要知道哪个任务就绪,只要知道OSRdyGrp,OSRdyTbl的值,然后从表中找出就可以了
验证:例如优先级为22的任务,转为二进制为00 010 110 ,转为x=2,y=6,查表得为22。
OSRdyGrp:ucos ii总共有64个任务,其中系统占用8个,可用的为56个,优先级最低的是OS_LOWEST_PRIOM,最高的是0,将64个任务分为8组,每组8个任务,OSRdyGrp为8位,每一位代表这个组中是否有任务正在使用,如果有,该为置1,没用为0,通过OSRdyGrp这个数据就可以知道系统中有哪些任务被调用,这些被调用的任务是在8个组中的哪一个。
OSRdyTbl:知道8个组哪些组有任务就绪后,接下来就是寻找这个组中哪些任务就绪了,就用到OSRdyTbl,该组任务中哪些任务就绪,就在该位上置1,未就绪的任务为0。通过
OSRdyGrp,OSRdyTbl的组合,就可以知道哪些任务进入就绪了
上图的方法是快速的使某个任务进入就绪态。
找出进入就绪态的优先级最高的任务
OSUnMapTbl表:
INT8U const OSUnMapTbl[256] = {
0u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x00 to 0x0F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x10 to 0x1F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x20 to 0x2F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x30 to 0x3F */
6u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x40 to 0x4F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x50 to 0x5F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x60 to 0x6F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x70 to 0x7F */
7u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x80 to 0x8F */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0x90 to 0x9F */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xA0 to 0xAF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xB0 to 0xBF */
6u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xC0 to 0xCF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xD0 to 0xDF */
5u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, /* 0xE0 to 0xEF */
4u, 0u, 1u, 0u, 2u, 0u, 1u, 0u, 3u, 0u, 1u, 0u, 2u, 0u, 1u, 0u /* 0xF0 to 0xFF */
};
一种快速的算法是,例如OSRdyGrp 为01101000,从右往左算012345678,第一个1在第4位,即3,则y=3
假设OSRdyTbl[3]的值为11100100,用上面的方法得第一个1在第3位即2,则x=2,
prio=y<<3+x=26。就可以得到优先级最高的就绪任务了