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
这个数组出现的目的是为了更方便的置位。说白点,使用OSMapTbl[index]的作用是更方便的把某个数值的第index位置1。
程序清单:使任务进入就绪态OSRdyGrp |= OSMapTbl[prio>>3]; (1)
OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; (2)
这两行代码就实现了在就绪表中添加给定优先级(prio)任务的作用;
(1):将prio右移3位,去掉X坐标占用的后三位,只取Y坐标,填入OSMapTbl[ ], 返回值与OSRdyGrp做位或,将OSRdyGrp对应位置1,表示该行有任务进入就绪态;例如,假设prio>>3 得到 Y坐标 = 3,则OSMapTbl[ 3 ] = 00001000,与OSRdyGrp做位或,将第四位置1;
(2):将prio与0x07=00000111 做位与,保留低三位,将其他位置0,得到X坐标,将X坐标填入OSMapTbl[ ],返回值与OSRdyTbl[ Y ]做位或,将OSRdyTbl[ Y ]对应位置1,表示该行的第X位有任务进入就绪态,注意第X位要从低端算起,也就是表格的右端开始算起;例如:刚才已经算出Y坐标 = 3,假设prio & 0x07 = X坐标 = 4 ,OSMapTbl[ 4 ] = 00010000 ,将该返回值与OSMapTbl[ 3 ]做位或,将第五位置1,表示该位的任务进入就绪态;
程序清单:删除任务
从任务就绪表中将待注销任务的对应位置0。
if ( ( OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07] ) == 0)
OSRdyGrp &= ~OSMapTbl[prio >> 3];
OSRdyTbl[prio>>3]所有的位都是0时,OSRdyGrp 的相应位才清零(即对应行一个就绪任务都没有时,OSRdyGrp才为0)。所以要进行判断。
OSRdyTbl[prio >> 3] 里面可能还包含其他位为1,即在RdyTbl[prio >> 3] 中 还有其他就绪任务,这时候所对应的OSRdyGrp 的位还是1,直到RdyTbl[prio >> 3] =0,表示没有任务就绪时才应将相应的OSRdyGrp里面的位置0
以上第一行代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零;同时做一个判断,判断OSRdyTbl[prio>>3]是否已全部为0,若全部为0,则表示改组任务全都不处于就绪状态,此时可把OSRdyGrp置为0。