嵌入式开发交流网论坛
标题:
ucos任务调度系统-优先级调度原理
[打印本页]
作者:
襄垣战队收人
时间:
2018-10-18 08:57
标题:
ucos任务调度系统-优先级调度原理
0x00
摘要
本文对上一节中任务优先级就绪表相关内容进行讲解
,
介绍任务就绪表如何工作
,ucos
如何利用任务就绪表实现调度时的时间无关性
,
这也是
ucos
能够满足实时性的一个重要原因
.
0x01
引言
Ucos
任务调度中依据就绪表中的优先级进行调度
,ucos
如何根据就绪表来判断哪个优先级最高
,
其原理又是什么
.
如果将所有优先级进行遍历虽然可以实现任务的调度
,
但是却不能保证任务的实时性
,
因为每次调度的时间是不一样的
,
如果通过遍历方式优先级越靠前的任务就绪时
,
调度的时间少
,
如果优先级靠后则调度的时间较长
,
无法满足实时性的要求
.ucos
采用了一种比较合理的方式
-
查表法
,
实现了任务调度的实时性
.
下面将对查表法进行讲解
,
让大家了解一下这种方式的实现方法
,
也便于在以后的工程中采用类似的思想
.
0x02
原理
Ucos-ii
支持
64\128\256
个优先级
,
为了简便我们这里以
64
个优先级为例进行讲解
.
Ucos
将
64
个任务分为八组
,
每组八个任务
,
这样就可以将其进行分组管理
,
其实就是建立一个用于标记组的变量和一个由于标记每个任务的数组
,
可以根据组变量对这个数组进行查找得到最高优先级
.
组变量对数组的标记可用如下图表示
[attach]13810[/attach]
当数组
OSRdyTbl
中任意一个位被标记为
1
表明对应的优先级准备就绪
,
同时将
OSRdyGrp
中对应的位标记为
1,
表明其代表的组中有就绪的任务
.
系统通过对
OSRdyGrp
进行映射得到优先级最高任务所在
OSRdyTbl
中的位置
,
然后将
OSRdyTbl
中的对应的数取出
,
然后在映射得到对应的优先级
.
通过对
OSRdyTbl
分析可以发现一个任务的优先级
,
其实就是
0~63
的数
,
它的低
3bit(
转换成十进制就是
0~7)
决定了其在
OSRdyTbl[ ]
这个数中的比特位位置
,
其
3~5bit
决定了
OSRdyTbl
的下标
,
也就是
OSRdyGrp
中的比特位位置
.
这个大家可以随便列几个数自己计算一下
,
能够更好的理解
.ucos
中的实现方式为
OSRdyGrp |= ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
ptcb->OSTCBBitY
和
ptcb->OSTCBBitX
在任务建立的时候就进行了设置
,
如下
:
ptcb->OSTCBY = (INT8U)(prio >> 3);
ptcb->OSTCBX = (INT8U)(prio & 0x07);
ptcb->OSTCBBitY
= (INT8U)(1 OSTCBY);
ptcb->OSTCBBitX = (INT8U)(1 OSTCBX);
把上面过程反过来就是
ucos
通过就绪表得到最高优先级的过程
,
这个过程仅需要一个简单的映射就能实现
.
这里的映射表为
[attach]13811[/attach]
这里其实就是将
OSRdyGrp
为下标
,
分别列出每个数的映射到
OSRdyTbl
中的数组下标
,
比如
OSRdyGrp
比特位
0
为
1(xxxx xxx1),
其他位不论为什么值都将其映射为
0,
同理比特位
1
为
1
且比特位
0
为
0(xxxx xx10),
则不论其他位为什么值
,
都映射为
1,
其他位置同理
.
这样就可得到映射表
.
通过这个表得到了
OSRdyGrp
的映射值
,
就是优先级的
3~5bit
的值
,
同理可以得到
OSRdyTbl[ ]
的映射值
,
就是优先级的
0~2bit
的值
.
将两者组合便可以得到了优先级
.
0x03
小结
上面就是
ucos
优先级的设置和反解映射的过程
,
通过上述的查表方式
ucos
可以达到不受任务数的影响
,
能够实时的得到任务的优先级
.
查表法也是很多其他工程中常用的方式
,
可能表现方式并不一样
,
但原理基本一致
.
欢
知识传播是一种美德
让更多人少走弯路
才能有更多人与你携手前进
欢迎扫码一起分享经验
[attach]13812[/attach]
如有任何疑问请后台回复
或添加
作者
Waiting_B_H
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/)
Powered by Discuz! X3.2