新闻  |   论坛  |   博客  |   在线研讨会
对UC/OS中的就绪表的一点点理解
tongxin | 2009-04-13 17:01:12    阅读:1319   发布文章

就绪表在数学上是一个8*8的方阵,方阵中的每个元素是8位的无符号整型变量,即元素值处于0~255范围之内。
%A     当UC/OS建立任务的时候,操作系统调用OSTaskCreate(参数表……)函数创建任务。深入此函数内部,我们可以发现,任务创建的第一件事就是正确填写就绪表。
%A     那么,什么是就绪表呢?
%A     所谓就绪表,就是存放任务优先级的一个8*8的矩阵,其形状如下表1,表中的数值代表任务的优先级。
%A         C1        C2        C3        C4        C5        C6        C7        C8
%A R1        7        6        5        4        3        2        1        0
%A R2        15        14        13        12        11        10        9        8
%A R3        23        22        21        20        19        18        17        16
%A R4        31        30        29        28        27        26        25        24
%A R5        39        38        37        36        35        34        33        32
%A R6        47        46        45        44        43        42        41        40
%A R7        55        54        53        52        51        50        49        48
%A R8        63        62        61        60        59        58        57        56
%A 表1
%A
%A [align=center][/align]
%A UC/OS使用数组OSRdyTbl[]来实现就绪表,该数组共8个元素,每个元素是8位无符号的整型变量,用每个元素的每一个位来表示是否有任务占用此优先级。例如,设任务Task1的优先级设为30,则在创建该任务的时候,操作系统会填写就绪表OSRdyTbl[]元素的具体位,在表一C2,R4处“30”处写入“1”就完成了所创建任务的填写了。
%A 那么,UC/OS是怎么实现查找表1中的列C?和行R?呢?
%A UC/OS的作者使用了很巧妙的方法实现了查找:使用优先级变量prior。
%A 任务的优先级变量prior是一个8位无符号的整型,格式如下:
%A 0        0        y        y        y        x        x        x
%A Prior的3~5位用来寻找就绪表1的行,在此之后,用prior的0~2位来寻找对应行的列,根据找到的行和列,就可以确定任务优先级在就绪表中的位置了。
%A 举个例子,设任务的优先级变量为prior=00 011 110B(30D),首先取得优先级在就绪表行的位置,也就是取得prior的3~5位=prior>>3=>011B;然后取得优先级在就绪表列的位置,也就是求prior&111=>110B。使用语句:
%A OSRdyGrp[prior>>3] |= 0x0000 0001<<(prior &7)
%A 就可以使得优先级为prior的任务进入就绪表。
%A 在UC/OS这本书中,有很多像就绪表一样的数据结构,因此对类似数据结构的操作也有很多,希望本文能够给初学UC/OS的读者一些帮助,当然,里面的表述不符合规范的地方,也请指正。
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客