当前位置:
文档之家› 第三章2[1].多任务45页PPT
第三章2[1].多任务45页PPT
使用多任务,应用程序将更容易设计与维 护
2020/5/24
2
3.2.1任务优先权及优先级别
当有多个任务需要运行时,操作系统必须 在这些待运行任务中选择一个来运行。
uC/OS-II采用了按优先级抢占式规则 系统中每个任务都按照其任务的重要性分
配有一个唯一的优先级别 优先级别高的任务先运行,优先级别低的
如果某任务组中有任务就绪,则变量 OSRdyGrp里把该任务组所对应的位置为 1;否则置为0
2020/5/24
8
2020/5/24
9
由于优先级别是一个单字节的数字,而其 其最大值不会超过63,即二进制形式的 00111111.因此,可以把优先级别看成 是一个6位的二进制数,这样就可以用高3 位来指明变量OSRdyGrp的具体数据位, 并用来确定就绪表数据元素的下标。用低 3位来表明该数组元素具体数据位
任务后运行
2020/5/24
3
uC/OS-II最多可创建64个任务,任务优 先级别最多64级,用整数表示,0,1, 2...,63.数字越小,优先级越高
uC/OS-II系统配置文件OS_CFG.H中定 义了LOWEST_PRIO:定义了一个用来表 示最低优先级别的常数
系统总是把最低优先级LOWEST_PRIO赋 给空闲任务
2020/5/24
12
3.最高优先级就绪任务的查找
y=OSUnMapTal[OSRdyGrp]; //获得优先级别的高三位 x=OSUnMapTal[OSRdyGrp[x]]; //获得低三位
prio=(y<<3)+x; //获得就绪任务的优先级别
OSUnMapTbl[]识uc/os为提高查找速度定 义的一个数组,共有256个元素
该位置的状态(1/0)就表示任务是否处 于就绪状态
是一个类型为INT8U的数组OSRdyTbl[] 在就绪表中以任务优先级别(也是任务的
标识)的高低,为每个任务安排了一个二 进制位,并规定该位的值为1表示对应的 任务处于就绪状态
2020/5/24
7
为了便于对就绪表的查找uC/OS-II定义 了一个数据类型为INT8U的变量 OSRdyGrp,并使该变量的每一个位都对 应OSRdyTbl[]的一个任务组
被中止任务的任务控制块指针就存放在全 局变量OSTCBCur中,所以调度器主要工 作就是获得待运行任务的任务控制块指针
OSRdyGrp|=OSMapTbl[prio>>3]; OSRdyTbl[prio>>3] |=O; 假设优先级为12——1100b OSRdyGrp|=0x02; OSRdyTbl[1] |=0x10; 在这里我们要特别注意OSMapTbl[ ]的值
2020/5/24
15
3.2.4 任务调度
在多任务系统中,令CPU中止当前正在运 行的任务转而去运行另一个任务的工作叫 做任务切换,而按某种规则进行任务切换 的工作叫做任务的调度
uC/OS-II中,任务调度由调度器完成 调度器主要有两项工作:
在任务就绪表中查找具有最高优先级别的就绪 任务
实现任务切换
2020/5/24
第三章 任务管理
3.1 任务描述和状态,控制
3.2 多任务
3.3 任务同步
2020/5/24
1
3.2 多任务
多任务运行的实现实际上是靠CPU在许多 任务之间转换,调度实现的。
多任务运行是CPU利用率得到最大的发挥, 并使应用程序模块化
在实际应用中,多任务化的最大特点是, 可发人员可以将很复杂的应用程序层次化。
2020/5/24
13
根据就绪表确定最高优先级
通过OSRdyGrp值确定高3位,假设OSRdyGrp =0x08,对应OSRdyTbl[3],通过 OSRdyTbl[3]的值来确定低3位,假设 OSRdyTbl[3]=0x3a,最高优先级的任务为25
2020/5/24
14
使任务进入就绪态
如果prio是任务优先级,也是任务的识别号,则 将任务放入就绪表,即使任务进入就绪态的方法 是:
2020/5/24
10
对任务就绪表的操作
系统对于就绪表的主要有三个操作:登记, 注销和从就绪表的就绪任务中得知具有最 高优先级任务的标识
1.登记:当某个任务处于就绪态时,系统 就将该任务登记在任务就绪表中,即在就 绪表中将改任务的对应位置1.
OSRdyGrp | =OSMapTbl[prio>>3]; OSRdyTbl[prio>>3]
|=OSMapTbl[prio&0x07];
2020/5/24
11
2.注销:当某个任务需要脱离就绪状态时, 系统在就绪表中将该任务的对应位置0
if((OSRdyTbl[prio >>3]& OSMapTbl[prio&0x07])==0)
OSRdyGrp&=-OSMapTbl[prio >>3];
2020/5/24
4
如果应用程序中使用了统计任务,系统会 将OS_LOWEST_PRIO-1自动赋给统计 任务
用户任务可以使用优先级从 0~OS_LOWEST_PRIO-2
用户任务的优先级要由用户在创建一个任 务时显示地定义
2020/5/24
5
3.2.2可剥夺型内核
uC/OS-II属于可剥夺型内核 总是让就绪态的高优先级的任务先运行 中断服务程序可以抢占CPU,到中断服务
完成时,内核让此时优先级最高的任务运 行(不一定是那个被中断了的任务) 任务级响应时间得到了最优化,且是可知 的 应用程序不应直接使用不可重入型函数
2020/5/24
6
3.2.3 任务就绪表
uC/OS-II用一个就绪任务登记表,记录 系统中所有处于就绪状态的任务
uC/OS-II中这个登记表就是一个位图, 每个任务在这个位图中占据一个二进制位
16
uC/OS-II有两种调度器:
任务级调度器:由函数OSSched()实现 中断级调度器:由函数OSIntExt()实现 这里主要介绍任务级调度器 调度器把任务切换的工作分为: 1.获得待运行任务的TCB指针 2.进行端点数据的切换
2020/5/24
17
获得待运行任务的TCB
由于操作系统是通过任务控制块TCB来管 理任务的,因此调度器真正实施任务切换 之前的主要任务就是要获得待运行任务的 任务控制块指针和当前任务控制块指针