4926|1

64

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

等待任务列表中查找最高优先级的任务(ucos)的例子,看不懂,求详解。 [复制链接]

 以下是例子: 但是没看懂 26 是怎么运算得出的。 求解。
举例来说,如果.OSEventGrp的值是01101000(二进制),而对应的

OSUnMapTbl[.OSEventGrp]值为3,说明最高优先级任务所在的组是3。类似地

,如果.OSEventTbl[3]的值是11100100(二进制),OSUnMapTbl

[.OSEventTbl[3]]的值为2,则处于等待状态的任务的最高优先级是3×8+2=26。

最新回复

等待任务列表中查找最高优先级的任务(ucos)的例子,看不懂,求详解。 以下是例子: 但是没看懂 26 是怎么运算得出的。 求解。 举例来说,如果.OSEventGrp的值是01101000(二进制),而对应的 OSUnMapTbl[.OSEventGrp]值为3,说明最高优先级任务所在的组是3。类似地 ,如果.OSEventTbl[3]的值是11100100(二进制),OSUnMapTbl [.OSEventTbl[3]]的值为2,则处于等待状态的任务的最高优先级是3×8+2=26。 答: OSEventGrp中的最低位(位0)为1,说明优先级为0-7的任务有就绪的,就是说就绪表的0行有就绪的 OSEventGrp中的最低位(位N)为1,说明优先级为7N-(7N+7)的任务有就绪的,就是说就绪表的第N(N取值范围0-7)行有就绪的 OSUnMapTbl[OSEventGrp]这个查表的时间是固定的,是随机存取,因此立刻获得了最高优先级任务所在的组就绪表行数 因此:OSUnMapTbl[01101000]查到的是最右边的1的位置3 OSEventTbl[3]的值是11100100,同样查表,得到最右边的1的位置是2 那么3  详情 回复 发表于 2013-11-14 15:26
点赞 关注
 

回复
举报

112

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
等待任务列表中查找最高优先级的任务(ucos)的例子,看不懂,求详解。
以下是例子: 但是没看懂 26 是怎么运算得出的。 求解。
举例来说,如果.OSEventGrp的值是01101000(二进制),而对应的

OSUnMapTbl[.OSEventGrp]值为3,说明最高优先级任务所在的组是3。类似地

,如果.OSEventTbl[3]的值是11100100(二进制),OSUnMapTbl

[.OSEventTbl[3]]的值为2,则处于等待状态的任务的最高优先级是3×8+2=26。

答:

OSEventGrp中的最低位(位0)为1,说明优先级为0-7的任务有就绪的,就是说就绪表的0行有就绪的
OSEventGrp中的最低位(位N)为1,说明优先级为7N-(7N+7)的任务有就绪的,就是说就绪表的第N(N取值范围0-7)行有就绪的
OSUnMapTbl[OSEventGrp]这个查表的时间是固定的,是随机存取,因此立刻获得了最高优先级任务所在的组就绪表行数

因此:OSUnMapTbl[01101000]查到的是最右边的1的位置3
OSEventTbl[3]的值是11100100,同样查表,得到最右边的1的位置是2
那么3<<3+2=3*8+2=26
就确定了最高优先级的就绪任务是26
这些内容在 《嵌入式实时操作系统uC/OS原理与实践》的35到40页有详细的解析哦

可以贴出部分帮助你理解:
结合程序2.9所示的程序代码,首先根据OSRdyGrp查优先级判定表,原理是根据优先级立即查找到OSRdyTbl[]中对应元素,即OSRdyGrp中从低位到高位第一个为1的位的位置(从0到7)。例如,如果OSRdyGrp为11001000B,那么最低的为1的位是3号位,于是查表得到3,就是说最高优先级在OSRdyTbl[3]中。如果是01001000B,同样查到3,这就是程序2.10中为什么有那么多列是相同的原因。
假设OSRdyGrp为0,那么没有任务就绪,但是在多任务启动后没有任务就绪是不可能的,因为至少空闲任务是就绪的,所以我们添一个0占一个位置。假设OSRdyGrp的最低位为1,那么0号位置为1,就绪表中的0行有任务就绪,也就是优先级为0~7的任务有就绪的,我们就应该去查看OSRdyTbl[0]中是哪一位置为1了。OSRdyGrp的最低位为1的情况有很多,但是所有这些情况下查表得到的值都是0。
这样,读者应该了解到,优先级判定表OSUnMapTbl就是根据一个8位的无符号数的数值来确定最低的为1的位的位置的,OSUnMapTbl[n]就是n的最低位的位号。
回过头来看程序2.9中的代码就很清楚了。y=OSUnMapTbl[OSRdyGrp]是将就绪组中最低为1位的位号取出来放在y中,是就绪表中的行号。OSRdyTbl[y]是取得就绪表中对应行的值,OSUnMapTbl[OSRdyTbl[y]]是该行中最低的为1的位的号数,也就是就绪表中的列号!然后(y << 3)是将y左移3位,再加上行号,正好就是最高优先级的任务的优先级。
虽然优先级判定表比优先级映射表更大,但是查找最高优先级的任务也是用了两条语句,时间快且确定。
最后举例验证一下,就绪表和就绪组如图2.10所示。

该书当当购书地址:http://product.dangdang.com/22603276.html
 
个人签名淘宝小店:http://brightpoint.taobao.com
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表