优先级位图算法

算法的由来

我是在学习嵌入式操作系统这门课知道优先级位图算法的,可能描述的啰嗦,将就着看吧!这个算法用来对操作系统的任务进行调度。在μ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行,然后以相同的方式找到所在的列就能确定最高优先级的值了。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值