我比较喜欢图,如下图:

图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. [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)

    题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...

  2. 解决django.db.utils.InternalError: (1049, "Unknown database 'exam_db'")

    先检查seeting数据库配置DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'eaxm_db', ' ...

  3. lua-C++ userdata使用

    lua-C++ userdata使用 所负责的产品使用非常灵活,可设置的参数上千个,而且还支持用户用lua进行流程控制,所以开发中要用到很多lua.C++混合编程.之前对这些也还是一知半解,只会依葫芦 ...

  4. sql拼接

    with t as( select 'Charles' parent, 'William' child union select 'Charles', 'Harry' union select 'An ...

  5. MFC基础知识

    1.句柄:具有内存后,系统返回的标识符 2.消息:相当于事件,例如鼠标点击就是一个消息 3.消息队列:就是将事件按照时间的先后顺序在一个队列中 4.消息处理机制:首先操作系统拿到消息,然后将消息放到消 ...

  6. 紫书 例题8-11 UVa 10954 (优先队列)

    解法和合并果子是一样的, 每次取最小的两个, 更新答案, 加入队列 #include<cstdio> #include<queue> #define REP(i, a, b) ...

  7. flume 读取kafka 数据

    本文介绍flume读取kafka数据的方法 代码: /************************************************************************* ...

  8. Codeforces Round #256 (Div. 2) B. Suffix Structures(模拟)

    题目链接:http://codeforces.com/contest/448/problem/B --------------------------------------------------- ...

  9. SVN配置以及自己主动部署到apache虚拟文件夹

    SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...

  10. UItableView中的一些方法

    有关UITableView的知识点相对照较简单,一些简单的经常使用的方法有时间在写上: 以下的几个方法假设仅仅是展示UITableView是用不到的,须要对对应的区段进行操作的时候才会用到. 方法例如 ...