最近学习嵌入式操作系统,发现它的优先级表示和判别方式跟我之前看到的执行框架优先级判别方法是一样的,应该是借鉴ucos的。
之前没仔细分析过,现在看了一遍写点心得。以优先级64个为例说明。
首先是优先级分组,8个任务是一组,共分为8组 , 用 OSRdyGrp变量表示,哪一位置1,表示哪一组有任务就绪 。
每一小组的 用 OSRdyTbl[] 数组的成员表示, 数组中的成员变量中的哪一位置1,表示这一小组的任务哪一个任务就绪。
这个表示法最重要的是从变量的最低位表示0,寻找最高优先级总是从最低位开始查询,这就是最重要的原理。
比如 有三个任务同时运行 ,分别是 25 ,27 ,37
首先是分组 25= 3*8+1 ,27 =3*8+3 ,37=4*8+5 ;
第3组中有两个任务(组内位1和3),第4组有一个任务(组内位5)。
OSRdyGrp=00011000 ,第3、4位置1
OSRdyTbl[3]= 00001010,第1,3位置1
OSRdyTbl[4]= 00100000,第5位置1
就是根据这个优先级分组原理,把组的位,和组内的位,有任务就绪 ,这个两个变量相应的位置1就行。
程序中具体实现:
OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
就绪表这一步就完成了,
下一步是判断优先级,
判断优先级,就是从3个任务里,判断哪一个任务是最高优先级,咱这个举例中是25 那个优先级最高,嵌入式系统中要求判断的时间不管就绪表里有多少任务,时间要是确定的,3个任务就绪,跟13个任务就绪判断出最高优先级时间是一样的。
就有了一个,OSUnMapTbl[256] 数组,这个表怎么来的呢。
分析:如果让我们判断这个3个任务里,那个优先级高,首先要判断 这个组变量OSRdyGrp ,首先要找到最低位是1的是第几位(看上面红色字体解释),很显然是第三组优先级最高。
这个OSUnMapTbl[256] ,就是把OSRdyGrp的值 当数组下标,把OSRdyGrp 的二进制最低位是1 的位数 当做 数组值 得来的。
举例
OSRdyGrp=00011000 ,第3、4位置1 ,这个值是24,最低位是1的是第3位。
OSUnMapTbl[24] ,这个数组中的第24成员(从0开始算)就是3,可以看出表中24对应的数值是3 ,这个表就是这么得来的,提前把最低位是1的位数算出来。
先算组变量,找到第3组,第4组根本不必算了,再算组内变量优先级,,原理是一样的,也是最低位优先级最高。
找到 OSRdyTbl[3]= 00001010,第1,3位置1 ,这个值是10 ,最低位是1是第1位 ,可以看出表中第10中对应数值是1。
优先级最高的就是 = OSUnMapTbl[24]*8 + OSUnMapTbl[10]] = 3*8+1 =25
程序实现:
#if OS_LOWEST_PRIO <= 63u /* See if we support up to 64 tasks */
INT8U y;
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
就用这个两行程序判断,时间一定。
总结就是优先级分组 ,然后是最低位优先级最高,这两个最基本的原理。。