|
uc/os的优先级及就绪表相关
一、优先级 prio(字节型数据)
x | x | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 |
其中,D5~D3 表示“第几组”,D2~D0 表示“第几组里的第几个”。D7~D6 无用。
二、OSRdyGrp
有就绪任务存在的组。OSRdyGrp 其实就是一个 INT8U 的一个字节,每一位代表一个组,置位则表示这个组有已经就绪的任务,清零则表示这个组没有就绪的任务。
三、OSRdyTbl[ ]
就绪表,每一个元素是个 INT8U 字节型数据,每个字节的每一位分别代表一个任务,1为就绪,0为未就绪。
四、OSMapTbl[ ]
OSMapTbl[ 0 ] = 00000001B
OSMapTbl[ 1 ] = 00000010B
OSMapTbl[ 2 ] = 00000100B
OSMapTbl[ 3 ] = 00001000B
OSMapTbl[ 4 ] = 00010000B
OSMapTbl[ 5 ] = 00100000B
OSMapTbl[ 6 ] = 01000000B
OSMapTbl[ 7 ] = 10000000B
掩码,加速 cu/os-ii 的运算。
让一个 prio 的优先级变成就绪态:
OSRdyGrp | = OSMapTbl[ prio>>3 ] // prio>>3 得到组号,在 0~7 之间
OSRdyTbl[ prio >>3 ] |= OSMapTbl[ prio & 0x07 ] // prio & 0x07==>得到第XX组中的第几个任务号
// OSRdyTbl[ prio>>3 ] 定位到就绪组号
// 合并起来意思就是,在第XX组中第XX个任务就绪了
使一个优先级为 prio 的任务脱离就绪态
if(( OSRdyTbl[ prio>>3 ] &= ~OSMapTbl[ prio&0x07 ] )== 0 ) //如果这个组都已经没有就绪任务了...
OSRdyGrp &= ~OSMapTbl[ prio >> 3] //...这个组的就绪状态标志就清掉吧
五、在任务就绪表中获取优先级别最高的就绪任务的 prio
y = OSUnMapTbl[ OSRdyGrp ] //从所有就绪的组中找到组号最小的那个组
//如有第1,3,5组中有任务就绪,就么找到的就是第1组的组号 1,即y=1)
x = OSUnMapTbl[ OSRdyTbl[y] ] //从上面得到的那个组中再找到位号最低的那个任务
//接上面的第1组中,如有第5,6,4,0号任务就绪,那么找到的任务号
//就是 0,即 x = 0
故有:
prio = ( y << 3 ) + x
六、在任务 TCB 中,上述相关量的表示法
OSTCBY = priority >> 3
OSTCBBitY = OSMapTbl[ priority >> 3]
OSTCBX = priority & 0x07
OSTCBBitX = OSMapTbl[ priority & 0x07 ] |
|