我比较喜欢图,如下图:

图1: INT8U const OSUnMapTbl[]数组内的数据。

1、UCOSii的优先级相关内容

首先先介绍一个概念:优先级。UCOSii的优先级按倒叙排列,即优先级数值越低,对应的优先级越高。UCOSii支持64个任务,每个任务必须对应一个优先级。所以优先级数值范围:0~63。其中63号优先级(优先级最低)分配给空闲任务,62号优先级分配给统计任务(若使能统计任务)。

关于任务就绪表中OSRdyTbl[8]数组和OSRdyGrp的介绍,在这不再赘述(数据类型均为unsigned char类型)。

2、UCOSii的任务就绪表为什么搞这么多数组

OSRdyTbl[8]数组就可以存储完任务prio(8*8=64,按位存储)。而OSRdyGrp和OSUnMapTbl[16*16]只是加速运算速度并且避免循环结构(循环结构的时间不能准确测算,可能到某个值就退出循环)的发生。基本思路就是查表,OSUnMapTbl[]的表映射思路为1: 2^(查表的数值)=数值在表中的位置(表位置从0开始)。思路2: 优先级。合在一块才能得出OSUnMapTbl[]。

3、OSRdyTbl[8],OSRdyGrp与prio的关系

先举个例子看一下OSRdyTbl[8],OSRdyGrp与prio的关系。

Prio的最大值:63即:

为了叙述方便:低三位指D0~D2,高三位指D3~D5。

Prio的高三位的值映射为OSRdyGrp对应的位,映射关系:2^(Prio的高三位) =OSRdyGrp 。当然如果其他组也有就绪任务的话,n个组的2^(Prio的高三位)相加= OSRdyGrp,每个组只能加一次。而OSRdyTbl[Prio的高三位]这个数组有8个位与Prio的低三位映射关系:2^(Prio的低三位) = OSRdyTbl[Prio的高三位]。本组有多个的话,与上述类似。当然实际上是按位操作比较方便。

4、UCOSii的任务就绪表3个操作需要注意的地方

1) 注意对任务就绪表注销操作的时候:

If((OSRdyTbl[prio>>] &= ~OSMapTbl[prio&0x07]) == ))

    OSRdyGrp &= ~OSMapTbl[prio>>];

If中的条件可以分解为:

(OSRdyTbl[prio>>] &= ~OSMapTbl[prio&0x07];

    OSRdyTbl[prio>>] ==;

即:只有OSRdyTbl[prio>>3]这8个位全为0时,才把本组的标志位清0。

2) 就绪表的查找代码:

y=OSUnMapTbl[ OSRdyGrp ];

x=OSUnMapTbl[ OSRdyTbl[ y ] ];

prio = (y<<) +x;

即:这是查找表中最高优先级的方法:y就是prio的高三位,x就是prio的低三位。

OSRdyGrp本身就是prio的高三位的高三位的2次幂映射,这里通过数组进行反映射。

5、下面举例子进行说明OSUnMapTbl的由来

OSRdyGrp的D5为1,其它位为0。得:2^5(prio的高三位)=32(OSRdyGrp的值,也是OSUnMapTbl[2^5]=5)。所以查到的表就是prio的高三位。这里16*16=2^8,0~8个优先级。同理当OSRdyGrp中只有1个位为1时,分析同理。

当OSRdyGrp的D0为1时,结论应该是y(prio的高三位)=0。其他位不论为什么,因为最高优先级的关系,这些值都应该映射为0。所以奇数位置应该全为0。正如你推算的那样,图1中颜色的位置全为0。

当OSRdyGrp的D0为0,D0为1时,OSRdyGrp的数值以10b结尾的全为1。同理推算以后的数据。

至于prio的低三位映射同理。

注意图一只是0~8优先级的映射,想要得到64个优先级需要映射2次。况且图一是小值(小智,哈哈)优先映射(这是我自己组的词,不要在意)。你们可以改成大值优先映射。

6、最后说一下OSUnMapTbl数组到底怎么用

用于小值优先映射。映射优先级范围0~8。比如一个unsigned char型的变量prioMap,对应的位映射为0~8的优先级,当然就绪的优先级可能不止一个,通过prio = OSUnMapTbl[ prioMap];就能得到最高的优先级的值!

7、UCOSii中的任务就绪表的映射

这里它申请了OSRdyTbl[]做基础的映射,OSRdyGrp进行组管理,形成2级的管理模式。最多管理8*8的prio。可以想象,如果做3层管理的话,可实现8*8*8=512级优先级的管理。

从图一的图注中可以清晰地看到整个映射的情况,如果编译器支持类似Quartus ii中的类似xxx10b的编译方式,用switch语句也是不错的选择(只是猜想,不要在意),可能运行速度有些慢。

如果是大值优先映射的话,得到的表的值是连续的。即OSUnMapTbl[]中相同的数值在位置上都是相邻的!

UCOSii任务就绪表之OSUnMapTbl[16*16]的数组是如何得到的的更多相关文章

  1. ucosii --任务就绪表

    任务就绪表的任务就是高效的找出当前优先级最高的就绪任务. 由任务就绪表OSRdyTbl和任务就绪组OSRdyGrb组成,OSRdyTbl每一个位都记录着一个任务的就绪状态, 0非就绪1就绪,OSRdy ...

  2. ucos任务优先级从64到256,任务就绪表的改变

    Ucos在任务调度中经常使用的技术为任务就绪表,在之前的文章中使用的例子是低于64个优先级的任务就绪表查找方法,现在ucos将任务扩展到256优先级之后,任务就绪表的查找也做了一定的修改,今天来讲讲 ...

  3. ucos任务调度原理及任务就绪表

    之前我们说到,系统在运行的时候会直接依靠任务的优先级来找到任务的控制块从而实现任务的调用切换等功能,那么接下来的问题就是,系统是怎么找到并确定某一个特定的最高优先级任务并确定他的优先级的呢 为了解决这 ...

  4. μC/OS-II 任务就绪表及任务调度

    任务调度 多任务操作系统的核心工作就是任务调度. 所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器. μC/OS-II 进行任务调度的思想是 "近似地每时 ...

  5. 矢量图标转成16*16大小的SVG格式

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:一一链接:http://www.zhihu.com/question/32233782/answer/68629385来源:知 ...

  6. Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集

    ylbtech-Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集 1.返回顶部 1. Java 实例 - 数组并集  Java 实例 以下实例演示了如何使用 unio ...

  7. μC/OS中的任务就绪表

    为了便于对就绪表的查找,μC/OSII又定义了一个数据类型为INT8U的变量OSRdyGrp, 并使该变量的每一位都对应OSRdyTbl[ ]的一个任务组(即数组的一个元素),如果某任务组中 有任务就 ...

  8. arduino之16*16点阵庆祝祖国70周年

    之前电脑上存了很多自己写的关于arduino的有趣的小demo,因为重装了系统,不小心误删了所有的文件(气的半死),所以现在准备一有空就重写一下之前写过的东东,顺带再温习一次,这次总不能再删了吧,嘿嘿 ...

  9. 不使用局部变量和for循环或其它循环打印出如m=19,n=2結果为2 4 8 16 16 8 4 2形式的串

    需求:不使用局部变量和for循环或其它循环打印形如:2 4 8 16 16 8 4 2 这样的串 代码MainTest.java package com.szp.study.javase.specia ...

随机推荐

  1. xBIM 基础04 日志操作

    系列目录    [已更新最新开发文章,点击查看详细]  xBIM使用Log4Net来记录异常不适合的处理错误和警告.它在xBIM几何引擎中被大量使用来记录所有几何错误.如果您的文件看起来不太正确,则应 ...

  2. 模拟邮箱输入邮箱地址、收藏标签。input框输入内容后回车,内容显示成小方块并带删除按钮。

    模拟邮箱输入邮箱地址.收藏标签: 文本框输入文字后按回车键或者分号键,输入框中的文字变成小块并带删除按钮和操作. 页面代码: <!DOCTYPE html> <%@ page lan ...

  3. (转载) Android RecyclerView 使用完全解析 体验艺术般的控件

    Android RecyclerView 使用完全解析 体验艺术般的控件 标签: Recyclerviewpager瀑布流 2015-04-16 09:07 721474人阅读 评论(458) 收藏  ...

  4. JavaScript在不同环境下的全局对象

    Node.js 环境下,全局的对象是 global. 浏览器下 window === self 而不是 global,今天才发现的,我惊呆了!

  5. img图片在ie上有有空隙

    图片在ie下会有空隙 首先在全局样式中设置img标签的边距为0 img { border:0;} 一般有两个方法1,img{float:left}2,img{display:block}

  6. 用MyBatis进行数据库的增删改查

    前提是MyBatis环境部署好了,参考地址: https://www.cnblogs.com/package-java/p/10316536.html 为了方便演示,我提前在数据库插入了数据方便查询 ...

  7. Node_进阶_3

    Express框架: 一.   Express框架 Express框架是后台的Node框架,类似于JS中的jquery. #原生Node开发会有很多问题: 1呈递静态页面很不方便,需要处理每个HTTP ...

  8. [CTSC2012]熟悉的文章(广义后缀自动机+二分答案+单调队列优化DP)

    我们对作文库建出广义后缀自动机.考虑用\(SAM\)处理出来一个数组\(mx[i]\),表示从作文的第\(i\)个位置向左最远在作文库中出现的子串的长度.这个东西可以在\(SAM\)上跑\(trans ...

  9. BZOJ 2141 排队(CDQ分治)

    我们把每一次交换看做两个插入两个删除.然后就是一个三维偏序.时间一维,下标一维,权值一维. #include<iostream> #include<cstring> #incl ...

  10. Lock-less buffer management scheme for telecommunication network applications

    A buffer management mechanism in a multi-core processor for use on a modem in a telecommunications n ...