csformat 发表于 2009-12-18 07:59:32

UCOS就绪列表查询问题

附上原文的说先


程序清单 L3.6 从就绪表中删除一个任务
if ((OSRdyTbl &= ~OSMapTbl) == 0)
    OSRdyGrp &= ~OSMapTbl;

        以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRdyTbl所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRdyTbl开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSUnMapTbl()(见文件OS_CORE.C)。OSRdyTbl[]中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的,如程序清单L3.7所示。


程序清单 L3.7 找出进入就绪态的优先级最高的任务
y    = OSUnMapTbl;
x    = OSUnMapTbl];
prio = (y << 3) + x;

        例如,如果OSRdyGrp的值为二进制01101000,查OSUnMapTbl得到的值是3,它相应于OSRdyGrp中的第3位bit3,这里假设最右边的一位是第0位bit0。类似地,如果OSRdyTbl的值是二进制11100100,则OSUnMapTbl]的值是2,即第2位。于是任务的优先级Prio就等于26(3*8+2)。利用这个优先级的值。查任务控制块优先级表OSTCBPrioTbl[],得到指向相应任务的任务控制块OS_TCB的工作就完成了。

我仔细看了源代码中的这个       优先级判定表OSUnMapTbl()(见文件OS_CORE.C)

还是不能理解是如何查询的,01101000, 这个是68,入过查表的话是3,为什么就对应了OSRdyGrp中的第3位bit3后面的就更费解了

希望路过的朋友解惑。

感谢大家先了

csformat 发表于 2009-12-18 08:09:33

/

INT8UconstOSUnMapTbl[] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                           */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                           */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                           */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                           */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                           */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                           */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                           */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                           */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0      /* 0xF0 to 0xFF                           */
};

再付令我费解的表表~~~

csformat 发表于 2009-12-18 08:18:52

晕,每次发帖子,或者问人以后,未解答自己就明白了~~~~

如果OSRdyGrp的值为二进制01101000

如果OSRdyTbl的值是二进制11100100

如果

原来作者是假设的说,我费解了一晚上,就纳闷这数是哪来的呢~~~~~~~~~~~

晕~~~~·

TimCheng 发表于 2009-12-18 08:21:52

朋友,看完UCOS之后,再看看嵌入式构件,对你帮助会很大的.

csformat 发表于 2009-12-18 08:57:39

多谢楼上朋友的指点

我就是看的UCOS第二版,邵贝贝那本的
页: [1]
查看完整版本: UCOS就绪列表查询问题