UCOSii任务就绪表之OSUnMapTbl[16*16]的数组是如何得到的
我比较喜欢图,如下图:
图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]的数组是如何得到的的更多相关文章
- ucosii --任务就绪表
任务就绪表的任务就是高效的找出当前优先级最高的就绪任务. 由任务就绪表OSRdyTbl和任务就绪组OSRdyGrb组成,OSRdyTbl每一个位都记录着一个任务的就绪状态, 0非就绪1就绪,OSRdy ...
- ucos任务优先级从64到256,任务就绪表的改变
Ucos在任务调度中经常使用的技术为任务就绪表,在之前的文章中使用的例子是低于64个优先级的任务就绪表查找方法,现在ucos将任务扩展到256优先级之后,任务就绪表的查找也做了一定的修改,今天来讲讲 ...
- ucos任务调度原理及任务就绪表
之前我们说到,系统在运行的时候会直接依靠任务的优先级来找到任务的控制块从而实现任务的调用切换等功能,那么接下来的问题就是,系统是怎么找到并确定某一个特定的最高优先级任务并确定他的优先级的呢 为了解决这 ...
- μC/OS-II 任务就绪表及任务调度
任务调度 多任务操作系统的核心工作就是任务调度. 所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器. μC/OS-II 进行任务调度的思想是 "近似地每时 ...
- 矢量图标转成16*16大小的SVG格式
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:一一链接:http://www.zhihu.com/question/32233782/answer/68629385来源:知 ...
- Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集
ylbtech-Java-Runoob-高级教程-实例-数组:16. Java 实例 - 数组并集 1.返回顶部 1. Java 实例 - 数组并集 Java 实例 以下实例演示了如何使用 unio ...
- μC/OS中的任务就绪表
为了便于对就绪表的查找,μC/OSII又定义了一个数据类型为INT8U的变量OSRdyGrp, 并使该变量的每一位都对应OSRdyTbl[ ]的一个任务组(即数组的一个元素),如果某任务组中 有任务就 ...
- arduino之16*16点阵庆祝祖国70周年
之前电脑上存了很多自己写的关于arduino的有趣的小demo,因为重装了系统,不小心误删了所有的文件(气的半死),所以现在准备一有空就重写一下之前写过的东东,顺带再温习一次,这次总不能再删了吧,嘿嘿 ...
- 不使用局部变量和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 ...
随机推荐
- scanf正则表达式
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void main() { ] = ...
- 简述Sql Server中常用的数据库对象(面试题)
1.表(Table ) 数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的.列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名.行包括了若干列信息项 ...
- 比较好的Dapper封装的仓储实现类 来源:https://www.cnblogs.com/liuchang/articles/4220671.html
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; usin ...
- Github上值得关注的前端项目-转自好友trigkit4
http://microjs.com/# 该网站的资源都托管到了github,microjs.com是一个可以让你选择微型的js类库的网站,该网站里的js库都是压缩后不大于5KB的,非常实用 http ...
- c的面向对象思想记录
在一家公司做实习生,努力学习,keep moving. //c1.h typedef struct { +]; int (*tr)(); } trans; //c1.c #include<str ...
- [luogu] P2787 语文1(chin1)- 理理思维(分块)
P2787 语文1(chin1)- 理理思维 题目背景 蒟蒻HansBug在语文考场上,挠了无数次的头,可脑子里还是一片空白. 题目描述 考试开始了,可是蒟蒻HansBug脑中还是一片空白.哦不!准确 ...
- Camera Calibration 相机标定:原理简介(二)
2 针孔相机模型 常见的相机标定中,使用的相机多为针孔相机(Pinhole camera),也就是大家熟知的小孔成像理论.将其中涉及的坐标系之间的相互转换抽离出来,即为针孔相机模型的核心. 上图所示的 ...
- 我有一个idea,但是没有钱,又没技术怎么办?
我想你还少讲一件事,就是同时如果你也没什么明确的商业计划,恭喜,那你有机会成为马云第二,因为他曾说过自己的成功要素就是「没钱」.「不懂技术」.「没有计划」,要是这么刚好让你从事互联网产业,我看不出三年 ...
- hadoop-17-hive数据库元数据查看
hadoop-17-hive数据库元数据查看 存在本地的mysql中: user001用户中 : > mysql -uhive -phive mysql> use hive; mysql& ...
- Java 8 Stream API具体解释
Java 8 Stream API具体解释 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStr ...