嵌入式开发交流网论坛

标题: uCOS-II中OSUnMapTbl[]查找表的分析 [打印本页]

作者: 若七年    时间: 2018-6-17 09:47
标题: uCOS-II中OSUnMapTbl[]查找表的分析
[attach]632[/attach]


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

[attach]634[/attach]
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的值如下图所示。

[attach]635[/attach]

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




欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/) Powered by Discuz! X3.2