版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心嵌入式系统及应用嵌入式系统及应用第五章第五章任务管理与调度任务管理与调度1电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心主要内容主要内容 任务简介任务简介 任务控制块任务控制块 任务管理任务管理 任务调度任务调度 优先级反转优先级反转2电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第一节第一节任任 务务 任务的定义及其主要特性任务的定义及其主要特性任务的内容任务的内容任务的分类任务的分类任务参数任务参数3电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 在嵌入式实时系统中任务是操作系统内核调度在
2、嵌入式实时系统中任务是操作系统内核调度的基本单位。的基本单位。 任务主要包含以下内容:任务主要包含以下内容: 代码代码:一段可执行的程序一段可执行的程序 数据数据:程序所需要的相关数据(变量、工作:程序所需要的相关数据(变量、工作空间、缓冲区等)空间、缓冲区等) 堆栈堆栈 程序执行的上下文环境程序执行的上下文环境4电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 void yourtask (void *pdata) for (;) /* 用用户户代代码码; 调调用用uc/os-ii的某些功能函的某些功能函数数*/: osflagpend(); osmboxpend(); osmu
3、texpend(); osqpend(); ossempend(); ostaskdel(os_prio_self); ostasksuspend(os_prio_self); ostimedly(); ostimedlyhmsm(); /* 用用户户代代码码 */ 任务的代码通常是一个无限循环,如下面代码所示:任务的代码通常是一个无限循环,如下面代码所示: 任务代码的定义需注意两点:任务代码的定义需注意两点:1.1.返回参数必须定义成返回参数必须定义成voidvoid。2.2.当任务开始执行时,可传递一个任何类型的参数。当任务开始执行时,可传递一个任何类型的参数。( (参数类型是参数类型是v
4、oid void 指针指针) )5电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 void yourtask (void *pdata) /* 用用户户代代码码; ostaskdel(os_prio_self); 当任务完成后,任务可以自我删除,如下面代当任务完成后,任务可以自我删除,如下面代码。码。需注意:任务代码不是真的删除了,只是内核简需注意:任务代码不是真的删除了,只是内核简单地不会再这个任务,这个任务的代码也不会再单地不会再这个任务,这个任务的代码也不会再运行了。运行了。6电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心int main(void) / 初始
5、化初始化 ucos内内核核. osinit(); / 在在开开始多任始多任务务之前必之前必须须先建立一先建立一个个任任务务 ostaskcreate(testtask1, (void *) 11, &testtaskstk1task_stk_size, 11); /第第1个参数个参数是指向是指向该该任任务运务运行代行代码码的指的指针针,第,第2个参数个参数是一是一个个指向任指向任务务初始化初始化数数据的指据的指针针, /第第3个参数个参数是任是任务务的堆的堆栈栈起始地址(高地址向低地址增起始地址(高地址向低地址增长长),), /第第4个参数个参数是任是任务务的的优优先先级级,数值数值越
6、小,越小,优优先先级级越高。越高。 / 开开始多任始多任务务,控制,控制权权交交给内给内核核 osstart(); void testtask1(void *pdata) printf(%4u: * test task 1 first call *n, ostime); /创创建其他任建其他任务务 ostaskcreate(testtask2, (void *) 22, &testtaskstk2task_stk_size, 22); while (1) printf(%4u: * test task 11 *n, ostime); ostimedly(1); 7电子科技大学嵌入式软件
7、工程中心电子科技大学嵌入式软件工程中心void testtask2(void *pdata) while (1) printf(%4u: * test task 22 *n, ostime); ostimedly(1); 注:注:1. 堆堆栈栈大小有上限,大小有上限,对对于于x86处处理器,理器,os_stk变变量量类类型是型是16位位变变量,所以堆量,所以堆栈栈大大小是小是1024b;2. 内内核允核允许许建立多建立多达达63个个用用户户任任务务,必,必须给这须给这些任些任务务分配一分配一个独个独一无二的介于一无二的介于0-62的的优优先先级级。0是最高是最高优优先先级级。3. osstar
8、t()函函数并数并不返回不返回main函函数数。8电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务的主要特性任务的主要特性 任务具有以下特性:任务具有以下特性: 动态性动态性:任务状态是不断变化的。 一般分为就绪态、运行态和等待态。一般分为就绪态、运行态和等待态。 在多任务系统中,任务的状态将随着系统的需要不断进在多任务系统中,任务的状态将随着系统的需要不断进行变化。行变化。 并发性并发性(并行性?并行性?): 系统中同时存在多个任务,这些任务在宏观上是同时运系统中同时存在多个任务,这些任务在宏观上是同时运行的行的。 异步独立性异步独立性: 每个任务各自按相互独立的不可预知的速
9、度运行,走走每个任务各自按相互独立的不可预知的速度运行,走走停停停停。 9电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 任务与程序的区别:任务与程序的区别: 任务能真实地体现工作内容的任务能真实地体现工作内容的并发性并发性,而程,而程序不能;序不能; 程序是任务的组成部分程序是任务的组成部分 除程序外,任务还包括数据、堆栈及其上下文环除程序外,任务还包括数据、堆栈及其上下文环境等内容;境等内容; 程序是静态的,任务是动态的;程序是静态的,任务是动态的; 任务有任务有生命周期生命周期,有诞生、有消亡,是短暂,有诞生、有消亡,是短暂的;而程序是相对长久的;的;而程序是相对长久的;
10、一个程序可对应多个任务,反之亦然;一个程序可对应多个任务,反之亦然; 任务具有创建其他任务的功能,而程序没有任务具有创建其他任务的功能,而程序没有。 10电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心采用多任务的好处:采用多任务的好处: 任务的任务的规模较小规模较小 每个任务更容易编码和调试,其质量也更容易得到每个任务更容易编码和调试,其质量也更容易得到保证保证 不少不少应用本身应用本身就是由多个任务构成的就是由多个任务构成的 如一个应用可能需要进行以下任务的处理:计算、如一个应用可能需要进行以下任务的处理:计算、从网络获取数据和刷新显示屏幕从网络获取数据和刷新显示屏幕 采用多任
11、务的处理方式是应用问题的一个采用多任务的处理方式是应用问题的一个非常自然非常自然的解决方式的解决方式 任务之间具有较高的独立性,耦合性小任务之间具有较高的独立性,耦合性小 通过增加新的任务就能方便的通过增加新的任务就能方便的扩充系统功能扩充系统功能 实时性强实时性强 保证紧急事件得到优先处理成为可能保证紧急事件得到优先处理成为可能11电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3内核内核内核代码内核代码内核数据内核数据栈栈数据数据任务任务控制块控制块代码代码栈栈数据数据任务任务控制块控制块代码代码栈栈数据数据任务任务控制块控制块代码代码任
12、务任务1 1任务任务2 2任务任务3 312电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类 按照到达情况的可预测性,任务可以划分按照到达情况的可预测性,任务可以划分为:为: 周期任务周期任务(periodic task) 非周期任务非周期任务 按照重要程度,可分为:按照重要程度,可分为: 关键任务关键任务(critical task) 非关键任务非关键任务(noncritical task)13电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类 周期任务与非周期任务周期任务与非周期任务 周期
13、任务每隔一个固定的时间间隔就会执行周期任务每隔一个固定的时间间隔就会执行一次。一次。 举例:飞行器可能需要每隔举例:飞行器可能需要每隔100ms获得一次关获得一次关于飞行器的速度、高度和姿态数据,控制传感器于飞行器的速度、高度和姿态数据,控制传感器获取这些数据就需要通过周期任务来进行。获取这些数据就需要通过周期任务来进行。 非周期任务执行的间隔时间则为不确定的。非周期任务执行的间隔时间则为不确定的。 举例:移动通信设备中的通信任务,该任务只有举例:移动通信设备中的通信任务,该任务只有在需要进行通信的情况下才会得到执行。在需要进行通信的情况下才会得到执行。 非周期任务分为:非周期任务分为: sp
14、oradic task:有最小到达间隔时间限制有最小到达间隔时间限制 aperiodic task:没有到达时间限制没有到达时间限制14电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类 关键任务与非关键任务关键任务与非关键任务 关键任务:关键任务: 为需要得到需要得到及时执行及时执行的任务,否则将出现灾难性的的任务,否则将出现灾难性的后果后果 举例:飞行器中用于处理生命支持系统和稳定性控制系统举例:飞行器中用于处理生命支持系统和稳定性控制系统的任务的任务 非关键任务:非关键任务: 如果没有得到及时执行,则不会产生严重后果如果没有得到及时执行,
15、则不会产生严重后果 15电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数 任务参数:任务参数: 优先级(优先级(priority) 周期(周期(period) 计算时间(计算时间(computation time) 就绪时间(就绪时间(ready time) 截止时间(截止时间(deadline)16电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数 任务的优先级任务的优先级 表示任务对应工作内容在处理上的表示任务对应工作内容在处理上的优先程度优先程度 优先级越高,表明任务越需要得到优先处理优先级越高,表明任务越需要得到优先处理 飞行器中处
16、理稳定性控制的任务,就需要具有较飞行器中处理稳定性控制的任务,就需要具有较高的优先级,一旦执行条件得到满足,应及时得高的优先级,一旦执行条件得到满足,应及时得到执行到执行 任务的优先级分为任务的优先级分为静态优先级静态优先级和和动态优先级动态优先级。 静态优先级:任务的优先级被确定后,在系统运静态优先级:任务的优先级被确定后,在系统运行过程中将不再发生变化;行过程中将不再发生变化; 动态优先级:系统运行过程中,任务的优先级是动态优先级:系统运行过程中,任务的优先级是可以动态变化的。可以动态变化的。 17电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数 uc/os中可
17、以管理中可以管理64个任务,每个任务必须有个个任务,每个任务必须有个不同的优先级。优先级的数值越低,任务的优先不同的优先级。优先级的数值越低,任务的优先级就越高。级就越高。 uc/os总是选择优先级最高的任务执总是选择优先级最高的任务执行。行。 最低优先级最低优先级63被系统保留,用户不能使用。被系统保留,用户不能使用。 在目前的版本中,任务的优先级也是与任务在目前的版本中,任务的优先级也是与任务id。18电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数 周期周期 周期任务所具有的参数,表示任务周期性执行的间隔时间 任务的计算时间任务的计算时间 任务在特定硬件环境下
18、特定硬件环境下被完整执行所需要的时间,也被称为是任务的执行时间任务的执行时间(execution time)。 由于任务每次执行的软件环境的差异性,导致任务在各次具体执行过程中的计算时间各有不同。 通常用最坏情况下的执行时间最坏情况下的执行时间(worst case time)或是需要的最长执行时间来表示,也可用统计时间统计时间(statistical time)来表示。 19电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数 任务的就绪时间任务的就绪时间任务具备了在处理器上被执行所需要条件时的时间。 任务的截止时间任务的截止时间 意味着任务需要在该时间到来之前被执行
19、完成。 截止时间可以通过绝对截止时间绝对截止时间(absolute deadline)和相对截止时间相对截止时间(relative time)两种方式来表示 相对截止时间为任务的绝对截止时间减去任务的就绪时间。 截止时间可以分为强截止时间强截止时间(hard deadline)和弱截弱截止时间止时间(soft deadline)两种情况: 具有强截止时间的任务即为关键任务关键任务,如果截止时间不能得到满足,就会出现严重的后果。 拥有关键任务的实时系统又被称为强实时强实时(hard real-time)系统,否则称为弱实时弱实时(soft real-time)系统。 20电子科技大学嵌入式软件工
20、程中心电子科技大学嵌入式软件工程中心第二节第二节任务控制块任务控制块任务状态与变迁任务状态与变迁空闲任务空闲任务任务控制块任务控制块任务切换任务切换任务队列任务队列优先级位图算法优先级位图算法21电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与变迁 任务拥有的任务拥有的资源情况资源情况是不断变化的,导致是不断变化的,导致任务状态任务状态也表现出不断变化的特性。也表现出不断变化的特性。 不同的实时内核实现方式对任务状态的定不同的实时内核实现方式对任务状态的定义不尽相同,但是都可以概括为三种基本义不尽相同,但是都可以概括为三种基本的状态:的状态: 等待等待(wa
21、iting):任务在等待某个事件的发):任务在等待某个事件的发生;生; 就绪就绪(ready):): 任务等待获得处理器资源;任务等待获得处理器资源; 执行执行(running):任务获得处理器资源,所):任务获得处理器资源,所包含的代码内容正在被执行包含的代码内容正在被执行。 22电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与变迁 在单处理器系统中:在单处理器系统中: 任何时候都任何时候都只有一个任务在只有一个任务在cpucpu中执行中执行 如果没有任何事情可做,就运行如果没有任何事情可做,就运行空闲任务空闲任务执行空执行空操作操作 任何一个可以执行的任
22、务都必须处于任何一个可以执行的任务都必须处于就绪状态就绪状态 调度程序从任务的调度程序从任务的就绪队列就绪队列中选择下一个需要执中选择下一个需要执行的任务。行的任务。 处于就绪状态的任务拥有除处于就绪状态的任务拥有除cpu以外的其他所有以外的其他所有需要的资源。需要的资源。 任务还可能处于任务还可能处于等待状态等待状态 如果任务在需要等待如果任务在需要等待i/o设备或其他任务提供的数设备或其他任务提供的数据,而数据又还没有到达该任务的情况下,就处据,而数据又还没有到达该任务的情况下,就处于等待状态于等待状态23电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与
23、变迁 任务会在不同的状态之间进行转换,即任务会在不同的状态之间进行转换,即任务状态的变迁任务状态的变迁就绪态就绪态运行态运行态等待态等待态获得获得cpucpu被高优先级被高优先级任务抢占或任务抢占或超时超时获得资源获得资源需要需要资源资源24电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3调度调度程序程序0 05 5101015152020252530303535404045455050运行运行等待等待就绪就绪三个任务进行状态转换的过程三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个包含三个任务和一个调度程序。
24、调度程序用来确定下一个需要投入运行的任务,因此需要投入运行的任务,因此调度程序本身也需要占用一定调度程序本身也需要占用一定的处理时间的处理时间。 25电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心osmboxpost()osqpost()osqpostfront()ossempost()ostaskresume()ostimedlyresume()ostimetick()osmboxpend()osqpend()ossempend()ostasksuspend()ostimedly()ostimedlyhmsm()interruptosintexit()osstart()osin
25、texit()os_task_sw()ostaskdel()ostaskcreate()ostaskcreateext()ostaskdel()task is preemptedostaskdel()等待状态等待状态睡眠态睡眠态就绪态就绪态运行态运行态中断服中断服务态务态26电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uc/os任务状态任务状态 睡眠态:指任务驻留在程序空间睡眠态:指任务驻留在程序空间(rom(rom或或ram),ram),还没还没有交给有交给ucosucos来管理。把任务交给来管理。把任务交给ucosucos来管理,是来管理,是通过调用下述通过调用下述2 2个
26、函数之一:个函数之一:ostaskcreate()ostaskcreate()和和ostaskcreateext()ostaskcreateext()来实现的。这些调用告诉内核,来实现的。这些调用告诉内核,任务程序的起始地址在哪里,优先级是多少,任任务程序的起始地址在哪里,优先级是多少,任务要使用多少栈空间等。务要使用多少栈空间等。27电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uc/os任务状态任务状态 就绪态:任务一旦建立,就进入了就绪态。任务就绪态:任务一旦建立,就进入了就绪态。任务的建立可以是在多任务运行开始之前,也可以动的建立可以是在多任务运行开始之前,也可以动态地由
27、一个运行着的任务建立。如果多任务已经态地由一个运行着的任务建立。如果多任务已经启动,且一个任务是被另一个任务建立的,而新启动,且一个任务是被另一个任务建立的,而新建立的任务的优先级高于建立它的任务的优先级,建立的任务的优先级高于建立它的任务的优先级,则刚刚被建立的新任务将立即获得则刚刚被建立的新任务将立即获得cpucpu的使用权。的使用权。 一个任务可以通过调用一个任务可以通过调用ostaskdel()ostaskdel()返回到睡眠态,返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。或通过调用该函数让另一个任务进入睡眠态。28电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心
28、uc/os任务状态任务状态 运行态:调用运行态:调用osstartosstart()函数可以启动多任务。()函数可以启动多任务。osstartosstart()函数只能在启动时调用一次,该函数()函数只能在启动时调用一次,该函数选择用户初始化代码中已经建立的、进入就绪态选择用户初始化代码中已经建立的、进入就绪态的优先级最高的任务来进行执行。的优先级最高的任务来进行执行。 等待态:从运行态到等待态有两种可能的原因等待态:从运行态到等待态有两种可能的原因: :1.1.正在运行的任务调用正在运行的任务调用ostimedlyostimedly()()函数将自身延函数将自身延迟一段时间,则该任务进入等待
29、态。迟一段时间,则该任务进入等待态。2.2.正在执行的任务需要等待某一事件的发生,如信正在执行的任务需要等待某一事件的发生,如信号量和消息,若该事件未发生或未获得,该任务进号量和消息,若该事件未发生或未获得,该任务进入等待态。入等待态。29电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uc/os任务状态任务状态 中断服务态:被中断了的任务进入中断服务态。中断服务态:被中断了的任务进入中断服务态。响应中断时,正在执行的任务被挂起,中断服务响应中断时,正在执行的任务被挂起,中断服务子程序控制了子程序控制了cpucpu使用权。中断服务子程序可能会使用权。中断服务子程序可能会使一个或多个
30、任务进入就绪态。在中断服务子程使一个或多个任务进入就绪态。在中断服务子程序返回之前,内核要判定,被中断的任务是否还序返回之前,内核要判定,被中断的任务是否还是就绪态任务中优先级最高的。若已经不是,则是就绪态任务中优先级最高的。若已经不是,则新进入就绪态的这个优先级更高的任务将得以运新进入就绪态的这个优先级更高的任务将得以运行,否则,原来被中断了的任务将继续运行。行,否则,原来被中断了的任务将继续运行。30电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制块任务控制块 内核对任务管理是通过对内核对任务管理是通过对任务控制块任务控制块(task task control bloc
31、kcontrol block,tcbtcb)的操作来实现的。)的操作来实现的。 任务控制块任务控制块是包含任务相关信息的数据结构是包含任务相关信息的数据结构 包含了任务执行过程中所需要的所有信息。包含了任务执行过程中所需要的所有信息。 任务控制块大都包括以下信息:任务控制块大都包括以下信息: 任务的名字任务的名字 任务执行的起始地址任务执行的起始地址 任务的优先级任务的优先级 任务的状态任务的状态 任务的硬件上下文(堆栈指针、任务的硬件上下文(堆栈指针、pc和寄存器等和寄存器等) 任务的队列指针等内容任务的队列指针等内容 31电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制
32、块任务控制块 一旦任务建立,一个任务控制块一旦任务建立,一个任务控制块os_tcbos_tcb就被赋就被赋值,能够保存任务被其他任务抢占时的状态。值,能够保存任务被其他任务抢占时的状态。当任务重新得到当任务重新得到cpucpu的使用权后,任务控制块的使用权后,任务控制块能够确保任务从当时被中断的那一点丝毫不差能够确保任务从当时被中断的那一点丝毫不差的继续执行。的继续执行。 下面是下面是uc/osuc/os的的os_tcbos_tcb源代码。源代码。32电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心typedef struct os_tcb os_stk *ostcbstkptr;
33、 /*指向指向当当前任前任务务堆堆栈栈顶栈栈顶的指的指针针,每每个个任任务务的堆的堆栈栈容量可以是任意的容量可以是任意的*/#if os_task_create_ext_en 0 /*允允许许建立任建立任务务函函数数的的扩扩展展*/ void *ostcbextptr; /* 指向用指向用户户自定自定义义的任的任务务控制控制块扩块扩展展 */ os_stk *ostcbstkbottom; /* 栈栈底指底指针针*/ int32u ostcbstksize; /* 栈栈空空间间,以,以栈栈元元为单为单位位 */ int16u ostcbopt; /* 把把“ “选择项选择项” ”传给传给函函数
34、数 ostaskcreateext()。目前支持三目前支持三个选择项个选择项:os_task_opt_chk用于告知用于告知内内核在任核在任务务建立建立时时允允许许建立任建立任务栈务栈检验检验,该检验该检验功能由用功能由用户户程序程序实现实现;os_task_opt_stk_clr表示任表示任务务建立建立时时,任,任务栈务栈要要清清0;os_task_opt_save_fp表示任表示任务务要做浮点要做浮点数运数运算。算。 */ int16u ostcbid; /* 保留保留 */#endif struct os_tcb *ostcbnext; struct os_tcb *ostcbprev;
35、 /* 用于任用于任务务控制控制块双块双向向链链表的前后表的前后查查找。找。*/33电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心#if (os_q_en0)&(os_max_qs0)|(os_mbox_en0)|(os_sem_en0)|(os_mutex_en0) /* 若不打算使用信若不打算使用信号号量、互斥信量、互斥信号号量、消息量、消息队队列、消息列、消息邮邮箱,箱,则对应则对应的的变变量不量不会会在在tcb中出中出现现*/ os_event *ostcbeventptr; /* 指向事件控制指向事件控制块块的指的指针针 */#endif#if (os_q_en
36、 0) & (os_max_qs 0) | (os_mbox_en 0) void *ostcbmsg; /* 传递给传递给任任务务的消息指的消息指针针*/#endif34电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心#if (os_version = 251) & (os_flag_en 0) & (os_max_flags 0)#if os_task_del_en 0 os_flag_node *ostcbflagnode; /* 指向事件指向事件标标志志节节点的指点的指针针*/#endif os_flags ostcbflagsrdy; /* 当当任
37、任务务等待事件等待事件标标志志组时组时,是使任,是使任务务进进入就入就绪态绪态的事件的事件标标志志*/#endif int16u ostcbdly; /* 任任务务允允许许等待事件等待事件发发生的最多生的最多时钟节时钟节拍拍数数, ostimetick()使用使用这个链这个链表表来来刷新各任刷新各任务务的任的任务务延延迟变迟变量量.ostcbdly */ int8u ostcbstat; /* 任任务状态务状态*/ int8u ostcbprio; /* 任任务优务优先先级级 */35电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 int8u ostcbx; int8u ostc
38、by; int8u ostcbbitx; int8u ostcbbity; /* 这这四四个变个变量用于找出具有最高量用于找出具有最高优优先先级级的任的任务务。这这些些值值是在任是在任务务建立建立时计时计算,或者算,或者是在改是在改变变任任务优务优先先级时计级时计算。算。 */ #if os_task_del_en 0 boolean ostcbdelreq; /* 表示任表示任务务是否需要是否需要删删除除 */#endif os_tcb;36电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心空任务控制块链表空任务控制块链表ostcbnextostcbnextostcbfreelis
39、tostcbtbl(0)ostcbtbl(1)null37所有的所有的os_tcb都存放在任务控制块列表数组都存放在任务控制块列表数组ostcbtbl 中的。中的。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制块任务控制块 为节约内存,为节约内存,任务数量任务数量通常需要进行预先通常需要进行预先配置配置 按照配置的任务数量初始化任务控制块,一个任务对按照配置的任务数量初始化任务控制块,一个任务对应一个初始的任务控制块,形成一个应一个初始的任务控制块,形成一个空闲任务控制块空闲任务控制块链链。 在任务创建时,实时内核从空闲任务控制在任务创建时,实时内核从空闲任务控制块链中为
40、任务分配一个任务控制块。块链中为任务分配一个任务控制块。 随后对任务的操作,都是基于对应的随后对任务的操作,都是基于对应的任务控制块任务控制块来进来进行的。行的。 当任务被删除后,对应的任务控制块又会被实时内核当任务被删除后,对应的任务控制块又会被实时内核回收到回收到空闲任务控制块链空闲任务控制块链。 38电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心初始化任务控制块初始化任务控制块 任务建立时,函数任务建立时,函数os_tcbinit()os_tcbinit()初始化任务控制初始化任务控制块块os_tcb.os_tcb.39int8u os_tcbinit( int8u pri
41、o, os_stk *ptos, os_stk * pbos, int16u id, int32u stk_size, void *pext, int16u opt) /* prio是任是任务优务优先先级级, ptos指向指向栈顶栈顶指指针针, pbos指向指向栈栈底的指底的指针针, id是任是任务标识务标识符符, stk_size是堆是堆栈栈的容量的容量, pext是是os_tcb的的扩扩展指展指针针, opt是是选择项选择项 */ os_tcb *ptcb; os_enter_critical(); ptcb=ostcbfreelist; if (ptcb!=(os_tcb *)0)电子科
42、技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心40初始化任务控制块初始化任务控制块 ostcbfreelist = ptcb - ostcbnext; os_exit_critical(); ptcb - ostcbstkptr = ptos; /栈顶栈顶指指针针 ptcb - ostcbprio = (int8u)prio; ptcb - ostcbstat = os_stat_rdy; ptcb - ostcbdly = 0;# if os_task_create_ext_en 0 ptcb - ostcbextptr = pext; / os_tcb的的扩扩展指展指针针 ptcb
43、 - ostcbstksize = stk_size; / stk_size是堆是堆栈栈的容量的容量 ptcb - ostcbstkbottom = pbos; /栈栈底指底指针针 ptcb - ostcbopt = opt; /选择项选择项 ptcb - ostcbid = id; / id是任是任务标识务标识符符#endif 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心41初始化任务控制块初始化任务控制块#if os_task_del_en 0 ptcb - ostcbdelreq = os_no_err;#endif ptcb - ostcby = prio 3; ptc
44、b - ostcbbity = osmaptblptcb-ostcby; ptcb - ostcbx = prio & 0 x07; ptcb - ostcbbitx = osmaptblptcb-ostcbx;#if os_event_en0 ptcb - ostcbeventptr = (os_event *)0; /事件指事件指针为针为空空 #endif#if (os_version = 251) & (os_flag_en 0) & (os_max_flags 0) & (os_task_del_en 0) ptcb - ostcbflagnode =
45、(os_flag_node *)0; /事件事件标标志志节节点指点指针为针为空空#endif 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心42初始化任务控制块初始化任务控制块#if (os_q_en 0) & (os_max_qs 0) | (os_mbox_en 0) ptcb - ostcbmsg = (void *)0; /消息指消息指针为针为空空#endif os_enter_critical();/把把os_tcb插插入到已入到已经经建立任建立任务务的的双双向向链链表中,需表中,需关关中中断断 ostcbpriotblprio = ptcb; ptcb-ost
46、cbnext = ostcblist; ptcb-ostcbprev = (os_tcb *)0; if (ostcblist!=(os_tcb *)0) ostcblist-ostcbprev = ptcb; ostcblist = ptcb; osrdygrp |= ptcb-ostcbbity; osrdytblptcb-ostcby |= ptcb-ostcbbitx; os_exit_critical(); return(os_no_err);/返回返回值值用于用于内内核掌握核掌握执执行情行情况况 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心43初始化任务控制块初始化
47、任务控制块 os_exit_critical(); return (os_no_more_tcb);/返回返回值值用于用于内内核掌握核掌握执执行情行情况况 总结:总结:1.目前,内核对tcb维护了3个全局数组:任务控制块表ostcbtbl(用于决定内核最多可用tcb数),任务优先级tcb表ostcbpriotbl,任务就绪表osrdytbl和 osrdygrp。2.目前,对tcb维护了2个全局链表:任务控制块空闲链表ostcbfreelist(指向下一个可以分配的tcb);已建立任务控制块链表ostcblist。电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心已建立任务控制块链表o
48、stcblist task nametask idtask statustask prioritytask contexttask nametask idtask statustask prioritytask contexttask nametask idtask statustask prioritytask contextostcblist队列队列tcb1tcb2tcbnnull44电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表 每个就绪的任务都放在就绪表每个就绪的任务都放在就绪表osrdytblosrdytbl中。当中。当任务就绪时,任务就绪时, osrdyt
49、blosrdytbl中相应位置中相应位置1.1.45电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表思考:思考:对于按优先级大小存放的对于按优先级大小存放的数据结构,如果我们想找数据结构,如果我们想找出最高优先级的任务,应出最高优先级的任务,应当怎么操作呢?当怎么操作呢?46电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表 还有一个全局变量,还有一个全局变量,osrdygrp:osrdygrp:47电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表 此外,还有一个全局变量,此外,还有一个全局变量,osmaptblosmapt
50、bl的的值值: :48下标二进制值000000001100000010200000100300001000400010000500100000601000000710000000电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表49/假假设当设当前任前任务优务优先先级为级为35,使任,使任务进务进入就入就绪态绪态osrdygrp |= osmaptblprio3;osrdytblprio3 |= osmaptblprio&0 x07; 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表50/假假设当设当前任前任务优务优先先级为级为35,使任,
51、使任务脱务脱离就离就绪态绪态if (osrdytblprio3&= osmaptblprio&0 x07) = =0)/*先先将将osrdytbl中的相中的相应应位位清清0,然后判,然后判断该断该位所在的行是否都位所在的行是否都为为0,若都若都为为0,则则再再清清除除osrdygrp的相的相应应位。位。*/ osrdygrp &= osmaptblprio3; 电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表 上面介绍了增加和脱离就绪态的任务的操作。那么如何找上面介绍了增加和脱离就绪态的任务的操作。那么如何找出最高优先级的就绪态任务?出最高优先级
52、的就绪态任务?51int8u const osunmaptbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1
53、, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,6,
54、 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/* 0 x00 to 0 x0f */* 0 x10 to 0 x1f */* 0 x60 to 0 x6f */* 0 x70 to 0 x7f */* 0 x80 to 0 x8f */* 0 x90 to 0 x9f *
55、/* 0 xa0 to 0 xaf */* 0 xb0 to 0 xbf */* 0 xc0 to 0 xcf */* 0 xd0 to 0 xdf */* 0 xe0 to 0 xef */* 0 x20 to 0 x2f */* 0 x30 to 0 x3f */* 0 x40 to 0 x4f */ /* 0 x50 to 0 x5f */* 0 xf0 to 0 xff */;电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心找出进入就绪态的最高优先级找出进入就绪态的最高优先级任务任务y= osunmaptblosrdygrp;x = osunmaptblosrdytbly;
56、 priority = (y 4/high3bit 0 x88-3/low3bitosrdytbl0osrdytbl1osrdytbl2osrdytbl3osrdytbl4osrdytbl5osrdytbl6osrdytbl752电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心另一种实现方式:任务队列另一种实现方式:任务队列 在非实时系统中,可以考虑通过任务队列在非实时系统中,可以考虑通过任务队列实现对系统中所有任务的管理。实现对系统中所有任务的管理。新任务新任务cpucpu就绪队列就绪队列等待队列等待队列超时超时调度调度等待资源等待资源获得资源获得资源释放释放cpucpu53电子
57、科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务队列任务队列 单等待队列单等待队列 资源对应的事件发生时,实时内核需要扫描资源对应的事件发生时,实时内核需要扫描整个等待队列,搜索等待该资源的任务,并整个等待队列,搜索等待该资源的任务,并按照一定的策略按照一定的策略选取任务,把任务的任务控选取任务,把任务的任务控制块放置到就绪队列。制块放置到就绪队列。 如果系统的资源和任务比较多,搜索等待该如果系统的资源和任务比较多,搜索等待该资源的任务所需要的时间就比较长,会影响资源的任务所需要的时间就比较长,会影响整个系统的实时性。整个系统的实时性。 可采用一种可采用一种多等待队列多等待队列的处
58、理方式的处理方式 资源对应的事件发生时,能够在较短的时间资源对应的事件发生时,能够在较短的时间内确立等待该资源的任务等待队列内确立等待该资源的任务等待队列。 54电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心新任务新任务cpucpu就绪队列就绪队列资源资源1 1等待队列等待队列超时超时调度调度等待资源等待资源1 1获得资源获得资源1 1释放释放cpucpu资源资源2 2等待队列等待队列等待资源等待资源2 2获得资源获得资源2 2资源资源n n等待队列等待队列等待资源等待资源n n获得资源获得资源n n55电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务队列任务队列
59、 对于就绪任务,如果采用上述队列方式进对于就绪任务,如果采用上述队列方式进行管理,在基于优先级的调度处理中,要行管理,在基于优先级的调度处理中,要获得当前具有获得当前具有最高优先级最高优先级的就绪任务:的就绪任务: 方式一:任务就绪时,把就绪任务的任务控方式一:任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾制块放在就绪队列的末尾。 调度程序需要从就绪队列的头部到尾部进行一次调度程序需要从就绪队列的头部到尾部进行一次遍历,才能获得就绪队列中具有最高优先级的任遍历,才能获得就绪队列中具有最高优先级的任务;务; 方式二:就绪队列按照优先级从高到低的顺方式二:就绪队列按照优先级从高到低的顺序排列
60、序排列。 新的就绪任务到达时,需要插入到就绪队列的合新的就绪任务到达时,需要插入到就绪队列的合适位置,确保就绪队列保持优先级从高到低排列适位置,确保就绪队列保持优先级从高到低排列的顺序性。的顺序性。56电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务调度任务调度 uc/osuc/os总是选择总是选择就绪态任务中优先级最高就绪态任务中优先级最高的任务执行的任务执行。 确定哪个任务优先级最高,下面该哪个任务运行了确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器完成的。的工作是由调度器完成的。 uc/osuc/os的任务级调度是由函数的任务级调度是由函数os_sched()os_sched()完成的。完成的。 中断级的调度是由另一个函数中断级的调度是由另一个函数osintexit()o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度荒山承包权转让及景观设计合同
- 2025年二零二五餐饮企业厨师长招聘与培训合同
- 二零二五年度个人租房租赁合同终止与清算协议
- 2025年度环保技术股份合作合同
- 2025年旅游品牌授权合同
- 2025年中国蚊香行业发展潜力分析及投资方向研究报告
- 2025年诱导屏杆行业深度研究分析报告
- 中国在线支付行业市场前瞻与未来投资战略分析报告(2025年)
- 2024-2030年中国二十味沉香丸行业市场深度研究及投资规划建议报告
- 2025-2031年中国绞盘行业市场调查研究及发展趋势预测报告
- 计算机二级wps office公共基础考试题库(100题)
- 三年级上册竖式计算练习300题及答案
- 点亮生命-大学生职业生涯发展与就业指导全套教学课件
- 旅居管家策划方案
- 车间消防安全知识培训课件
- 华为经营管理-华为的研发管理(6版)
- 锂离子电池生产工艺流程图
- 平衡计分卡-化战略为行动
- 幼儿园小班下学期期末家长会PPT模板
- 矿山安全培训课件-地下矿山开采安全技术
- 《社会主义市场经济理论(第三版)》第七章社会主义市场经济规则论
评论
0/150
提交评论