uCos中优先级判定表OSUnMapTbl原理

OSOSRdyTbl[0]的bit7-bit0对应于优先级7-0,
OSOSRdyTbl[1]的bit7-bit0对应于优先级15-8,
OSOSRdyTbl[2]的bit7-bit0对应于优先级23-16,
OSOSRdyTbl[3]的bit7-bit0对应于优先级31-24,
OSOSRdyTbl[4]的bit7-bit0对应于优先级39-32,
OSOSRdyTbl[5]的bit7-bit0对应于优先级47-40,
OSOSRdyTbl[6]的bit7-bit0对应于优先级55-48,
OSOSRdyTbl[7]的bit7-bit0对应于优先级63-56
OSRdyGrp确定了优先级的次低三位(bit5-bit3),OSOSRdyTbl确定了优先级的低三位(bit2-bit0),

OSRdyGrp = 0x011;  //0b00010001
OSRdyTbl[0] = 0x0a; //0b00001010
OSRdyTbl[4] = 0x01; //0b00000001
计算出存在的几个优先级为;0*8+1=1,0*8+3=3,4*8+0=32
假设OSRdyGrp最低位为1的是X位,OSRdyTbl[X]最低为1的是Y位,
则优先级=X*8+Y
因此只要知道了上述的X,Y就可算出最高优先级
OSUnMapTbl就是将0x00-0xff每个数据中最低位为1的位数一一列举出来
INT8U  const  OSUnMapTbl[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    //OSUnMapTbl[0]    
    //OSUnMapTbl[1]    1        bit0       
    //OSUnMapTbl[2]    2        bit1 
    //OSUnMapTbl[3]    3        bit0 
    //................

    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};

 

OSUnMapTbl数组中元素OSUnMapTbl[n]表示一个任意的8位无符号数n对应的最低位为1的那个最低位数,例如二进制数00000001B最低位为1的是bit0,如是OSUnMapTbl[00000001B] = 0,

又例如1000000B最低位为1的是bit7,所以OSUnMapTbl[10000000B] = 7,及OSUnMapTbl[128]也就是上面OSUnMapTbl第9行第一列为7.

X = OSUnMapTbl[OSRdyGrp];
Y = OSUnMapTbl[OSRdyTbl[X]];
最高优先级为X*8+Y

 

1.      任务优先级表是按照由左至右,由上至下的顺序增长的,且优先级号越小优先级越高。

2.      任务优先级存储在一个字节型数组里,数组大小为8,其还有一个行表,即一个字节单元,用于确定在数组的哪行有任务。

3.      任务优先级由一个字节的低6个bit组成,其最低优先级为2^6-1 = 63(优先级范围为0~63),其中高3bit对应行表,低3bit对应数组中某字节单元。

4.      位掩码OSMapTbl[8],下标0~7对应值00000001、00000010、00000100、00001000、00010000、00100000、01000000、10000000,其作用是屏蔽其他bit值,下标0~7对应行表(高3位)和优先级表(低3位)。

5.      OSUnMapTbl[]数组用于查找最高优先级,其经过精心设计。

首先,找行表值在OSUnMapTbl[]中的对应位置的值x

然后,找优先级表第x行值在OSUnMapTbl[]中对应位置的值y

—查找方法:由于行表值为8bit,则高4bit对应OSUnMapTbl[]中行值,低4bit对应OSUnMapTbl[]中列值;对应优先级表查找方法同行表查找方法。

最后,prio = x<<3 + y。

注:OSUnMapTbl[]数组构造方法:

--由优先级表的构造,即越靠左越靠上的优先级越高可知:

1.低4bit无值,那么就高4bit的最低为1值的位确定-例:0000-0, 0001-4, 0010-5,0011-4……

2.低4bit有值,那么就低4bit的最低为1值的位确定-例:00000000-0,10010001-0,00111010-1,00001011-0……

3.由1和2有第1列值为0,4,5,4,6,4,5,4,7,4,5,4,6,4,5,4;第2列全为0,第3列全为1,第4列全为0,第5列全为2,第6列全为0,第7列全为1,第8列全为0,第9列全为3,第10列全为0,第11列全为1,第12列全为0,第13列全为2,第14列全为0,第15列全为1,第16列全为0。

时间: 2024-08-02 17:15:55

uCos中优先级判定表OSUnMapTbl原理的相关文章

阿里云HybridDB for PG实践 - 行存、列存,堆表、AO表的原理和选择

标签 PostgreSQL , Greenplum , 向量计算 , 行存储 , 列存 , AO表 背景 Greenplum支持行存和列存,支持堆表和AO表,那么他们有什么不同,如何选择呢? 行存和列存的原理 1.行存,以行为形式组织存储,一行是一个tuple,存在一起.当需要读取某列时,需要将这列前面的所有列都进行deform,所以访问第一列和访问最后一列的成本实际上是不一样的. 在这篇文档中,有deform的详细介绍.<PostgreSQL 向量化执行插件(瓦片式实现) 10x提速OLAP>

大神帮帮忙-ssh中2个表联合hql查询流程问题

问题描述 ssh中2个表联合hql查询流程问题 我的hql语句是用Guide 和UserGuide这两个表进行连接查询结果,执行hql后用Guide接收其返回值,那么我需要在Guide实体类中将UserGuide实体类做为属性引入,是不是这样的流程,还有没有其他要注意的.最好有一些代码让我参考参考. 解决方案 你这样也行. 你要做两表联查,也可以根据外键,来用hql语句查询到数据.其实查询数据有很多种方法,你觉得哪一种你熟悉,或者性能好,或者你感觉方便,你就可以 使用哪一种,看需求就行了.我推荐

等价类结和判定表的软件测试方法应用

摘要:软件测试的类型通常分为白盒测试和黑盒测试,其中基于等价类的划分法与基于判定表的测试法都是较为典型和实用的黑盒测试技术方法.在实际工作中,为了使测试用例的覆盖更加全面,测试目的更加明确,通常不仅仅局限于某一种测试手段.针对等价类和判定表这两种方法各自的特点,可以将两者有机结合,通过对输入条件进行等价类划分,对输出行为进行判定表列举,用综合的手段进行软件测试工作,从而达到使测试用例的设计覆盖全面.条理清晰的目的. 关键词:等价类:判定表:软件测试 1.概述 软件测试的类型一般来说,可以划分为白

Yii中srbac权限扩展模块工作原理与用法分析_php实例

本文实例讲述了Yii中srbac权限扩展模块工作原理与用法.分享给大家供大家参考,具体如下: 1. 设置权限规则表:可放在module模块配置文件里面 public function init() { //操作权限表,必须存在以下字段: //itemname角色名/ID, //type授权项目类型/1(任务)或者2(角色), //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->itemTable

指针-ucos中当调用延时函数时会释放cpu使用权,当延时时间到了以后又会夺取cpu使用权吗

问题描述 ucos中当调用延时函数时会释放cpu使用权,当延时时间到了以后又会夺取cpu使用权吗 当延时时间到了以后,这个延时的函数的优先级一定是最高的吗,这个是怎么保证的, ucos中好多次参数都是指针,或者指针的指针,变量或函数的数据类型也是很XX(不知道怎么形容,感觉不那么显眼一下子就能看懂,而是要一层一层的跟踪进去),

Yii中srbac权限扩展模块工作原理与用法分析

本文实例讲述了Yii中srbac权限扩展模块工作原理与用法.分享给大家供大家参考,具体如下: 1. 设置权限规则表:可放在module模块配置文件里面 public function init() { //操作权限表,必须存在以下字段: //itemname角色名/ID, //type授权项目类型/1(任务)或者2(角色), //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->itemTable

40-.net如何从数据库中的一个表中取值

问题描述 .net如何从数据库中的一个表中取值 假设这是我数据库里的一张表(数据库是oracle),我该如何取得这些数将他们传给jsonObj.Rows,求教各位大神,能给个具体的实现过程吗? 解决方案 sonObj.Rows是你自己组装的json对象吧,你首先要查询数据库,这个自己看msdn把,很简单,获取值后开始组织json就行了 解决方案二: 自己读取数据后,通过服务器端代码赋值给aspx上的script标签就行,注意<%%>这种代码不能放js文件里面,必须是在aspx页面里面才能解析运

金山wps文档中的工作表单独怎么设置密码

  在金山wps文档的编辑中,不少网友都会插入数据表格,方便用户理解.不过,一些网友担心表格内的数据会被篡改,因此会把整个文档设置密码.不过,您可以按照下面的方法,设置成:在WPS文字插入的表格不让修改,只能修改表格外的文字.下面就来看看具体的教程吧! 保护工作表 金山wps文档中的工作表设置密码的方法: 1.在文字需要插入表格的地方点"插入"菜单,选下拉列表中的对象. 2.在选"新建"--"WPS表格 工作簿",确定. 3.系统自动打开ET工作

ADO.NET中的多数据表操作浅析之读取

ado|数据 在开发基于.NET平台的数据库应用程序时,我们一般都会用到DataSet,作为ADO.NET的核心类它为我们提供了强大的功能,而整个看上去就像是放在内存内的一个小型数据库,内部包括了DataTable.DataView.DataRow.DataColumn.Constraint以及DataRelation.当初看到它时真的是有点兴奋. 下面根据我的一些经验来举例说明在ADO.NET中的多表填充.关联表更新以及多个Command对象执行过程中启用事务的操作.欢迎大家交流,或在Blog