ucos查找最高优先级任务

tech2022-10-01  87

ucos调度器任务之一:从就绪列表中查找优先级最高的任务。提示几点: 1、优先级值越小,优先级越高; 2、就绪表(数组)的位置关联优先级,如OSRdyTbl[0] bit0的优先级是最高的; 3、OSUnMapTbl[]的原理不再赘述,其作用就是找出一个byte(7 bit)中被置1的最低位。如 6 = 00000110b ,bit 1 和 bit 2 都被置1,bit1低于bit2,因此 1 会被填到OSUnMapTbl对应位置(bit x则填x)。因为bit1的值比bit2小,其任务的优先级一定高于bit2任务的优先级。

调度器实现该功能的原理如下:

y = OSUnMapTbl[OSRdyGrp]; x = OSUnMapTbl[OSRdyTbl[y]]; Prio = y<<3+x;

假设任务A、B已就绪,其优先级分别为 9和22。 则A、B所在任务组分别为1和2,所以OSRdyGrp 一定等于6, 即 0000 0110b,表明OSRdyTbl [1]和OSRdyTbl [2]中有就绪的任务。 且OSRdyTbl [1] == 2, OSRdyTbl [2] == 64,即 9 和 22 在其所在组的位置。

下面计算最高优先级 ==>> 9 。 回顾开头第2点提示,OSRdyTbl [1]任务组的优先级一定高于OSRdyTbl [2]组的优先级。 y = OSUnMapTbl[OSRdyGrp] == OSUnMapTbl[6]==1,其实就是得到最高优先级任务所在的组号 ==>> 1 。

x = OSUnMapTbl[OSRdyTbl[y]] == >> x = OSUnMapTbl[OSRdyTbl[1]] == >> x = OSUnMapTbl[2] ==>> 1

上面这一步得出y组中优先级最高的位置。

计算优先级: Prio = y<<3+x = 1<<8 + 1 = 9 优先级为9的任务是就绪列表中优先级最高的!

个人理解,请酌情食用,有误请指出。

最新回复(0)