开启辅助访问 切换到窄版

打印 上一主题 下一主题

UCOS II 学习之 优先级管理

[复制链接]
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式


《嵌入式实时操作系统uCOS-II》中对于优先级管理讲了整整三页,猛的一度不禁让人一头雾水,感觉似乎用到了一种玄而又玄的神奇算法,却不知道到底讲了什么。仔细读又读了很多遍,才发现UCOS II 中优先级管理的巧妙的算法核心思想实际上很简单——即人工提前计算,以减轻处理器的工作量。
本文分为两部分介绍UCOS II的优先级管理机制,第一部分为原理,第二部分为具体代码实现,不涉及具体编程的话就可以先跳过去,等有需要了再回来查找。
  UCOS II 要不断执行当前就绪态优先级最高的任务,那么最简单的方法就是建立一个有顺序的表,位于表的前端优先级高,表的后端优先级低,然后在表中填入响应的任务,位于前端的任务优先执行。在采用计算机语言表达时,我们可以用一个64位的数,每一位表示一个优先级,最低位表示最高优先级,当前位置位表示这个优先级有可以执行的任务。
那么问题来了,在查找优先级最高的任务时,最简单的办法就是遍历——从表的最前端开始查找,执行遇到的第一个任务。遍历虽然简单,但是速度慢,查找时间不定。UCOS II 有64个优先级,所以在最坏情况下需要计算64次才能找到当前需要执行的任务。这在要求响应速度高的场合是不能接受的。
为了解决这个问题,UCOS II 将优先级分成八组,从0-8第一组,9-15第二组......以此类推,当每一组存在就绪的任务时,这一组的标志位就置位。这样做有两个优点,第一,大部分嵌入式处理器不是64位,常用32位或16位,这样可以把64位长数转化为8个8位的数进行储存。第二,提升了查找速度,从原来最多查找64次,变成最多查找16次就可以找到,即先查找标志位中优先级最高的组,最多查8次,然后查组内优先级最高的位置,最多8次。
现在的问题变成了如何获取一个8位数的最低为1的数的位置,比如0x24,即二进制0010 0100最低非0位置为3;0x28,即二进制0010 1000最低非0位置为4。UCOS II的解决办法就是提前计算:由于八位数存在256种可能,那么提前计算好所有可能,并且将其编入一张表中。把需要查询的八位数作为序号,计算出的数值作为结果填入,当需要查询的时候只需要将八位数作为数组的地址即可返回结果,这样对优先级组进行一次查表,组内进行一次查表,两次计算即可返回当前可执行任务最高优先级。
  在UCOS II中,OSMapTbl[X]是一个位的数组,即之前的查找表,OSRdyTbl[Y]为8位char型数组,Y为优先级组序号,对应的值为每一个优先级组内的八个优先级,OSRdyGrp是一个unsigned char型数,每一位为该优先级组标志位。
64位优先级占用一个可以用一个char型变量prio表示,3/4/5位为优先级组组编号,0/1/2位为具体组内编号即:

y = OSMapTbl[OSRdyGrp]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表