相信某些朋友在学习μCOS-II嵌入式实时操作系统时候,会遇到了这样子的一个问题: “μCOS-II中找出进入就绪状态的优先级最高的任务时,使用的OSUnMapTbl[]查找表是如何得到的?”下面的内容将与大家一起来分析,当然,本文描述的仅仅是我个人理解分析的过程而已。
μ COS-II规定,最多支持64 个任务,每个任务都被赋予不同的优先级等级,范围是0~63,相当于任务ID。反过来说,每一个优先级,在同一时刻只能有一个任务占用。因此,μCOS-II的优先级用一个字节来表示即可,其中有效的只有低6 位[5:0],高2 位始终为0,如下图所示:
μ COS-II最低的优先级由OS_CFG.H 文件中的宏定义OS_LOWEST_PRIO,即最低的优先级决定,数值上最大63。
μCOS-II内核在RAM 中维护着一个任务就绪表,用就绪表中的一个bit 位记录一个任务是否处于就绪状态。
若为1,则表示该任务处于就绪状态;若为0,则表示该任务处于脱离就绪状态。μ COS-II的任务就绪表由两个变量组成,OSRdyGrp和OSRdyTbl[],它们都是无符号字符型变量,其中OSRdyTbl[]数组的长度是OS_LOWEST_PRIO / 8 + 1,若最低优先级为63, 则OSRdyTbl[]的长度为8。
为了方便管理,μCOS-II对就绪表进行了分组,每8个任务为1组。由于μCOS-II使用一个bit 位来记录一个任务是否处于就绪状态的,所以当任务数为64时,任务就绪表就可以看成一个由bit位组成的8×8的方阵,如下图所示。
OSRdyGrp 是用来记录就绪表的每个组是否有任务处于就绪状态,而OSRdyTbl[]数组中的每一个成员就是一个分组。OSRdyGrp与OSRdyTbl[]的关系是:当OSRdyTbl[n]中的任何一位为1时,OSRdyGrp的第n位置1,否则置0。
从上图的方阵中可以看出,就绪表中bit位的排列序号也等于任务优先级号。如果知道X、Y坐标的值,通过某种运算,就可以得到任务在方阵中的位置,即任务的优先级号。Y 用于确定任务处于就绪表的哪一组,X用于确定任务处于就绪表中第Y组中的哪一bit位,它们的范围都是0~7;同时,就绪表最多有8个分组,每个分组8个bit 位。
因此,我们可以得到这样子的关系:任务优先级有效的6个bit位中,bit0~bit2三个bit位的值等于X的值,bit3~bit5三个bit位的值等于Y的值,如下图所示。
任务的优先级Prio与X、Y的关系是:<span style=";font-family:微软雅黑;color:#666666;font-size:14px">Prio = Y * 8 + X = (Y |