算法的由来
我是在学习嵌入式操作系统这门课知道优先级位图算法的,可能描述的啰嗦,将就着看吧!这个算法用来对操作系统的任务进行调度。在μC/OS-II中是这样的,每一个任务都有一个优先级,但是每一个优先级只能有一个任务,那么如何让具有最高优先级的任务先执行。系统中每一个任务都有一个任务控制快TCB,可以将就绪的TCB放进就绪队列,然后处理器执行的时候从就绪队列中选择优先级最高的执行,但是这样的话,嵌入式系统的实时性无法保证,因为需要遍历就绪队列找到最高优先级的任务,所以才有了优先级位图算法。
优先级位图算法
优先级位图算法有一个数组OSRdyTbl[8],数组中的每一值有八位,这样就构成了一个8*8的格子,如下图所示。
在上面的这个表格中,我们在用一个变量OSRdyGrp(八位)来对应OSRdyTb[8]的每一个元素。这个OSRdyTb中当然不是这些1~63的数字,而都只是1,0的二进制数字。如果某一个优先级有任务,那么对应的位置标志为1,然后让OSRdyGrp对应的bit也标志为1。
例如(如图A):优先级35,转成二进制00 100 011,然后将二进制分为高三位100 = 4,低三位011 = 3,然后查看一个表如图B,找到4对应的值与OSRdyGrp相或就能将OSRdyGrp对应的行标志为1,然后3对应的值与OSRdyTbl[4]的值相或,就可以确定是哪一列(如图C)。
当然,有一个问题,比如上面的例子OSRdyGrp初始值为0,优先级35来了过后OSRdyGrp为4,也就是0000 0100,我们就知道是OSRdyTbl索引为4的值。那么,如果是多个优先级的任务且在不同的行?那怎么在多个任务中确认优先级做高的任务所在的行呢?于是就有了一种表记录OSRdyGrp所有的值的二进制中第一个1的位置,这个表如图D所示:
那这个表怎么查呢?比如有优先级6,17,35转化为二进制,6:110,17:10001,35:100011,那么经过计算过后的OSRdyGrp的值为110111,转化为16进制0X37 ,找到这个数字对应的行,然后找到这个数对应的值0,说明最高优先级的在OSRdyTabl的第0行,然后以相同的方式找到所在的列就能确定最高优先级的值了。
来源:CSDN
作者:Ace-huang
链接:https://blog.csdn.net/qq_41861259/article/details/103714955