任务创建时,任务加入就绪表的过程

1. μC/OS任务共64个优先级,本文中一个优先级只对应一个任务,最低优先级用二进制表示为00111111,只需占用6位,如图1所示。

图1

2. 创建任务时,会设置任务优先级prio,任务优先级被设置在任务控制块TCB中,并且任务控制块被加入到任务控制块优先级表OSTCBPrioTbl[]中,即任务控制块优先级表存储指向任务控制块的指针,如图2所示。

图2

任务优先级为19的任务,指针指向任务控制块,可以通俗理解为一个任务控制块代表一个任务。

3. 任务就绪表OSRdyGrp采用位图表的方式,64个优先级分成8组,每组对应8个优先级,优先级0~7为一组,8~15为一组……56~63为一组。

1)   当某一优先级有对应任务就绪时,该优先级标志位置1;优先级没有对应任务就绪,标志位为0。

2)   当某组优先级有至少一个任务就绪时,即至少一个优先级标志位为1,那么这一组的优先级标志位为1;若某一组优先级都没有对应任务就绪,则这一组的优先级标志位为0,就绪索引表OSRdyGrp是一个8位的数值,该数值的二进制每一位即对应优先级组的标志位,如图3所示。

图3

4.  如图4所示

1)  就绪表当前状态下第2个任务组存在优先级19的就绪任务、第4个任务组存在优先级35、38的两个就绪任务,第7个任务组中有存在优先级60的就绪任务,那么此时就绪索引表值应为10010100;

2)  反过来已知就绪表索引值为10010100,表明就绪表第2个任务组、第4个任务组、第7个任务组中有就绪任务,但是此时还无法确定每个任务组具体哪一个优先级或哪几个优先级存在就绪任务。

图4

5.  详细介绍X,Y的意义以及使用:

1)  前文提到,优先级prio只需要6位即可表示64个优先级,其中高3位D5D4D3组成Y值表示该任务优先级所在组序号,低3位D2D1D0组成X值表示该任务在当前任务组的位置,如图4所示比如优先级19的二进制为00010011,则Y=010B=2,X=011B=3,我们就能通过查表的方式轻松知道优先级19位于就绪表第2任务组中的第3位;

2)  以优先级19的任务举例细说,假设此时就绪表一个任务都没有,空闲任务IDLE也不存在,那么最初就绪表索引值为00000000,优先级19任务创建后把任务放入就绪表时,我们先看该任务优先级的Y值为2,知道把他放在就绪表第2任务组,放入之后对应的就绪表索引值应该变为00000100,X值为3,那么第2任务组里面的第3位要置1,第2任务组的状态即OSRdyTbl[2]=00001000;

3)  假设之后又有优先级30的任务加入就绪表,其对应的就绪表索引值00001000要和之前就绪表索引值进行或运算得到索引值00001100表示此时就绪表第2、第3任务组有就绪任务, 第3个任务组的状态OSRdyTbl[3]=01000000;

4)  再加入优先级31的任务,也是在第3个任务组,就绪表索引值经过计算没有变化,但是第3个任务组的状态OSRdyTbl[3]=11000000,表示第3任务存在优先级31,30的就绪任务。

如图5所以,OSMapTbl[]的作用就是将Y,X值映射为对应位置,优先级19任务的Y值为2,第2任务组,表示就绪表索引值第2位为1,映射为二进制就是00000100即十六进制0x04,X值映射类似。

图5

任务调度时,任务优先级查找的过程:这是一个任务加入就绪表的逆过程

任务加入就绪表过程,是根据优先级prio数值,把就绪表索引值和就绪表每个任务组的状态改变了

任务优先级查找过程,则是根据就绪表索引值和就绪表每个任务组的状态,来恢复优先级prio的数值

如图6所示优先级判定表OSUnMapTbl[256]和3行代码,你也许此时有个疑惑这个优先级判定表好乱好杂没有规律,不急,当你明白任务优先级如何查找时你也就知道优先级判定表是怎么样的规律了。

1)   我们接着之前的例子继续,之前例子中从就绪表没有任何任务到优先级19的任务,优先级30的任务和优先级31的任务加入后,就绪表索引值OSRdyGrp =00001100,第2任务组状态OSRdyTbl[2]=00001000,第3任务组状态OSRdyTbl[3]=11000000,这些你都应该理解了!

2)   现在我们查找优先级最高的任务,先看就绪表索引值OSRdyGrp的值00001100,如果你理解他的值得含义,你应该知道我们应该找就绪表第2个任务组,而不是查找第3个任务组,因为第2个任务组任务优先级都比第3个任务组的任务优先级高,更不会查找其他的任务组,因为其他的任务组都没有就绪任务,于是我们根据就绪表索引值OSRdyGrp的值00001100得到了最高优先级的Y值为2,这是你的理解,如果你用00001100=0x0C,得到的也是2,是不是很巧!

3)  知道查找第2个任务组了,就要看第2个任务组的状态OSRdyTbl[2]=00001000=0x08,你应该知道这里当前只有第3个位置的优先级存在就绪任务,即优先级19,如果用0x08查表,也是3,又一次巧合!倘若OSRdyTbl[2]=01001011=0x4B,你应该知道我们要找的是最高的优先级是第2任务组的第0位的16,不再是19,此时我们用0x4B查表的话,答案你应该可以猜出来了,至于优先级判定表大小为什么是256,原因:就绪表8个任务组,每组8个优先级,每一位都是2个状态,所以才有优先级判定表大小28。

图6

至此,查找到最高优先级,我们再从图2的任务控制块优先级表找到这个优先级任务指针,去执行那个任务。

任务删除过程

任务执行完毕删除时,其对应的就绪表优先级位要置0,如果它所在任务组优先级位都为0了,是不是应该也要把就绪表索引值对应的任务组标志位也置为0?任务释放掉相应资源,任务控制块优先级表的对应位置存放的指针也要清空了……

任务删除的详细过程再次就不叙述了。

一点体会:任务就绪表算法和优先级查找算法,把计算方式改为查表方式,牺牲内存换取的不仅仅是执行效率,更多是执行时间的可确定性,实时操作系统的任何操作都必须可预知的,而计算和循环则无法确定其执行的时间。

μC/OS任务就绪和优先级查找过程理解相关推荐

  1. 命题作文:在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...

  2. 命题作文 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    这是一篇命题作文.近期一直想写点东西,但一直找不到题目,正好收到一封邮件,有人问我Linux路由表的布局问题以及路由缓存的问题,加之前些日子又帮人做了一个片上路由表,所以觉得这是个好题目,索性花了多半 ...

  3. 在一棵IPv4地址树中彻底理解IP路由表的各种查找过程

    1.IPv4地址空间树 IPv4的整个地址空间可以构成一棵完美的二叉树,因为它完全占满了整个4G的地址空间.这棵树如下所示: 需要指明的是,完全画出这幅图是不可能的,如果一个节点的直径小到1mm(这意 ...

  4. 67 SD配置-交货凭证配置-分配 SD 查找过程/激活检查

    业务背景:分配 SD 查找过程/激活检查 事务码:SPRO SPRO路径:SPRO->后勤常规->批次管理->批次确定和批次检查->批次查找程序分配和检查激活->分配 S ...

  5. 元件及其规格书的查找与理解

    本内容收录在电子开发中如何查找电子元件,以及理解元件规格书的一点心得体会.紫色文字是超链接,点击自动跳转至相关博文.持续更新,原创不易! 目录: 一.电子元件的查找 1.通过百度搜索 2.通过淘宝搜索 ...

  6. CSS优先级的一些理解

    CSS有三个非常重要的特性:层叠性.继承性.优先级 对优先级的一些理解: 当同一个元素指定多个选择器,就会有优先级的产生. 选择器相同,则执行层叠性 选择器不同,则根据选择器权重执行 选择器权重如下表 ...

  7. 定制化ROM采坑之路(2):魔趣OS刷入小米5A手机过程详解

    前言 上一篇文章<魔趣8.1版本源码下载和编译过程>我们讲解了源码的下载和编译过程,这篇文章我们就需要将我们编译的刷机包刷入到我的红米5A手机中,让我们体验下我们自己的劳动成果,不过在这之 ...

  8. (转)安装黑苹果 MAC OS X Lion 10.7.2过程 (未验证)

    1.硬件和软件 若要成功组织出一台黑苹果,最重要的是所购的pc机需要兼容mac osx 系统.其中首推主板,cpu,显卡,声卡,网卡. 我的组装机硬件清单: CPU:Intel I5 2500K, 3 ...

  9. linux路由内核实现分析(三)---路由查找过程

    ------------------------------------------------------------------------------------------ 以下是我根据 li ...

最新文章

  1. 2019年终总结:好好爱自己
  2. 国内ntp时间服务器ip地址
  3. win10管理员已阻止你运行此应用”解决方法
  4. KVM — virsh 指令行工具
  5. 3.1 目标定位-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  6. 设置Windows XP自动登录的两种方法
  7. 关于FPGA的一些你必须知道的概念
  8. 百度seo排名点击器_SEO整站优化思路 - 百度seo排名点击
  9. vim编辑模式_sublime vim模式和快捷键
  10. php电子商务模板,关于php:电商系统设计之运费模板下
  11. centos6.8安装mysql6.5_centos6.8 yum安装mysql 5.6 (完整)
  12. 学习就是一件要耐的住寂寞放的下欲望舍的得享乐的事
  13. php实现先序、中序、后序遍历二叉树
  14. MD5加密概述,原理及实现
  15. nexus6 android 6.0 root,KingRoot国内首个攻破Nexus6 支持超万款手机一键Root
  16. Uni-app 小程序 App 的广告变现之路:激励视频广告
  17. Android车载技术之蓝牙通讯——如何蓝牙播放音乐
  18. 什么是互联网营销?看一篇这就够了
  19. 51 nod 2070 最小罚款
  20. 微信小程序 wx.miniProgram.navigateTo和wx.miniProgram.navigateBack无效问题解决

热门文章

  1. 面试官问我:如何设计 QQ、微信等第三方账号登陆 ?还要我说出数据库表设计!...
  2. Tomcat与Undertow的优劣对比
  3. [Java]用面向对象的知识来做一个简易版植物大战僵尸
  4. asus计算机主板,【华硕Z170-A】报价_参数_图片_论坛_ASUS Z170-A华硕主板报价-ZOL中关村在线...
  5. JAVA进入公司试用期多久_一般企业的试用期为多长时间
  6. 微信小程序个人开发全过程
  7. wscript是何物
  8. C语言小题,将字符串a复制为字符串b,然后输出字符串b。(地址法和指针变量法)(通过指针引用字符串)
  9. flutter app 换马甲
  10. 全网最好用的网站导航,都在这里了