UCOSII学习笔记——任务调度之优先级位图法

UCOSII学习笔记——任务调度机制

  任务堆栈初始化和OS_TCB初始化完成后,需要将新创建的任务挂载到就绪队列,以便供OS_Sched调度。
那么如何完成任务挂载到就绪队列中?
  为描述就绪队列,作者没有使用传统的双向链表,而是采用优先级位图的方式。何为优先级位图?上述代码段中的两个变量OSRdyGrpOSRdyTbl实现了优先级位图。也就是利用这两个变量构成了一个8*8的表格,一个64个,代表64个任务的优先级。就绪队列的每个任务优先级由OSRdyGrpOSRdyTbl组成。在OSRdyGrp中,任务按照优先级分组,每8个优先级为1组,一共8组,OSRdyGrp的每一位对应了8个组中的某一组。OSRdyTbl[x]表示每组中的8个优先级。另外,下标xOSRdyGrp的第x组对应。因此由这两个变量映射出优先级表如下图。
在这里插入图片描述
举例说明:
  加入创建某个任务优先级prio = 11,从上图中可以看出11位于第一行第三列,根据前述,OSRdyGrp的第1位置1,OSRdyTbl[1]的第3位置1。
挂载任务
  为能将任务快速的挂至就绪表,引入了数组OsMapTbl[8],每个元素取值如下表。任务挂载就绪表,其实就是上述举例的过程:优先级为11的任务,OSRdyGrp的第1位置1,OSRdyTbl[1]的第3位置1。将11写为二进制数00 001 011,最高两位去掉为001 011,其中高三位001,用来表示行,这里表示第1行,也就是OSRdyGrp的第1位;低三位011,用来表示列,即是第三列,也就是OSRdyTbl[1]的第3位。
在这里插入图片描述

挂载的实现代码

OSRdyGrp|= OSMapTbl[prio>>3];         //挂载任务到就绪队列
OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];

如何从优先级就绪表中选取优先级最高的就绪任务?
  UCOSII是多任务实时系统,当系统中有多个就绪任务时,需要从优先级就绪表中选定优先级最高的任务运行。有任务被创建时,OSRdyGrpOSRdyTbl中某位会被置一,优先级越高OSRdyGrp被置1的位数越小。例如,有优先级11和17两个任务,优先级11的任务对应OSRdyGrp的第1位被置1,优先级为17的任务对应OSRdyGrp的第2位被置1。完成此过程用到了另外一个数组OsUnMapTbl[256],它的作用是将0x00~0xff中的每一个数的最低位为1的位数列出来。
在这里插入图片描述
通过上述描述,可以通过以下代码找到最高优先级的任务;

y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = y<<3 + x;
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值