uCOS-II中任务优先级的判定和处理方法

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992346.html

在uCOS-II中,最多有64个优先级,把这64个优先级每8个分成一组,总共可以分成8组。对应的数组名称是OSRdyTbl[x] (0≦x≦7)。为了更快捷的判断出进入就绪态的
任务,又引入了变量OSRdyGrp。OSRdyGrp来标识哪组任务中有进入就绪态的任务。例如:
      优先级为12的任务进入就绪态,那么OSRdyTbl[1]的第四位置1,OSRdyGrp的第一位置1。通过下面的图表能更明确的看出来。
通过这个表格,我们也能看出,对于OSRdyTbl[x] (0≦x≦7),如果OSRdyTbl[x]的某一位置1,那么OSRdyGrp对应的第x位也置1。
假设优先级为12的任务进入就绪态,其对应的十六进制数为0x1100,那么相应的表达式为:
OSRdyGrp         |= 0x02;
OSRdyTbl[1]      |= 0x10;
而0x02是2的1次方,0x10是2的4次方;而1和4又恰好为0x1100的次第三位和第三位。其实OSRdyTbl[x]中存放的是优先级的低三位;OSRdyGrp存放的是优先级的高三位。
      为了加快计算速度,uCOS-II中增加了一下数组,这样CPU就没必要再去计算诸如乘方等运算了,这是一种用空间换速度的做法。这个数足就是
      OSMapTbl[]   = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
同样当优先级为12时:
OSRdyGrp         |= OSMapTbl [prio >>3];   
OSRdyTbl[1]      |= OSMapTbl [prio & 0x07];
      其实,所有进入就绪态的任务都可以通过上述方法进入就绪表。
      感兴趣的话你可以测试其他的优先级情况。
      那么,uCOS-II是如何找到优先级最高的任务的呢(优先级的数值最小)。
      假设OSRdyGrp = 0x11;OSRdyTbl[0] = 0x11;OSRdyTbl[4] = 0x22;则进入就绪态的任务的优先级分别为:0*8+0 = 0; 0*8+3 = 3; 4*8+1 = 33; 4*8+5 = 37。
      通过上面的情况可以看出,优先级最高的任务肯定是在OSRdyGrp中为1的最低位对应的那一组OSRdyTbl[]中,而OSRdyTbl[]里面的为1的最低位对应的任务也就是就绪表中
优先级最高的任务。所以,如果想找出优先级最高的任务,其实就是找出OSRdyGrp中为1的最低位x以及OSRdyTbl[x]中为1的最低位y。然后优先级就是prio = x*8+y;现在的问题就
变成确定x和y了。
      跟上面提到的相同,在uCOS-II中有定义了一个数组,
INT8U  const  OSUnMapTbl[] = {

0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,

4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,      
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        
};
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
到此为止,处于就绪态的优先级最高的任务就确定了。
      数组OSUnMapTbl[]为优先级判定表,书上和网上对优先级判定表没做详细的说明,经过和王老师一番探讨,对优先级判定表的制作原理作如下解析:
      首先,我们要明确一点,我们是要查找优先级最高的任务。
      其次,假设OSRdyGrp = 0x11,OSRdyGrp十进制表示为17,二进制表示为00010001,OSRdyGrp的二进制第一位和第五位为1说明第一行和第五行有就绪任务,优先级高的当然是第一行的,所以y=OSUnMapTbl[OSRdyGrp]=0, 也就是说OSUnMapTbl[]的第十八个元素为0。假设OSRdyTbl[0]=0x11,同样的OSRdyTbl[0]十进制表示为17,二进制表 示为00010001,OSRdyGrp的二进制第一位和第五位为1说明第一列和第五列有就绪任务,所以优先级高的当然是第一列的。
       最后,不难发现不管是找行优先级高的还是列优先级高的,它们的本质一样的,就是行数低的优先级高,列数低的优先级高,按照这样的原则以OSRdyGrp或 就绪表元素值为下标,以优先级高任务的行数或列数所对应的优先级(行数减一或列数减一)为值创建出来的就是优先级判定表了!

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992346.html

时间: 2024-10-13 14:41:02

uCOS-II中任务优先级的判定和处理方法的相关文章

java运算中的优先级

java运算中的优先级1增量和减量运算2算数运算3比较运算4逻辑运算5赋值运算 java运算中的优先级,布布扣,bubuko.com

Cocos2dx中线程优先级

Cocos2dx中线程优先级问题 不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈.游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内完成,就会有掉帧,游戏卡顿.比如,游戏中要解析一个动画json配置,需要60ms,这如果在主线程中搞就掉帧了,那么另再开个线程解析json,解析完了再通知主线程如何?这是可以的,但是考虑一种极端情况,线程切换到json解析线程,直到json解析完成后才切换到主线程,这不是一样掉帧吗!所以理想情况是让

转载.怎样在Quartus II中转化HDL文件为bsf文件?

步骤1 新建或打开Quartus II工程,用QII自带文本编辑器打开HDL文件. 图1 用QII自带的文本编辑器打开HDL文件 步骤2 选择File>Create / Update>Creat Symbol Files for Current File,等待图3所示画面出现即可. 图2 选择Creat Symbol Files for Current File 图3 创建成功 现在通过File>Open,就可以打开相应的bsf文件了. 图4 生成的bsf文件 说明 通过File>

CSS中选择器优先级的权重计算

CSS中选择器优先级的权重计算 先看一段代码,如下: a{ color: red; } #box a{ color: green; } [class="box"] a{ color: gold; } .box a{ color: brown; } p a{ color: yellow; } </style> <p id='box' class="box"> <a>hello</a></p> 请问上面代码中,

java中运算符优先级

首先不需要专门记忆,也没有必要.因为作为初学者,哪个优先级高.哪个优先级低我们很难记住.就算死记硬背记住了,时间长不用也会忘记.所以当一个表达式中有多个运算符时,如果不知道哪个优先级高哪个优先级低就查一下优先级表,附录E有一个运算符优先级表.此外用的时间长了自然而然就记住了,这样记才会记得深刻. 而且事实上在编程的时候也不需要考虑优先级的问题.因为如果不知道优先级高低的话,加一个括号就可以了,因为括号( )的优先级是最高的.比如前面的程序中: k = (j>i) && (8==i);

CSS中选择器优先级与!important权重使用

原文:CSS中选择器优先级与!important权重使用 CSS中的选择器优先级与!important权重使用# .class选择器要高于标签选择器. #id选择器要高于.class选择器. 标签选择器是优先级最低的选择器. !important的属性它的权重值优先级最高的,大于所有的选择器. 标签选择器和.class选择器# 让我们进入标签选择器和.class选择器谁的优先级高实践,实践内容如:将HTML页面中的h2标签设置文本颜色. 代码块 Copy <!DOCTYPE html> <

黑盒测试用例设计-判定表驱动方法

5.判定表驱动方法 前面因果图方法中已经用到了判定表.判定表是分析和表达多逻辑条件下执行不同操作的情况的工具.在程序设计中可作为编写程序的辅助工具.把复杂的逻辑关系和多种条件组合的情况表达得较明确. (1)   判定表结构 判定表通常由4部分组成,如下图所示: ·条件桩(condition stub):列出了问题的所有条件.通常认为列出的条件的次序无关. ·动作桩(action stub):列出了问题规定可能采取的操作.这些操作的排列顺序没有约束. ·条件项(condition):列出针对它所列

.net中保存用户信息的九种方法

.net中保存用户信息的九种方法 在ASP.NET中,有几种保持用户请求间数据的途径--实际上太多了,使没有经验的开发者对在哪个特定的环境下使用哪个对象很困惑.为了回答这个问题,需要考虑下面三个条件: .谁需要数据? .数据需要保持多长时间? .数据集有多大? 通过回答这些问题,你能决定哪个对象为保持ASP.NET应用程序请求间数据提供了最佳的解决方案.图1列出了不同的状态管理对象并描述了什么时候使用它们.ASP.NET中添加了四个新的对象:Cache.Context.ViewState和Web

SQL Server 中关于EXCEPT和INTERSECT的使用方法

熟练使用SQL Server中的各种使用方法会给查询带来非常多方便.今天就介绍一下EXCEPT和INTERSECT.注意此语法仅在SQL Server 2005及以上版本号支持. EXCEPT是指在第一个集合中存在,可是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. 測试例如以下: create table t1(id int,mark char(2)) go create table t2(id int,mark char(2)) go insert into