预计阅读时间: 4分钟
就绪表记录着等待运行的任务优先级号,优先级号也可以认为是任务 ID(系统任务有专用 ID) ,即一个任务只有唯一的一个优先级并且这个优先级对应着该任务,知道优先级,就知道了是哪个任务。她们是一一对应的关系。 就绪表大小可以裁剪,即可以小于 8 个字节大小。
就绪表是一个数组,以 0-63 个优先级为例(最高优先级为 0)。
使用二进制表示(这里从左往右数偏移,方便观察,一般来说都是从右往左的),方便说明。
[img=358.01843pt,243.51253pt]http://www.embed.cc/bbs/source/plugin/csdn123_news/display_picture.php?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FfpA42W9rbq6cutNjnqT45nnMDgNECrb1EvAfctO79Ib198oqCcxNyBW8obicibx8kz4tgAV2lAvplibO5MXTbnvRw%2F640%3Fwx_fmt%3Dpng[/img]
以该数组为例(内容随便写的,如果都为 0 ,说明没有任务准备运行,但实际上空闲任务是一直处于就绪态),某一 bit 置 1 表示一个任务处于就绪态,准备运行。
[img=241pt,205.01056pt]http://www.embed.cc/bbs/source/plugin/csdn123_news/display_picture.php?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FfpA42W9rbq6cutNjnqT45nnMDgNECrb1w9uFxzyLKJEUnW5YPnOCPb3oD9yZFztFHLsnINVqwxSbAiaNtmOeHOQ%2F640%3Fwx_fmt%3Dpng[/img]
从 OSRdyTbl[ 0 ] = 0100 0101 b(b 表示二进制) 内容中我们可以看出优先级为 0*8 + 1 = 1 、0*8 + 5 = 5 、0*8 + 7 = 7 的任务已经准备好,可以开始运行了。
从 OSRdyTbl[ 1 ] = 0000 0100 b(b 表示二进制) 内容中我们可以看出优先级为 1*8 + 5 = 13 的任务已经准备好,可以开始运行了。
从 OSRdyTbl[ 2 ] = 0001 0010 b(b 表示二进制) 内容中我们可以看出优先级为 2*8 + 3 = 11 、2*8 + 6 = 5 的任务已经准备好,可以开始运行了。
继续分析其他字节内容 ...........最后一个字节为 0 表示该组没有任务准备运行。
从当前的分析,可以由就绪表得出准备运行的任务:
随便找一个 bit 为 1 的位置,就说明一个任务处于就绪态,我们可以根据该任务在就绪表的位置计算优先级(优先级在 u/COS II 中就是任务代号,任务调度就是根据它进行调度)设置该 bit 在一个字节中的 bit 偏移为 x ,在数组中的字节偏移为 y(OSRdyTbl[ y ])
那么得出优先级公式为: priority = y*8 + x。
通过优先级我们也可以确定该任务是否处于就绪态:
OSRdyTbl[ Priority / 8 ] & (1 |