| | 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | | |
![]() |
![]() |
| 您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> ucOSII >> 文章正文 |
|
|||||
| 对UC/OS中的就绪表的一点点理解 | |||||
| 作者:佚名 文章来源:21control 点击数: 更新时间:2005-12-31 | |||||
|
当UC/OS建立任务的时候,操作系统调用OSTaskCreate(参数表……)函数创建任务。深入此函数内部,我们可以发现,任务创建的第一件事就是正确填写就绪表。 那么,什么是就绪表呢? 所谓就绪表,就是存放任务优先级的一个8*8的矩阵,其形状如下表1,表中的数值代表任务的优先级。 C1 C2 C3 C4 C5 C6 C7 C8 R1 7 6 5 4 3 2 1 0 R2 15 14 13 12 11 10 9 8 R3 23 22 21 20 19 18 17 16 R4 31 30 29 28 27 26 25 24 R5 39 38 37 36 35 34 33 32 R6 47 46 45 44 43 42 41 40 R7 55 54 53 52 51 50 49 48 R8 63 62 61 60 59 58 57 56 表1 UC/OS使用数组OSRdyTbl[]来实现就绪表,该数组共8个元素,每个元素是8位无符号的整型变量,用每个元素的每一个位来表示是否有任务占用此优先级。例如,设任务Task1的优先级设为30,则在创建该任务的时候,操作系统会填写就绪表OSRdyTbl[]元素的具体位,在表一C2,R4处“30”处写入“1”就完成了所创建任务的填写了。 那么,UC/OS是怎么实现查找表1中的列C?和行R?呢? UC/OS的作者使用了很巧妙的方法实现了查找:使用优先级变量prior。 任务的优先级变量prior是一个8位无符号的整型,格式如下: 0 0 y y y x x x Prior的3~5位用来寻找就绪表1的行,在此之后,用prior的0~2位来寻找对应行的列,根据找到的行和列,就可以确定任务优先级在就绪表中的位置了。 举个例子,设任务的优先级变量为prior=00 011 110B(30D),首先取得优先级在就绪表行的位置,也就是取得prior的3~5位=prior>>3=>011B;然后取得优先级在就绪表列的位置,也就是求prior&111=>110B。使用语句: OSRdyGrp[prior>>3] |= 0x0000 0001<<(prior &7) 就可以使得优先级为prior的任务进入就绪表。 在UC/OS这本书中,有很多像就绪表一样的数据结构,因此对类似数据结构的操作也有很多,希望本文能够给初学UC/OS的读者一些帮助,当然,里面的表述不符合规范的地方,也请指正。 |
|||||
| 文章录入:fengfeiyi 责任编辑:fengfeiyi | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
![]() |
站长:康草科技 |