我比较喜欢图,如下图:

图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. Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

    解决办法 在使用Glide的那段代码加是否在主线程判断 if(Util.isOnMainThread()) { Glide.with(ClassifyItemDetailActivity.this). ...

  2. (转载)10个实用的但偏执的Java编程技术

    10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 作者:小峰来源:码农网|2015-09- ...

  3. 网页结构的简介和Xpath语法的入门教程

    相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式.BS4.Xp ...

  4. requests 常见方法总结

    请求设置:requests.get/post ( url, data={}, params={}, headers={}, timeout=0.01, files={}   Session()    ...

  5. Vue export和import

    config/index.js export default '123456'; import strs from '@/config';   //此处直接写@config就可以, 如果是export ...

  6. 【转载】如何学习C++

    原文地址: http://www.hankcs.com/program/cpp/how_to_learn_c__.html 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<T ...

  7. C语言手册-read

    名称: pread,read-从文件读 语法: #include <unistd.h> ssize_t pread(int fildes, void *buf, size_t nbyte, ...

  8. 洛谷 P1026 统计单词个数 (分组+子串预处理)(分组型dp再次总结)

    一看完这道题就知道是划分型dp 有两个点要注意 (1)怎么预处理子串. 表示以i为开头,结尾在j之前(含),有没有子串,有就1,没有就0 (2)dp的过程 这种分成k组最优的题目已经高度模板化了,我总 ...

  9. 洛谷P4994 终于结束的起点

    希望是这道题的第一篇题解,并且真的做到了! upd 2018/11/4:规律补锅,让代码更加易懂 本来月赛时想打个表,打到一半,发现\(n\)稳定在\(m\)附近? 题目的意思是\(n < m ...

  10. inux 虚拟机桥接模式 静态ip设置,桥接才是王道

    修改/etc/sysconfig/network-scripts  目录下的 ifcfg-eth0 [root@yangcb network-scripts]# cat ifcfg-eth0 DEVI ...