| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | 
您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> ucOSII >> 文章正文 用户登录 新用户注册
对UC/OS中的就绪表的一点点理解            【字体:
对UC/OS中的就绪表的一点点理解
作者:佚名    文章来源:21control    点击数:    更新时间:2005-12-31
   就绪表在数学上是一个8*8的方阵,方阵中的每个元素是8位的无符号整型变量,即元素值处于0~255范围之内。
    当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 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • uC/OS-II 初级程序员指南

  • μC/OS-II的实时性能分析

  • uC/OS-II任务栈处理的一种改…

  • μC/OSII中的时钟中断技术研…

  • uC/OS-Ⅱ在C167CR单片机上的…

  • 基于uC/OS-II的变频器变结构…

  • μC/OS-II在AT89C51上的移植

  • 嵌人式实时操作系统uC/OS在…

  • uC/OS开发方法

  • uc/os 任务调度机制

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)