我比较喜欢图,如下图:

图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. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  2. Windows环境下使用Guard整合Compass和Livereload进行SASS的开发

    配置运行环境 Guard,Compass 和 Livereload 是 Ruby 的 Gem 套件,需要 Ruby 运行环境.另外还需要安装 Ruby 的扩展开发包 Development-Kit,以 ...

  3. input[type="file"]的图片预览

    在项目中遇到用input标签file类型的文件上传,想实在上传之前进行图片的预览功能:之前的做的一个解决方案是文件先上传上去然后返回地址再显示在页面上,这样就不太好,因为用户基本信息可能并没有保存,但 ...

  4. nodejs 封装mysql连接池

    写在前面的 在nodejs后台代码中,我们总是会和数据库打交道 然而,每次都要写数据库的配置以及连接和断开,不胜其烦 我就封装了一个连接池模块,不足之处还请多多批评 上代码 一下是写在mysqls.j ...

  5. div隐藏但是依然占位置

    <!doctype html> <html> <head> <meta charset="utf-8"> <script ty ...

  6. NodeJS学习笔记 (9)网络服务-https(ok)

    模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严峻的今天,网站采用HTTPS是个必然的趋势. 在nodejs中,提供了 https 这个模块来完成 HTTPS 相关功能.从官方文档来看 ...

  7. python yield 生成器的介绍(转载)

    您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一个常见的编程题目来展示 yield ...

  8. HISTFILESIZE与HISTSIZE的区别

    在linux系统中,history命令可以输出历史命令,历史命令默认保存在文件~/.bash_history中. HISTFILESIZE 与 HISTSIZE都是history命令需要用到的两个sh ...

  9. iOS技术栈-Swift版

    在网上没找到基于Swift的技术栈介绍,或者技术已经不适用,所以自己画了一个,后面的博客中会重新整理基于Swfit的UI控件介绍和常用第三方库地图

  10. Android APP弱网测试问题和解决分析

    最近做了一次移动APP的弱网和中断测试,接下来分享一下遇到的一些问题: 1.现象:用户登录应用时下载初始化数据,下载过程中因网速太慢点击取消并重新登录,数据初始化完成后出现重复,造成数据不一致. 原因 ...