开启辅助访问 切换到窄版

打印 上一主题 下一主题

uCOS-II中OSUnMapTbl[]查找表的分析

[复制链接]
作者:若七年 
版块:
嵌入式操作系统 ucOSII 发布时间:2018-6-17 09:47:08
9440
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式



相信某些朋友在学习μCOS-II嵌入式实时操作系统时候,会遇到了这样子的一个问题: μCOS-II中找出进入就绪状态的优先级最高的任务时,使用的OSUnMapTbl[]查找表是如何得到的?下面的内容将与大家一起来分析,当然,本文描述的仅仅是我个人理解分析的过程而已。
μ COS-II规定最多支持64 个任务,每个任务都被赋予不同的优先级等级,范围是0~63,相当于任务ID。反过来说每一个优先级,在同一时刻只能有一个任务占用。因此μCOS-II的优先级用一个字节来表示即可,其中有效的只有低6 [5:0],2 始终为0,如下图所示:

μ COS-II最低的优先级由OS_CFG.H 文件中的宏定义OS_LOWEST_PRIO,即最低的优先级决定,数值上最大63
μCOS-II内核在RAM 中维护着一个任务就绪表,用就绪表中的一个bit 位记录一个任务是否处于就绪状态。
若为1,则表示该任务处于就绪状态;若为0则表示该任务处于脱离就绪状态。μ COS-II的任务就绪表由两个变量组成OSRdyGrpOSRdyTbl[],它们都是无符号字符型变量其中OSRdyTbl[]数组的长度是OS_LOWEST_PRIO / 8 + 1若最低优先级为63OSRdyTbl[]的长度为8
为了方便管理,μCOS-II对就绪表进行了分组,每8个任务为1组。由于μCOS-II使用一个bit 位来记录一个任务是否处于就绪状态的,所以当任务数为64时,任务就绪表就可以看成一个由bit位组成的8×8的方阵,如下图所示。


OSRdyGrp 是用来记录就绪表的每个组是否有任务处于就绪状态,OSRdyTbl[]数组中的每一个成员就是一个分组。OSRdyGrpOSRdyTbl[]的关系是:OSRdyTbl[n]中的任何一位为1OSRdyGrp的第n位置1否则置0
从上图的方阵中可以看出就绪表中bit位的排列序号也等于任务优先级号。如果知道XY坐标的值,通过某种运算就可以得到任务在方阵中的位置,即任务的优先级号。Y 用于确定任务处于就绪表的哪一组X用于确定任务处于就绪表中第Y组中的哪一bit它们的范围都是0~7同时就绪表最多有8个分组每个分组8bit 位。
因此我们可以得到这样子的关系:任务优先级有效的6bit位中bit0~bit2三个bit位的值等于X的值bit3~bit5三个bit位的值等于Y的值如下图所示。



任务的优先级PrioXY的关系是:<span style=";font-family:微软雅黑;color:#666666;font-size:14px">Prio = Y * 8 + X = (Y

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

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

本版积分规则

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