嵌入式开发交流网论坛
标题:
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
的任务就绪表由两个变量组成
,
OSRdyGrp
和
OSRdyTbl[]
,
它们都是无符号字
符型变量
,
其中
OSRdyTbl[]
数组的长度是
OS_LOWEST_PRIO / 8 + 1
,
若最低优先级为
63
,
则
OSRdyTbl[]
的长度为
8
。
为了方便管理,μCOS-II对就绪表进行了分组,每8个任务为1组。由于μCOS-II使用一个bit 位来记录一个任务是否处于就绪状态的,所以当任务数为64时,任务就绪表就可以看成一个由bit位组成的8×8的方阵,如下图所示。
[attach]634[/attach]
OSRdyGrp
是用来记录就绪表的每个组是否有任务处于就绪状态
,
而
OSRdyTbl[]
数组中的每一个成员就是一个分组。
OSRdyGrp
与
OSRdyTbl[]
的关系是
:
当
OSRdyTbl[n]
中的任何一位为
1
时
,
OSRdyGrp
的第
n
位置
1
,
否则置
0
。
从上图
的方阵中可以看出
,
就绪表中
bit
位的排列序号也等于任务优先级号。如果知道
X
、
Y
坐标的值
,
通过某种运算
,
就可以得到任务在方阵中的位置
,
即任务的优先级号。
Y
用于确定任务处于就绪表的哪一组
,
X
用于确定任务处于就绪表中第
Y
组中的哪一
bit
位
,
它们的范围都是
0~7
;
同时
,
就绪表最多有
8
个分组
,
每个分组
8
个
bit
位。
因此
,
我们可以得到这样子的关系
:
任务优先级有效的
6
个
bit
位中
,
bit0~bit2
三个
bit
位的值等于
X
的值
,
bit3~bit5
三个
bit
位的值等于
Y
的值
,
如下图所示。
[attach]635[/attach]
任务的优先级
Prio
与
X
、
Y
的关系是
:
<span style=";font-family:微软雅黑;color:#666666;font-size:14px">Prio = Y * 8 + X = (Y
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/)
Powered by Discuz! X3.2