对UC/OS中的就绪表的一点点理解
就绪表在数学上是一个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
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。