开启辅助访问 切换到窄版

打印 上一主题 下一主题

uCOS II 系列文章之就绪表

[复制链接]
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
预计阅读时间: 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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表