课件嵌入式系统及应用

上传人:cl****1 文档编号:568246995 上传时间:2024-07-23 格式:PPT 页数:152 大小:1.10MB
返回 下载 相关 举报
课件嵌入式系统及应用_第1页
第1页 / 共152页
课件嵌入式系统及应用_第2页
第2页 / 共152页
课件嵌入式系统及应用_第3页
第3页 / 共152页
课件嵌入式系统及应用_第4页
第4页 / 共152页
课件嵌入式系统及应用_第5页
第5页 / 共152页
点击查看更多>>
资源描述

《课件嵌入式系统及应用》由会员分享,可在线阅读,更多相关《课件嵌入式系统及应用(152页珍藏版)》请在金锄头文库上搜索。

1、电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心嵌入式系统及应用嵌入式系统及应用第五章第五章任务管理与调度任务管理与调度1筑寞速悦萌逃坏荆觉级秆膊酮冕匆蚜奋灭虹潭股臃明闪光颅喇运站磷炊蝴(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心主要内容主要内容任务简介任务简介任务控制块任务控制块任务管理任务管理任务调度任务调度优先级反转优先级反转2悄巨萄钨珐诅深隧炉氯测豫踏扎浆础恩诗讫射镇绽惮勋哨贷物郁陆锗褥骇(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第一节第

2、一节任任 务务 任务的定义及其主要特性任务的定义及其主要特性任务的内容任务的内容任务的分类任务的分类任务参数任务参数3铸摄蹲雇逆么巫再胳戒鞍沽伴使产串球警矛咋拒沥结打揽蚂抡察位似札乐(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心在嵌入式实时系统中任务是操作系统内核调度在嵌入式实时系统中任务是操作系统内核调度的基本单位。的基本单位。任务主要包含以下内容:任务主要包含以下内容: 代码代码:一段可执行的程序一段可执行的程序数据数据:程序所需要的相关数据(变量、工作:程序所需要的相关数据(变量、工作空间、缓冲区等)空间、缓冲区等)堆栈堆

3、栈程序执行的上下文环境程序执行的上下文环境4攘弱告川液灸统拙呻益镁剩凶来猎的蛤馈捕兽概粘膏舱涣维脆尘素耻锦山(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 void YourTask (void *pdata) for (;) /* 用用户代代码; 调用用uC/OS-II的某些功能函的某些功能函数数*/: OSFlagPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO

4、_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用用户代代码 */ 任务的代码通常是一个无限循环,如下面代码所示:任务的代码通常是一个无限循环,如下面代码所示: 任务代码的定义需注意两点:任务代码的定义需注意两点:1.1.返回参数必须定义成返回参数必须定义成voidvoid。2.2.当任务开始执行时,可传递一个任何类型的参数。当任务开始执行时,可传递一个任何类型的参数。( (参数类型是参数类型是void void 指针指针) )5迭厄淆喝荡莫咎协酿元孝河溪轿担季屋捕某辖忱昨洱沾矽迪仔矛腾赤赎华(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入

5、式软件工程中心电子科技大学嵌入式软件工程中心 void YourTask (void *pdata) /* 用用户代代码; OSTaskDel(OS_PRIO_SELF); 当任务完成后,任务可以自我删除,如下面代当任务完成后,任务可以自我删除,如下面代码。码。需注意:任务代码不是真的删除了,只是内核简需注意:任务代码不是真的删除了,只是内核简单地不会再这个任务,这个任务的代码也不会再单地不会再这个任务,这个任务的代码也不会再运行了。运行了。6哟戒控冉操巴袄侩冬坛禹嫉碟啮椽式蝉柄傻斜筋僚模撑辜挠波抚蝇鞘炽符(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科

6、技大学嵌入式软件工程中心int main(void) / 初始化初始化 uCOS内内核核. OSInit(); / 在在开开始多任始多任务之前必之前必须先建立一先建立一个个任任务 OSTaskCreate(TestTask1, (void *) 11, &TestTaskStk1TASK_STK_SIZE, 11); /第第1个参数个参数是指向是指向该任任务运运行代行代码的指的指针,第,第2个参数个参数是一是一个个指向任指向任务初始化初始化数数据的指据的指针, /第第3个参数个参数是任是任务的堆的堆栈起始地址(高地址向低地址增起始地址(高地址向低地址增长),), /第第4个参数个参数是任是任务

7、的的优先先级,数数值越小,越小,优先先级越高。越高。 / 开开始多任始多任务,控制,控制权交交给内内核核 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); uC/OSuC/OS的任

8、务实例的任务实例的任务实例的任务实例7帚垃忌儿加咬岿太耀隧谦裹他残擅耻晌领赛畴底挂腑塌捞屈澳筐率晾据圾(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void TestTask2(void *pdata) while (1) printf(%4u: * Test Task 22 *n, OSTime); OSTimeDly(1); 注:注:1.堆堆栈大小有上限,大小有上限,对于于X86处理器,理器,OS_STK变量量类型是型是16位位变量,所以堆量,所以堆栈大小大小是是1024B;2. 内内核允核允许建立多建立多达达63个个用用户

9、任任务,必,必须给这些任些任务分配一分配一个独个独一无二的介于一无二的介于0-62的的优先先级。0是最高是最高优先先级。3. OSStart()函函数并数并不返回不返回main函函数数。8练刘孽捏棒漱愉握韩巢犀雀簇奖喷老唤滁穗烈咒债膛宙梭埠偏犊沙削瓶胶(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务的主要特性任务的主要特性任务具有以下特性:任务具有以下特性:动态性动态性:任务状态是不断变化的。一般分为就绪态、运行态和等待态。一般分为就绪态、运行态和等待态。在多任务系统中,任务的状态将随着系统的需要不断进在多任务系统中,任务的状

10、态将随着系统的需要不断进行变化。行变化。并发性并发性(并行性?并行性?):系统中同时存在多个任务,这些任务在宏观上是同时运系统中同时存在多个任务,这些任务在宏观上是同时运行的行的。异步独立性异步独立性:每个任务各自按相互独立的不可预知的速度运行,走走每个任务各自按相互独立的不可预知的速度运行,走走停停停停。 9卤套申彝收功短配少棉睡詹电轿紫周苦擞四初柏叁营栋狮机燕墙寡刘僚卯(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务与程序的区别:任务与程序的区别: 任务能真实地体现工作内容的任务能真实地体现工作内容的并发性并发性,而程,而

11、程序不能;序不能;程序是任务的组成部分程序是任务的组成部分除程序外,任务还包括数据、堆栈及其上下文环除程序外,任务还包括数据、堆栈及其上下文环境等内容;境等内容;程序是静态的,任务是动态的;程序是静态的,任务是动态的;任务有任务有生命周期生命周期,有诞生、有消亡,是短暂,有诞生、有消亡,是短暂的;而程序是相对长久的;的;而程序是相对长久的;一个程序可对应多个任务,反之亦然;一个程序可对应多个任务,反之亦然;任务具有创建其他任务的功能,而程序没有任务具有创建其他任务的功能,而程序没有。 10秦讼晓备馁施迄激潜绪耿镶衬及粘论刺兰肋窟饱练毙图钙脊普灾淆狼梭季(课件)-嵌入式系统及应用(课件)-嵌入式

12、系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心采用多任务的好处:采用多任务的好处:任务的任务的规模较小规模较小每个任务更容易编码和调试,其质量也更容易得到每个任务更容易编码和调试,其质量也更容易得到保证保证不少不少应用本身应用本身就是由多个任务构成的就是由多个任务构成的如一个应用可能需要进行以下任务的处理:计算、如一个应用可能需要进行以下任务的处理:计算、从网络获取数据和刷新显示屏幕从网络获取数据和刷新显示屏幕采用多任务的处理方式是应用问题的一个采用多任务的处理方式是应用问题的一个非常自然非常自然的解决方式的解决方式任务之间具有较高的独立性,耦合性小任务之间具有较高的独

13、立性,耦合性小通过增加新的任务就能方便的通过增加新的任务就能方便的扩充系统功能扩充系统功能实时性强实时性强保证紧急事件得到优先处理成为可能保证紧急事件得到优先处理成为可能11担蜘泞萨席也钦首伞赵哟苍骑蒙狐直同础胚纬闻缕虽椎碱镶早柳秩赔牟暑(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3内核内核内核代码内核代码内核数据内核数据栈栈数据数据任务任务控制块控制块代码代码栈栈数据数据任务任务控制块控制块代码代码栈栈数据数据任务任务控制块控制块代码代码任务任务1 1任务任务2 2任务任务3 3多任务

14、系统多任务系统多任务系统多任务系统示意图示意图示意图示意图12封了逻阐圭舷娃绎压瓷泛哈吮豹郸俗梯羹挥无雾帘柱方柒腋卜洒率渭生巡(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类按照到达情况的可预测性,任务可以划分按照到达情况的可预测性,任务可以划分为:为:周期任务周期任务(periodic task)非周期任务非周期任务按照重要程度,可分为:按照重要程度,可分为:关键任务关键任务(critical task)非关键任务非关键任务(noncritical task)13渤溪硫沤锰逝学辨揍派飞耐凹

15、硼衔表止撮定意嫡乌贫衬愧减榔踪私朝笺蘑(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类周期任务与非周期任务周期任务与非周期任务周期任务每隔一个固定的时间间隔就会执行周期任务每隔一个固定的时间间隔就会执行一次。一次。举例:飞行器可能需要每隔举例:飞行器可能需要每隔100ms获得一次关于获得一次关于飞行器的速度、高度和姿态数据,控制传感器获飞行器的速度、高度和姿态数据,控制传感器获取这些数据就需要通过周期任务来进行。取这些数据就需要通过周期任务来进行。非周期任务执行的间隔时间则为不确定的。非周期

16、任务执行的间隔时间则为不确定的。举例:移动通信设备中的通信任务,该任务只有举例:移动通信设备中的通信任务,该任务只有在需要进行通信的情况下才会得到执行。在需要进行通信的情况下才会得到执行。非周期任务分为:非周期任务分为:sporadic task:有最小到达间隔时间限制有最小到达间隔时间限制aperiodic task:没有到达时间限制没有到达时间限制14琉雷止泅茵卉术噪腐羚翻乐和瞅奏渴辩朵醒怜疗敝绰蛛拷瞻洪呀琉纪蜂辕(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心实时系统中任务的分类实时系统中任务的分类关键任务与非关键任务关键任

17、务与非关键任务关键任务:关键任务:为需要得到需要得到及时执行及时执行的任务,否则将出现灾难性的的任务,否则将出现灾难性的后果后果举例:飞行器中用于处理生命支持系统和稳定性控制系统举例:飞行器中用于处理生命支持系统和稳定性控制系统的任务的任务非关键任务:非关键任务:如果没有得到及时执行,则不会产生严重后果如果没有得到及时执行,则不会产生严重后果 15吗洒瘫肘秃缄达脉幕骡未逗则稽跟揍抿春韦驳礁窿娄岗科拄沟扛世榜轧藐(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数任务参数:任务参数:优先级(优先级(priority)周期

18、(周期(period)计算时间(计算时间(computation time)就绪时间(就绪时间(ready time)截止时间(截止时间(deadline)16蛔级筒锻父疽媳旭枢庆专霉灭侨暗祭屋腆吸也瓜塔因孟虐范棱写搐汪擎痢(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数任务的优先级任务的优先级表示任务对应工作内容在处理上的表示任务对应工作内容在处理上的优先程度优先程度优先级越高,表明任务越需要得到优先处理优先级越高,表明任务越需要得到优先处理飞行器中处理稳定性控制的任务,就需要具有较飞行器中处理稳定性控制的任务,

19、就需要具有较高的优先级,一旦执行条件得到满足,应及时得高的优先级,一旦执行条件得到满足,应及时得到执行到执行任务的优先级分为任务的优先级分为静态优先级静态优先级和和动态优先级动态优先级。静态优先级:任务的优先级被确定后,在系统运静态优先级:任务的优先级被确定后,在系统运行过程中将不再发生变化;行过程中将不再发生变化;动态优先级:系统运行过程中,任务的优先级是动态优先级:系统运行过程中,任务的优先级是可以动态变化的。可以动态变化的。 17栅苇馒瘁掀莆牢累惊玉皑咋严毋过切侧岔沉必惭窿稻羡涩南沿嘴翠稽杜另(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌

20、入式软件工程中心任务参数任务参数uC/OS中可以管理中可以管理64个任务,每个任务必须有个个任务,每个任务必须有个不同的优先级。优先级的数值越低,任务的优先不同的优先级。优先级的数值越低,任务的优先级就越高。级就越高。 uC/OS总是选择优先级最高的任务执总是选择优先级最高的任务执行。行。最低优先级最低优先级63被系统保留,用户不能使用。被系统保留,用户不能使用。在目前的版本中,任务的优先级也是与任务在目前的版本中,任务的优先级也是与任务ID。18笑铃镭牛步闲渗砸睡倡陋侍舜棠播类槽法缨筏窍涝衔副乡虎剂姐葵钡盈郑(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电

21、子科技大学嵌入式软件工程中心任务参数任务参数周期周期周期任务所具有的参数,表示任务周期性执行的间隔时间任务的计算时间任务的计算时间任务在特定硬件环境下特定硬件环境下被完整执行所需要的时间,也被称为是任务的执行时间任务的执行时间(execution time)。由于任务每次执行的软件环境的差异性,导致任务在各次具体执行过程中的计算时间各有不同。通常用最坏情况下的执行时间最坏情况下的执行时间(worst case time)或是需要的最长执行时间来表示,也可用统计时间统计时间(statistical time)来表示。 19蝇粒宛绍证狞双舜坝墙吻句何索包妒牌蔬北龙崔埠衙盎活嘎妻和武喂跺赛(课件)-

22、嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务参数任务参数任务的就绪时间任务的就绪时间任务具备了在处理器上被执行所需要条件时的时间。 任务的截止时间任务的截止时间意味着任务需要在该时间到来之前被执行完成。截止时间可以通过绝对截止时间绝对截止时间(absolute deadline)和相对截止时间相对截止时间(relative time)两种方式来表示相对截止时间为任务的绝对截止时间减去任务的就绪时间。截止时间可以分为强截止时间强截止时间(hard deadline)和弱截弱截止时间止时间(soft deadline)两种情况:具有强截

23、止时间的任务即为关键任务关键任务,如果截止时间不能得到满足,就会出现严重的后果。拥有关键任务的实时系统又被称为强实时强实时(hard real-time)系统,否则称为弱实时弱实时(soft real-time)系统。 20缨录痢额窜番姜吁缕沙戊因党钥辣吓暴胯藻鸦逝郭庐缔疡乡城俯纷陡仇励(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第二节第二节任务控制块任务控制块任务状态与变迁任务状态与变迁空闲任务空闲任务任务控制块任务控制块任务切换任务切换任务队列任务队列优先级位图算法优先级位图算法21秧掣态租屏拍气俐补谜骏卉踊评亲讽志崔搀这

24、谣疯绎藕矾奉抉抨氖渴戚洱(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与变迁任务拥有的任务拥有的资源情况资源情况是不断变化的,导致是不断变化的,导致任务状态任务状态也表现出不断变化的特性。也表现出不断变化的特性。不同的实时内核实现方式对任务状态的定不同的实时内核实现方式对任务状态的定义不尽相同,但是都可以概括为三种基本义不尽相同,但是都可以概括为三种基本的状态:的状态:等待等待(waiting):任务在等待某个事件的发):任务在等待某个事件的发生;生;就绪就绪(ready):): 任务等待获得处理器资源;任

25、务等待获得处理器资源;执行执行(running):任务获得处理器资源,所):任务获得处理器资源,所包含的代码内容正在被执行包含的代码内容正在被执行。 22靛栏戌毡诫死乙韦徒度棵卢慰帝奈刀映犬良律耿谜兜政死斯缅顷夯孟冉署(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与变迁在单处理器系统中:在单处理器系统中:任何时候都任何时候都只有一个任务在只有一个任务在CPUCPU中执行中执行如果没有任何事情可做,就运行如果没有任何事情可做,就运行空闲任务空闲任务执行空执行空操作操作任何一个可以执行的任务都必须处于任何一个可

26、以执行的任务都必须处于就绪状态就绪状态调度程序从任务的调度程序从任务的就绪队列就绪队列中选择下一个需要执中选择下一个需要执行的任务。行的任务。处于就绪状态的任务拥有除处于就绪状态的任务拥有除CPU以外的其他所有以外的其他所有需要的资源。需要的资源。任务还可能处于任务还可能处于等待状态等待状态如果任务在需要等待如果任务在需要等待I/O设备或其他任务提供的数设备或其他任务提供的数据,而数据又还没有到达该任务的情况下,就处据,而数据又还没有到达该任务的情况下,就处于等待状态于等待状态23侍吝咱忍义纺吁钟慨毡象桶阮爷宣绪捷鱼瞎拨投篱诺悦靳澄拘查秃博翁属(课件)-嵌入式系统及应用(课件)-嵌入式系统及应

27、用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务状态与变迁任务状态与变迁任务会在不同的状态之间进行转换,即任务会在不同的状态之间进行转换,即任务状态的变迁任务状态的变迁就绪态就绪态运行态运行态等待态等待态获得获得CPUCPU被高优先级被高优先级任务抢占或任务抢占或超时超时获得资源获得资源需要需要资源资源任务状态变迁图任务状态变迁图任务状态变迁图任务状态变迁图24院狈胺苇搀琳名赡障序铱骑黔紫更己茄压愤京符老蚕昏舌豆申辟坛鼠悍摘(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3

28、调度调度程序程序0 05 5101015152020252530303535404045455050运行运行等待等待就绪就绪三个任务进行状态转换的过程三个任务进行状态转换的过程 包含三个任务和一个调度程序。调度程序用来确定下一个包含三个任务和一个调度程序。调度程序用来确定下一个需要投入运行的任务,因此需要投入运行的任务,因此调度程序本身也需要占用一定调度程序本身也需要占用一定的处理时间的处理时间。 25票做茨泛靛琐驭烯训友啸呻酶琵跋轩熬蒸睦晒悯钓船诉勒堡厩谎挪抿汛很(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uC/OSuC/O

29、S中的任务状态变迁中的任务状态变迁中的任务状态变迁中的任务状态变迁OSMBoxPOST()OSQPost()OSQPostFront()OSSemPost()OSTASKResume()OSTimeDlyResume()OSTimeTick()OSMBoxPend()OSQPend()OSSemPend()OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()InterruptOSIntExit()OSStart()OSIntExit()OS_TASK_SW()OSTaskDel()OSTaskCreate()OSTaskCreateExt()OSTaskDel()

30、Task is PreemptedOSTaskDel()等待状态等待状态睡眠态睡眠态就绪态就绪态运行态运行态中断服中断服务态务态26藻淤吊窍擒宾藻寺乞扑陵勤扒娇议篮上茁龚叛衷落颗琼毛键伸翻岛卿聘身(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uC/OS任务状态任务状态睡眠态:指任务驻留在程序空间睡眠态:指任务驻留在程序空间(ROM(ROM或或RAM),RAM),还没还没有交给有交给UCOSUCOS来管理。把任务交给来管理。把任务交给uCOSuCOS来管理,是来管理,是通过调用下述通过调用下述2 2个函数之一:个函数之一:OSTa

31、skCreate()OSTaskCreate()和和OSTaskCreateExtOSTaskCreateExt()()来实现的。这些调用告诉内核,任务程序的起来实现的。这些调用告诉内核,任务程序的起始地址在哪里,优先级是多少,任务要使用多少始地址在哪里,优先级是多少,任务要使用多少栈空间等。栈空间等。27搁喝途次渐悯俭管幸焰率蕊简裹庙咒赞内窗潮绊少交泻柄婴吏介瞪打钞紫(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uC/OS任务状态任务状态就绪态:任务一旦建立,就进入了就绪态。任务就绪态:任务一旦建立,就进入了就绪态。任务的建立

32、可以是在多任务运行开始之前,也可以动的建立可以是在多任务运行开始之前,也可以动态地由一个运行着的任务建立。如果多任务已经态地由一个运行着的任务建立。如果多任务已经启动,且一个任务是被另一个任务建立的,而新启动,且一个任务是被另一个任务建立的,而新建立的任务的优先级高于建立它的任务的优先级,建立的任务的优先级高于建立它的任务的优先级,则刚刚被建立的新任务将立即获得则刚刚被建立的新任务将立即获得CPUCPU的使用权。的使用权。一个任务可以通过调用一个任务可以通过调用OSTaskDel()OSTaskDel()返回到睡眠态,返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。或通过调用该函数让另一

33、个任务进入睡眠态。28宠总聚霓吝娃校模阐赵曾虎兼箩驳绸鞋闹籍郧粮氰垛脂冤鞋甘钳蔓拒额嵌(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心uC/OS任务状态任务状态运行态:调用运行态:调用OSStartOSStart()函数可以启动多任务。()函数可以启动多任务。OSStartOSStart()函数只能在启动时调用一次,该函数选择用()函数只能在启动时调用一次,该函数选择用户初始化代码中已经建立的、进入就绪态的优先户初始化代码中已经建立的、进入就绪态的优先级最高的任务来进行执行。级最高的任务来进行执行。等待态:从运行态到等待态有两种可

34、能的原因等待态:从运行态到等待态有两种可能的原因: :1.1.正在运行的任务调用正在运行的任务调用OSTimeDly()OSTimeDly()函数将自身延迟函数将自身延迟一段时间,则该任务进入等待态。一段时间,则该任务进入等待态。2.2.正在执行的任务需要等待某一事件的发生,如信正在执行的任务需要等待某一事件的发生,如信号量和消息,若该事件未发生或未获得,该任务号量和消息,若该事件未发生或未获得,该任务进入等待态。进入等待态。29企厌涅迢惨脆接亿瘟嘻利誓拿蠢虾官擅泛液赛觉侧谨绪崇翼草汹杆懂雅惦(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软

35、件工程中心uC/OS任务状态任务状态中断服务态:被中断了的任务进入中断服务态。中断服务态:被中断了的任务进入中断服务态。响应中断时,正在执行的任务被挂起,中断服务响应中断时,正在执行的任务被挂起,中断服务子程序控制了子程序控制了CPUCPU使用权。中断服务子程序可能会使用权。中断服务子程序可能会使一个或多个任务进入就绪态。在中断服务子程使一个或多个任务进入就绪态。在中断服务子程序返回之前,内核要判定,被中断的任务是否还序返回之前,内核要判定,被中断的任务是否还是就绪态任务中优先级最高的。若已经不是,则是就绪态任务中优先级最高的。若已经不是,则新进入就绪态的这个优先级更高的任务将得以运新进入就绪

36、态的这个优先级更高的任务将得以运行,否则,原来被中断了的任务将继续运行。行,否则,原来被中断了的任务将继续运行。30恍秉矩拖碗窍札辟撇工郎拧抛踩刺谍虾款羽菩奥澈部谭勒寝订攫症狸啪亢(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制块任务控制块内核对任务管理是通过对内核对任务管理是通过对任务控制块任务控制块(Task Task Control BlockControl Block,TCBTCB)的操作来实现的。)的操作来实现的。 任务控制块任务控制块是包含任务相关信息的数据结构是包含任务相关信息的数据结构包含了任务执行过程中所

37、需要的所有信息。包含了任务执行过程中所需要的所有信息。任务控制块大都包括以下信息:任务控制块大都包括以下信息:任务的名字任务的名字任务执行的起始地址任务执行的起始地址任务的优先级任务的优先级任务的状态任务的状态任务的硬件上下文(堆栈指针、任务的硬件上下文(堆栈指针、PC和寄存器等和寄存器等)任务的队列指针等内容任务的队列指针等内容 31少梯堑蹄儒唉竞侄禹霸游厌佑殷狸肘猪墒铅刹音鄙簿免渤藻伙堪悉庭绢伙(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制块任务控制块一旦任务建立,一个任务控制块一旦任务建立,一个任务控制块OS_TC

38、BOS_TCB就被赋就被赋值,能够保存任务被其他任务抢占时的状态。值,能够保存任务被其他任务抢占时的状态。当任务重新得到当任务重新得到CPUCPU的使用权后,任务控制块的使用权后,任务控制块能够确保任务从当时被中断的那一点丝毫不差能够确保任务从当时被中断的那一点丝毫不差的继续执行。的继续执行。下面是下面是uC/OSuC/OS的的OS_TCBOS_TCB源代码。源代码。32卫秤裳身额塔疗蓉卑卸臃凯捞收假眩谴舒耕灿譬仆灯棠蜡俺唉找整幢学弥(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心typedef struct os_tcb OS_

39、STK *OSTCBStkPtr; /*指向指向当当前任前任务堆堆栈栈顶的指的指针,每每个个任任务的堆的堆栈容量可以是任意的容量可以是任意的*/#if OS_TASK_CREATE_EXT_EN 0 /*允允许建立任建立任务函函数数的的扩展展*/ void *OSTCBExtPtr; /* 指向用指向用户自定自定义的任的任务控制控制块扩展展 */ OS_STK *OSTCBStkBottom; /* 栈底指底指针*/ INT32U OSTCBStkSize; /* 栈空空间,以,以栈元元为单位位 */ INT16U OSTCBOpt; /* 把把“选择项”传给函函数数 OSTaskCreate

40、Ext()。目前支持三目前支持三个个选择项: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; /* 用于任用于任务控制控制块双双向向链表的前后表的前后查找。找。*

41、/uC/OSuC/OS的的的的TCB TCB 源代码源代码源代码源代码33总糠腕鲸椿孰树祝图蛋擒坝涵泄洋讼渠挛拔稍哮冲刊尧砖猎绽桌神字唱苟(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心#if (OS_Q_EN0)&(OS_MAX_QS0)|(OS_MBOX_EN0)|(OS_SEM_EN0)|(OS_MUTEX_EN0) /* 若不打算使用信若不打算使用信号号量、互斥信量、互斥信号号量、消息量、消息队列、消息列、消息邮箱,箱,则对应的的变量不量不会会在在TCB中出中出现*/ OS_EVENT *OSTCBEventPtr; /*

42、 指向事件控制指向事件控制块的指的指针 */#endif#if (OS_Q_EN 0) & (OS_MAX_QS 0) | (OS_MBOX_EN 0) void *OSTCBMsg; /* 传递给任任务的消息指的消息指针*/#endif34uC/OSuC/OS的的的的TCB TCB 源代码源代码源代码源代码前粪料肮守具偶丢魂荤廉乒矮旬茫箩笋档植莆舶恿志辛腆郊盐鲜萨世鼠诬(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心#if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0

43、)#if OS_TASK_DEL_EN 0 OS_FLAG_NODE *OSTCBFlagNode; /* 指向事件指向事件标志志节点的指点的指针*/#endif OS_FLAGS OSTCBFlagsRdy; /* 当当任任务等待事件等待事件标志志组时,是使任,是使任务进入就入就绪态的事件的事件标志志*/#endif INT16U OSTCBDly; /* 任任务允允许等待事件等待事件发生的最多生的最多时钟节拍拍数数, OSTimeTick()使用使用这个个链表表来来刷新各任刷新各任务的任的任务延延迟变量量.OSTCBDly */ INT8U OSTCBStat; /* 任任务状状态*/ I

44、NT8U OSTCBPrio; /* 任任务优先先级 */35uC/OSuC/OS的的的的TCB TCB 源代码源代码源代码源代码瘁轴而氮鸽撕旱笺嘉鳞滩掖斥龋哦谐拦购浆烽投玻闲菲生北廉争谚忍极掐(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY; /* 这四四个个变量用于找出具有最高量用于找出具有最高优先先级的任的任务。这些些值是在任是在任务建立建立时计算,或者算,或者是在改是在改变任任务优先先级时计算。算。 *

45、/ #if OS_TASK_DEL_EN 0 BOOLEAN OSTCBDelReq; /* 表示任表示任务是否需要是否需要删除除 */#endif OS_TCB;36注:注:注:注:1.1.应用程序可以有的最多任务数可以在文件应用程序可以有的最多任务数可以在文件应用程序可以有的最多任务数可以在文件应用程序可以有的最多任务数可以在文件OS_CFG.HOS_CFG.H中中中中定义。避免定义。避免定义。避免定义。避免RAMRAM程序空间浪费。程序空间浪费。程序空间浪费。程序空间浪费。2.2.在内核初始化时,所有在内核初始化时,所有在内核初始化时,所有在内核初始化时,所有OS_TCBOS_TCB都被

46、链接成单向空任务都被链接成单向空任务都被链接成单向空任务都被链接成单向空任务链表。任务建立时,空链表。任务建立时,空链表。任务建立时,空链表。任务建立时,空TCBTCB指针指针指针指针OSTCBFreeListOSTCBFreeList指向的指向的指向的指向的OS_TCBOS_TCB被赋给任务,然后被赋给任务,然后被赋给任务,然后被赋给任务,然后OSTCBFreeListOSTCBFreeList指向下一个空指向下一个空指向下一个空指向下一个空的的的的TCBTCB。uC/OSuC/OS的的的的TCB TCB 源代码源代码源代码源代码滋隐祝静监油搭乐牡乐份喂郊仑匿论失步沙蕾丘诣核玄渐知烃侠挖殊情

47、俗(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心空任务控制块链表空任务控制块链表OSTCBNextOSTCBNextOSTCBFreeListOSTCBTbl(0)OSTCBTbl(1)NULL37所有的所有的OS_TCB都存放在任务控制块列表数组都存放在任务控制块列表数组OSTCBTbl 中的。中的。负肖为战徐桌巍绑滤固温赃讳牵配邦都琵申垢崔祸笆其入宫诺旭井违孽烯(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务控制块任务控制块为节约内存,为节约内存,任务数量任

48、务数量通常需要进行预先通常需要进行预先配置配置按照配置的任务数量初始化任务控制块,一个任务对按照配置的任务数量初始化任务控制块,一个任务对应一个初始的任务控制块,形成一个应一个初始的任务控制块,形成一个空闲任务控制块空闲任务控制块链链。在任务创建时,实时内核从空闲任务控制在任务创建时,实时内核从空闲任务控制块链中为任务分配一个任务控制块。块链中为任务分配一个任务控制块。随后对任务的操作,都是基于对应的随后对任务的操作,都是基于对应的任务控制块任务控制块来进来进行的。行的。当任务被删除后,对应的任务控制块又会被实时内核当任务被删除后,对应的任务控制块又会被实时内核回收到回收到空闲任务控制块链空闲

49、任务控制块链。 38袭吠拢贯哈姜猖娠恶铃悯机箩刃氨偷哟凋酣褐朴杂义厦螟舆楼囚叶伴厘圣(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心初始化任务控制块初始化任务控制块任务建立时,函数任务建立时,函数OS_TCBInit()OS_TCBInit()初始化任务控制初始化任务控制块块OS_TCB.OS_TCB.39INT8U OS_TCBInit( INT8U prio, OS_STK *ptos, OS_STK * pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt) /*

50、prio是任是任务优先先级, ptos指向指向栈顶指指针, pbos指向指向栈底的指底的指针, id是任是任务标识符符, stk_size是堆是堆栈的容量的容量, pext是是OS_TCB的的扩展指展指针, opt是是选择项 */ OS_TCB *ptcb; OS_ENTER_CRITICAL(); ptcb=OSTCBFreeList; if (ptcb!=(OS_TCB *)0)涵葛谊屁邱耳卒虫臃癌沪皖确挨诚娥荫烘您娩卷槽虞萤倒冶讨未颗管斡蔼(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心40初始化任务控制块初始化任务控制块

51、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 - OSTCBStkSize = stk_size; / stk_size是堆是堆栈的容量的容量 p

52、tcb - 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; ptcb

53、- OSTCBBitY = OSMapTblptcb-OSTCBY; ptcb - OSTCBX = prio & 0x07; 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 = (OS_FLAG_NODE *)0; /事

54、件事件标志志节点指点指针为空空#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插插入到已入到已经建立任建立任务的的双双向向链表中,需表中,需关关中中断断 OSTCBPrio

55、Tblprio = ptcb; ptcb-OSTCBNext = 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);/返回返回值用于用于内内核掌握核掌握执行情行情况况 或剥浦封柏岂荣封邦盟甚迈滚翟圈备衙赫喜皱豺

56、玉杆前茵撞瞪呐阔娃凛阐(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心43初始化任务控制块初始化任务控制块 OS_EXIT_CRITICAL(); return (OS_NO_MORE_TCB);/返回返回值用于用于内内核掌握核掌握执行情行情况况 总结:总结:1.目前,内核对TCB维护了3个全局数组:任务控制块表OSTCBTbl(用于决定内核最多可用TCB数),任务优先级TCB表 OSTCBPrioTbl, 任 务 就 绪 表 OSRdyTbl和 OSRdyGrp。2.目前,对TCB维护了2个全局链表:任务控制块空闲链表OSTCB

57、FreeList(指向下一个可以分配的TCB);已建立任务控制块链表OSTCBList。趴狈捷燥益胯百穗贱碎柴雌殷多辆蝗哮减懒讯辕脚辩快龙较纸逾杠渴酶涝(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心已建立任务控制块链表OSTCBList task nametask IDtask statustask prioritytask contexttask nametask IDtask statustask prioritytask contexttask nametask IDtask statustask prioritytask

58、 contextOSTCBList队列队列TCB1TCB2TCBnNULL任务队列任务队列任务队列任务队列44曼支魂军刺痒匿惊寐刮诅挛壁岁制袜完咋峡妮锹鞠曼肺换汁镑七奈班池颁(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表每个就绪的任务都放在就绪表每个就绪的任务都放在就绪表OSRdyTblOSRdyTbl中。当中。当任务就绪时,任务就绪时, OSRdyTbl OSRdyTbl中相应位置中相应位置1.1.45瘫舵霞桨沿榆利报脸尼临暑负萍碱掐睫匣鲜听蛛磺谤乖蛮刽忱滑牧难亭遥(课件)-嵌入式系统及应用(课件)-嵌入式系统及应

59、用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表思考:思考:对于按优先级大小存放的对于按优先级大小存放的数据结构,如果我们想找数据结构,如果我们想找出最高优先级的任务,应出最高优先级的任务,应当怎么操作呢?当怎么操作呢?46宾婚疯箕难洼几谢薄衙沁寓巨嗡圆棍展精释锯史恐擒泻欧缅肺聊昂坑钻尘(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表还有一个全局变量,还有一个全局变量,OSRdyGrp:OSRdyGrp:47喉胎俞日十塘嚎厘严脏萄趟玄茨岔孙定茧臻狂洒播溪脆疫诵云氰彻阁欠灭(课件)-嵌入式系统及

60、应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表此外,还有一个全局变量,此外,还有一个全局变量,OSMapTblOSMapTbl的的值值: :48下标二进制值000000001100000010200000100300001000400010000500100000601000000710000000硫凡臂效处搽拎叔由那闯砧迷踢判荒炼泅憎史役筐届记窍爱通谈杖涛援呢(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表4935: 0010001135: 00100011/假

61、假设当当前任前任务优先先级为35,使任,使任务进入就入就绪态OSRdyGrp |= OSMapTblprio3;OSRdyTblprio3 |= OSMapTblprio&0x07; 厢敬崇宣匣畔烯类讣播沫闪牧孜副笺踌厕莲金摔舅哦吗祝很惩侈保隋渭唾(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表5035: 0010001135: 00100011/假假设当当前任前任务优先先级为35,使任,使任务脱脱离就离就绪态if (OSRdyTblprio3&= OSMapTblprio&0x07) = =0)/*先先将将OSRdy

62、Tbl中的相中的相应位位清清0,然后判,然后判断断该位所在的行是否都位所在的行是否都为0,若都,若都为0,则再再清清除除OSRdyGrp的相的相应位。位。*/ OSRdyGrp &= OSMapTblprio3; 诛傀遍公侄就纬谢迎牟葬邵糖惹蕾财婚免烟械席署蹿羽盖衍现撕搁黑讹寺(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心就绪表就绪表上面介绍了增加和脱离就绪态的任务的操作。那么如何找上面介绍了增加和脱离就绪态的任务的操作。那么如何找出最高优先级的就绪态任务?出最高优先级的就绪态任务?51INT8U const OSUnMapTb

63、l = 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, 0, 2, 0, 1, 0,5, 0, 1, 0, 2,

64、 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, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1,

65、 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,/* 0x00 to 0x0F */* 0x10 to 0x1F */* 0x60 to 0x6F */* 0x70 to 0x7F */* 0x80 to 0x8F */* 0x90 to 0x9F */* 0xA0 to 0xAF */* 0xB0 to 0xBF */* 0xC0

66、to 0xCF */* 0xD0 to 0xDF */* 0xE0 to 0xEF */* 0x20 to 0x2F */* 0x30 to 0x3F */* 0x40 to 0x4F */ /* 0x50 to 0x5F */* 0xF0 to 0xFF */;尔服太率技黎瓣墨拈贰紊儒驳忙反产戮睡刘但峙嘉而喝喊撑舍清教韵扰韩(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心找出进入就绪态的最高优先级找出进入就绪态的最高优先级任务任务y= OSUnMapTblOSRdyGrp;x = OSUnMapTblOSRdyTbly; pri

67、ority = (y 4/high3Bit 0x88-3/low3BitOSRdyTbl0OSRdyTbl1OSRdyTbl2OSRdyTbl3OSRdyTbl4OSRdyTbl5OSRdyTbl6OSRdyTbl752顾尖沉僳扫蹦船飘吱希脆魂旺悬宗弥荡恒烧荐猛沃纱鹊雨庞嵌罢兑之陪牲(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心另一种实现方式:任务队列另一种实现方式:任务队列在非实时系统中,可以考虑通过任务队列在非实时系统中,可以考虑通过任务队列实现对系统中所有任务的管理。实现对系统中所有任务的管理。新任务新任务CPUCPU就绪

68、队列就绪队列等待队列等待队列超时超时调度调度等待资源等待资源获得资源获得资源释放释放CPUCPU单就绪队列和单等待队列单就绪队列和单等待队列单就绪队列和单等待队列单就绪队列和单等待队列53峭辊茵呐昔跑藻狄劫渤代昨枫偏潜筷央庄皱渐函香四缮克轩墒臆每贪黄现(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务队列任务队列单等待队列单等待队列资源对应的事件发生时,实时内核需要扫描资源对应的事件发生时,实时内核需要扫描整个等待队列,搜索等待该资源的任务,并整个等待队列,搜索等待该资源的任务,并按照一定的策略按照一定的策略选取任务,把任务的任

69、务控选取任务,把任务的任务控制块放置到就绪队列。制块放置到就绪队列。如果系统的资源和任务比较多,搜索等待该如果系统的资源和任务比较多,搜索等待该资源的任务所需要的时间就比较长,会影响资源的任务所需要的时间就比较长,会影响整个系统的实时性。整个系统的实时性。可采用一种可采用一种多等待队列多等待队列的处理方式的处理方式资源对应的事件发生时,能够在较短的时间资源对应的事件发生时,能够在较短的时间内确立等待该资源的任务等待队列内确立等待该资源的任务等待队列。 54蔫犀忘期耿怔逗诡箔坍臼蹬粤受安悟镜拂且饲映粟啮露大窗宿抚惹钙鉴千(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工

70、程中心电子科技大学嵌入式软件工程中心新任务新任务CPUCPU就绪队列就绪队列资源资源1 1等待队列等待队列超时超时调度调度等待资源等待资源1 1获得资源获得资源1 1释放释放CPUCPU资源资源2 2等待队列等待队列等待资源等待资源2 2获得资源获得资源2 2资源资源n n等待队列等待队列等待资源等待资源n n获得资源获得资源n n单就绪队列和多等待队列单就绪队列和多等待队列单就绪队列和多等待队列单就绪队列和多等待队列55害曲步挂辆罕鸵摇由女迟枫艾及蓟贷熔咎家鹅勺堂浚僵懦捏渴总音争拽赴(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中

71、心任务队列任务队列对于就绪任务,如果采用上述队列方式进对于就绪任务,如果采用上述队列方式进行管理,在基于优先级的调度处理中,要行管理,在基于优先级的调度处理中,要获得当前具有获得当前具有最高优先级最高优先级的就绪任务:的就绪任务:方式一:任务就绪时,把就绪任务的任务控方式一:任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾制块放在就绪队列的末尾。调度程序需要从就绪队列的头部到尾部进行一次调度程序需要从就绪队列的头部到尾部进行一次遍历,才能获得就绪队列中具有最高优先级的任遍历,才能获得就绪队列中具有最高优先级的任务;务;方式二:就绪队列按照优先级从高到低的顺方式二:就绪队列按照优先级从高到低

72、的顺序排列序排列。新的就绪任务到达时,需要插入到就绪队列的合新的就绪任务到达时,需要插入到就绪队列的合适位置,确保就绪队列保持优先级从高到低排列适位置,确保就绪队列保持优先级从高到低排列的顺序性。的顺序性。56讣片肚寺诲男宇箭系拳味票舍巧堑姓驹丢麓援陌沁瘴膝曲店篓魁湍梦泄桅(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务调度任务调度uC/OSuC/OS总是选择总是选择就绪态任务中优先级最高就绪态任务中优先级最高的任务执行。的任务执行。确定哪个任务优先级最高,下面该哪个任务运行了确定哪个任务优先级最高,下面该哪个任务运行了的工作

73、是由调度器完成的。的工作是由调度器完成的。uC/OSuC/OS的任务级调度是由函数的任务级调度是由函数OS_Sched()OS_Sched()完成的。完成的。中断级的调度是由另一个函数中断级的调度是由另一个函数OSIntExit()OSIntExit()完成的。完成的。需注意的是,需注意的是,uC/OSuC/OS任务调度的执行时间是常数,与任务调度的执行时间是常数,与应用程序建立了多少个任务没有关系。应用程序建立了多少个任务没有关系。57怔悼蚀馁纪荣甚寒栽臆并臣栋咯躺几坑忘舅灸猎谬码绢盗坪拉遵绎缎腥域(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学

74、嵌入式软件工程中心任务调度任务调度 保保 存存 调调 度度 恢恢 复复 保存当前运行任务上下文的时间保存当前运行任务上下文的时间选择下一个任务的调度时间选择下一个任务的调度时间将要运行任务的上下文的恢复时间将要运行任务的上下文的恢复时间取决于任务上下文的定义和处理器的速度。不同种类的处理器,任务上下文的定义不同,其内容有多有少。 任务任务调度调度(即选择下一个运行任务)的时间与(即选择下一个运行任务)的时间与调度过程有关。调度过程有关。强实时内核要求调度过程所花费的时间是确定的,强实时内核要求调度过程所花费的时间是确定的,即不能随系统中就绪任务的数目而变化。即不能随系统中就绪任务的数目而变化。

75、与具体实现调度算法时所采用的数据结构有关与具体实现调度算法时所采用的数据结构有关。58睹俯痘咸锻敢奴衙姓置谣迅祁囱惑脾授穴乒署偏带仗炬办撕卵矮柠爬逗方(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OS_Sched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSIntNesting = 0) & (OSLockNesting = 0) /* 如果如果调用用来来自中自中断断服服务子程序子程序(OSIntNesting0),或者至少,或者至少调用了一次用了一次给任任务调度度上上锁函函数

76、数OSSchedLock()(OSLockNesting0),OSSched()将将退出。退出。*/ y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy-OSTCBStkPtr; 将将 R4, R3, R2 及及 R1 从从新堆新堆栈中中弹出出; 执行中行中断断返回指令返回指令;uCOSuCOS的示意性代码:的示意性代码:的示意性代码:的示意性代码:OS_TASK_SW()OS_TASK_SW()67陪拍施咱夯句了垒娜却歇秘太

77、瑰缓娠阔驱巷敛殿晌醚措拒路钎猩国收也肌(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务切换任务切换中断、自陷中断、自陷运行任务因缺乏资源而被运行任务因缺乏资源而被阻塞阻塞时间片轮转调度时时间片轮转调度时高优先级任务处于就绪时高优先级任务处于就绪时68稍伎由厌秩颤漫闯吧距信好划勿肤见能样搁曾祥函嘴侄阉派演犯基卞省抹(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务切换任务切换中断、自陷中断、自陷如当如当I/O中断发生的时候中断发生的时候如果如果I/O活动是一个或多

78、个任务正在等待的事活动是一个或多个任务正在等待的事件,内核将把相应的处于等待状态的任务转换件,内核将把相应的处于等待状态的任务转换为就绪状态为就绪状态同时,内核还将确定是否继续执行当前处于运同时,内核还将确定是否继续执行当前处于运行状态的任务,或是用高优先级的就绪任务抢行状态的任务,或是用高优先级的就绪任务抢占该任务占该任务自陷自陷由于执行任务中当前指令所引起,将导致实时由于执行任务中当前指令所引起,将导致实时内核处理相应的错误或异常事件,并根据事件内核处理相应的错误或异常事件,并根据事件类型,确定是否进行任务的切换类型,确定是否进行任务的切换69椽骂栋锥娜鹰椽臼酚颁紧雕霖珊筒洪撼濒慨侧陆郧萎

79、挡瀑怒瓣偷众局你目(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务切换任务切换运行任务因缺乏资源而被阻塞运行任务因缺乏资源而被阻塞如,任务执行过程中进行如,任务执行过程中进行I/O操作时操作时(如打开文件),如果此前该文件已(如打开文件),如果此前该文件已被其他任务打开,将导致当前任务处被其他任务打开,将导致当前任务处于等待状态,而不能继续执行于等待状态,而不能继续执行70东削参菠驴亥皱淳滤态森挝嘛臻蜗惰县狠敬旦叛枢裴狗魔处芭耍浇碌偶狐(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大

80、学嵌入式软件工程中心任务切换任务切换时间片轮转调度时时间片轮转调度时内核将在时钟中断处理程序中确定当内核将在时钟中断处理程序中确定当前正在运行的任务的执行时间是否已前正在运行的任务的执行时间是否已经超过了设定的时间片;经超过了设定的时间片;如果超过了时间片,实时内核将停止如果超过了时间片,实时内核将停止当前任务的运行,把当前任务的状态当前任务的运行,把当前任务的状态变为就绪状态,并把另一个任务投入变为就绪状态,并把另一个任务投入运行运行71断鼓锰址价黔陋蛛氢恒咯吻缘互硒欧贯膜榴韦大湍姓品具锐闭权惋赂饿门(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大

81、学嵌入式软件工程中心任务切换任务切换高优先级任务处于就绪时高优先级任务处于就绪时如果采用基于优先级的抢占式调度算法,如果采用基于优先级的抢占式调度算法,将导致当前任务停止运行,使更高优将导致当前任务停止运行,使更高优先级的任务处于运行状态先级的任务处于运行状态72忱雨撒炬斩切侥嚷师霜坚羔橙钾啃页柯继赎墒剪造知吐宫全改称党吮辱饺(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心空闲任务空闲任务uC/OSuC/OS总要建立一个空闲任务总要建立一个空闲任务(Idle Task)(Idle Task),这个任务在,这个任务在没有其他任务进入

82、就绪态时投入运行,其优先级永远设没有其他任务进入就绪态时投入运行,其优先级永远设为最低。为最低。空闲任务不能被删除。空闲任务不能被删除。 73void OS_TaskIdle (void *pdata) /* Prevent compiler warning for not using pdata */ pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; /不不断断给OSIdleCtr加加1 OS_EXIT_CRITICAL(); OSTaskIdleHook(); /* 可可扩展用展用户代代码*/ 酒逮钞蓑栏先吻听塌竟早注忽酵程延判

83、林租花伶它沁射勉棉扩内扩贪写晰(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心统计任务统计任务uC/OSuC/OS中可有一个统计运行时间的任务,叫中可有一个统计运行时间的任务,叫OSTaskStatOSTaskStat()()。如果将系统配置常数。如果将系统配置常数OS_TASK_STAT_ENOS_TASK_STAT_EN设为设为1 1,这个任务就会建立。,这个任务就会建立。OSTaskStat()OSTaskStat()告诉用户应用程序使用了多少告诉用户应用程序使用了多少CPUCPU时时间,用百分比表示。间,用百分比表示。如果

84、应用程序打算使用统计任务,那么在初始化如果应用程序打算使用统计任务,那么在初始化时用户建立的第一个任务中调用统计任务初始化时用户建立的第一个任务中调用统计任务初始化函数函数OSStatInit()OSStatInit(),然后再建立应用程序中的其,然后再建立应用程序中的其他任务。他任务。具体函数参见:具体函数参见:OSStatInit(void)OSStatInit(void)和和OS_TaskStat(void * pdata)OS_TaskStat(void * pdata)。74拦庸织柞嘶斜病临黑酌植邓纂吊蔼憾昼瓶夏卫逃脂毫迫诗映概椎瞪滑癌罩(课件)-嵌入式系统及应用(课件)-嵌入式系统

85、及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第三节第三节任务管理任务管理任务管理机制任务管理机制建立任务建立任务任务堆栈任务堆栈删除任务删除任务改变任务优先级改变任务优先级挂起、恢复任务挂起、恢复任务75柏附莲絮肄噬涪奋讳辊抚爸卫仿耻桔绕脆蹈衷箕阶陶矮馆鸭遥绝擒努蕴卸(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务管理机制任务管理机制创建任务创建任务的过程即为分配任务控制块的过的过程即为分配任务控制块的过程。程。在创建任务时,通常需要确定任务的名字和任在创建任务时,通常需要确定任务的名字和任务的优先级等内

86、容,确立任务所能使用的堆栈务的优先级等内容,确立任务所能使用的堆栈区域。区域。任务创建成功后,通常会为用户返回一个标识任务创建成功后,通常会为用户返回一个标识该任务的该任务的ID,以实现对任务的引用管理。,以实现对任务的引用管理。删除任务删除任务把任务从系统中去掉,释放对应把任务从系统中去掉,释放对应的任务控制块。的任务控制块。挂起挂起/ /唤醒任务唤醒任务把任务变为等待状态,可通把任务变为等待状态,可通过唤醒任务操作把任务转换为就绪状态。过唤醒任务操作把任务转换为就绪状态。76讥蓄匝茫歪却蜕掖绩此悉巫北诚恬娠番亨筒稿殿虐蜡腐侠项搅良焊襄俐剪(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用

87、电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务管理机制任务管理机制设置任务属性设置任务属性可以用来设置任务的抢占、可以用来设置任务的抢占、时间片等特性,以确定是否允许任务在执时间片等特性,以确定是否允许任务在执行过程中被抢占或是对同优先级任务采用行过程中被抢占或是对同优先级任务采用时间片轮转方式运行等。时间片轮转方式运行等。改变任务优先级改变任务优先级用来根据需要改变任务的用来根据需要改变任务的当前优先级。当前优先级。获取任务信息获取任务信息获得任务的当前优先级、任获得任务的当前优先级、任务的属性、任务的名字、任务的上下文、务的属性、任务的名字、任务的上下文、任务的状态等内容

88、,便于用户进行决策。任务的状态等内容,便于用户进行决策。77遍摆凡铆遗见泌扼柱堂岔灭他牢课籍棉崔地仲亦蛀蓖线橱瓮机逊话盏晓团(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心创建任务创建任务任务可以在多任务调度开始前建立,也可以在其任务可以在多任务调度开始前建立,也可以在其他任务的执行过程中建立。他任务的执行过程中建立。在开始多任务调度之前,必须至少建立一个任务。在开始多任务调度之前,必须至少建立一个任务。任务不能由中断服务程序建立。任务不能由中断服务程序建立。任务创建为任务分配和初始化相关的数据结构。任务创建为任务分配和初始化相关

89、的数据结构。任务创建时通常需要使用如下信息:任务创建时通常需要使用如下信息:任务的名字任务的名字任务的初始优先级任务的初始优先级任务栈任务栈任务属性任务属性任务对应的函数入口地址任务对应的函数入口地址任务对应函数的参数任务对应函数的参数任务删除时的回调函数任务删除时的回调函数 78舶吗眯团撰呐乙谐舵课惋矣畜君淑序罩芋谤敦访寞了胯炬饱雀史圾臂电投(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心创建任务创建任务任务创建通常需要完成以下工作:任务创建通常需要完成以下工作:获得任务控制块获得任务控制块TCB根据实时内核用户提供的信息初始化

90、根据实时内核用户提供的信息初始化TCB为任务分配一个可以唯一标识任务的为任务分配一个可以唯一标识任务的ID使任务处于就绪状态,把任务放置到就绪队使任务处于就绪状态,把任务放置到就绪队列列进行任务调度处理进行任务调度处理79驾粱慎范庆幻姐趁泌肾碎衡赞迁杂率珊鸯蔼瓷祁蚂只宰堰笛搭旁跨君姜激(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) /*指向任务代码的指针、传递给任务的

91、参数、堆栈栈顶指针、优先级指向任务代码的指针、传递给任务的参数、堆栈栈顶指针、优先级*/ OS_STK *psp; INT8U err; OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) /* 确保该优先级没有被占用确保该优先级没有被占用 */ OSTCBPrioTblprio = (OS_TCB *)1; /* 占用该优先级占用该优先级 */ OS_EXIT_CRITICAL(); psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0); /* 建立任务堆栈,返回任务的栈顶建立任务

92、堆栈,返回任务的栈顶 */ err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); if (err = OS_NO_ERR) OS_ENTER_CRITICAL(); OSTaskCtr+; /* 记录已建的任务数记录已建的任务数 */ OS_EXIT_CRITICAL(); if (OSRunning = TRUE) /* OSRunning标记多任务是否已经开始执行标记多任务是否已经开始执行 */ OS_Sched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TC

93、B *)0; /* OS_TCBInit()函数执行不成功函数执行不成功 */ OS_EXIT_CRITICAL(); return (err); OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); uCOSuCOS的的的的OSTaskCreate()OSTaskCreate()函数函数函数函数80金挺一酒贸掘妓蛙汀垢历巾徒拦铜呈娜芦硼陶煎镑逻锅板箍姚膳镊颊要事(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务堆栈任务堆栈栈空间:栈空间:由于不同任务运行时需要的大小不同,由内核进行任由于不同任

94、务运行时需要的大小不同,由内核进行任务栈的分配就不能适应应用任务的多样性需求。务栈的分配就不能适应应用任务的多样性需求。通常由通常由用户指定用户指定任务运行过程中需要使用的栈空间。任务运行过程中需要使用的栈空间。确定任务到底需要多少栈空间是一个比较困难的事情。确定任务到底需要多少栈空间是一个比较困难的事情。大都需要进行一个反复修正的过程:大都需要进行一个反复修正的过程:在最开始的时候,根据应用的类型,为任务分配一在最开始的时候,根据应用的类型,为任务分配一个比预期估计更大的栈空间;个比预期估计更大的栈空间;使用栈检测函数,定期监控任务对栈的使用情况,使用栈检测函数,定期监控任务对栈的使用情况,

95、并据此对任务栈的大小进行调整。并据此对任务栈的大小进行调整。81戴倔踪初会粥涨鲸参骸娱翘烯擒暖顺策杏济漳闪卑代莲品哪肄吕紧初彼经(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务堆栈任务堆栈分配堆栈的方法:分配堆栈的方法:静态分配:静态分配:OS_STK MyTaskStackstack_size;OS_STK MyTaskStackstack_size;动态分配:动态分配:malloc()malloc()函数。函数。对于静态分配:对于静态分配:OSTaskCreate(task,pdata,&TaskStack0,prio);

96、OSTaskCreate(task,pdata,&TaskStack0,prio);/堆栈从低地址往高地址递增堆栈从低地址往高地址递增OSTaskCreate(task,pdata,&TaskStackTASK_STACK_SIZE-OSTaskCreate(task,pdata,&TaskStackTASK_STACK_SIZE-1,prio);1,prio);/堆栈从高地址往低地址递增堆栈从高地址往低地址递增82扮群穷吴朋驹腿撅赏不式角肝溉沪讲嘱堵颈逆蚂腰祸洒鸥褐咯骡啦勃攘牢(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心删除

97、任务删除任务 内核根据任务创建时获得的内核根据任务创建时获得的IDID删除指定的任务。删除指定的任务。在删除一个任务时,需要在删除一个任务时,需要释放该任务所拥有的资释放该任务所拥有的资源,使任务返回并处于休眠状态。源,使任务返回并处于休眠状态。释放任务所拥有的资源通常由释放任务所拥有的资源通常由内核内核和和任务任务共同共同完成。完成。内核通常只释放那些由内核为任务分配的资源内核通常只释放那些由内核为任务分配的资源如任务名字和如任务名字和TCB等内容所占用的空间。等内容所占用的空间。由任务自己分配的资源则通常由任务自身进行释放由任务自己分配的资源则通常由任务自身进行释放如任务的堆栈空间,以及其

98、他一些任务申请的如任务的堆栈空间,以及其他一些任务申请的资源,信号量、资源,信号量、timer、文件系统资源、文件系统资源、I/O设备设备和使用和使用malloc等函数动态获得的内存空间等。等函数动态获得的内存空间等。 83疟穷埂锰掷旭旅醇踊樱祥恤镣职辞船柯莲疥恃戊去痕工碴咐屡碎库筷部皆(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心删除任务删除任务任务删除通常需要进行以下工作:任务删除通常需要进行以下工作:根据指定的根据指定的ID,获得对应任务的,获得对应任务的TCB把任务的把任务的TCB从队列中取出来,挂入空闲从队列中取出来,

99、挂入空闲TCB队列队列释放任务所占用的资源释放任务所占用的资源84糕芦铡知饶湖剁软棍忱逢漱蔬蛙旷率力炎冬处鞋台瘁熔持怒涪旧蓖凉嚎啼(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8U OSTaskDel (INT8U prio) OS_EVENT *pevent; OS_FLAG_NODE *pnode; OS_TCB *ptcb; BOOLEAN self; if (OSIntNesting 0) /* 确保不在中断服务程序中删除任务确保不在中断服务程序中删除任务 */ return (OS_TASK_DEL_ISR);

100、OS_ENTER_CRITICAL(); ptcb = OSTCBPrioTblprio; if (ptcb != (OS_TCB *)0) /* 被删除的任务必须存在被删除的任务必须存在 */ if (OSRdyTblptcb-OSTCBY &= ptcb-OSTCBBitX) = 0x00) OSRdyGrp &= ptcb-OSTCBBitY; /* 这是前面讲过的,就续表中的删除操作这是前面讲过的,就续表中的删除操作 */ pevent = ptcb-OSTCBEventPtr; if (pevent != (OS_EVENT *)0) /* 如果任务在等信号量、邮箱或消息队列如果任务

101、在等信号量、邮箱或消息队列 */ if (pevent-OSEventTblptcb-OSTCBY &= ptcb-OSTCBBitX) = 0) /* 从等待表中删除,事件的等待表的结构和操作原理与任务就续表类似从等待表中删除,事件的等待表的结构和操作原理与任务就续表类似 */ pevent-OSEventGrp &= ptcb-OSTCBBitY; pnode = ptcb-OSTCBFlagNode; if (pnode != (OS_FLAG_NODE *)0) /* 如果任务在等事件标志如果任务在等事件标志 */ OS_FlagUnlink(pnode); uCOSuCOS中中中中O

102、STaskDel() OSTaskDel() 函数函数函数函数85灶弄预尸肖魔沧育搏祁究干唐漆孙衔痢都敌踏郧疾眉臼撬腐误咀痊恳谬咙(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心 ptcb-OSTCBDly = 0; ptcb-OSTCBStat = OS_STAT_RDY; if (OSLockNesting 0) OSLockNesting- -; /* 重新允许任务调度重新允许任务调度 */ OSTaskDelHook(ptcb); /* 删除用户自定义的任务附加数据域删除用户自定义的任务附加数据域 */ OSTaskCtr

103、-; /* 内核的任务数减一内核的任务数减一 */ OSTCBPrioTblprio = (OS_TCB *)0; /* 被删除任务的被删除任务的TCB置空置空 */ if (ptcb-OSTCBPrev = (OS_TCB *)0) /* 把把TCB放回空闲链表放回空闲链表 */ ptcb-OSTCBNext-OSTCBPrev = (OS_TCB *)0; OSTCBList = ptcb-OSTCBNext; else ptcb-OSTCBPrev-OSTCBNext = ptcb-OSTCBNext; ptcb-OSTCBNext-OSTCBPrev = ptcb-OSTCBPrev;

104、 ptcb-OSTCBNext = OSTCBFreeList; OSTCBFreeList = ptcb; OS_EXIT_CRITICAL(); OS_Sched(); /* 重新调度任务重新调度任务 */ return (OS_NO_ERR); OS_EXIT_CRITICAL(); return (OS_TASK_DEL_ERR);86梗搔雷言姥扎埃杖蔼撤奢淘少耍床气卓滞示雹绒透智谱伏媚映截缉理宇恋(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心挂起任务挂起任务 挂起任务可以调用挂起任务可以调用OSTaskSuspend(

105、)OSTaskSuspend()函数,被挂函数,被挂起的任务只能通过调用起的任务只能通过调用OSTaskResume()OSTaskResume()来恢复。来恢复。一个任务可以把自己挂起一个任务可以把自己挂起当任务把自己挂起后,会引起任务的调度,实时当任务把自己挂起后,会引起任务的调度,实时内核将选取另外一个合适的任务进行执行。内核将选取另外一个合适的任务进行执行。任务被挂起后,该任务将处于等待状态任务被挂起后,该任务将处于等待状态挂起任务通常需要进行以下工作:挂起任务通常需要进行以下工作:根据指定的根据指定的ID,获得对应任务的,获得对应任务的TCB把任务的状态变为等待状态,并把把任务的状态

106、变为等待状态,并把TCB放置放置到等待队列到等待队列如果任务自己挂起自己,进行任务调度如果任务自己挂起自己,进行任务调度87铸诌蔡毋波牲酝嵌鲍旬吮标琢吨拥搓敢稽瘤腻戈柬泼损貌详缀抨植抒即叙(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8U OSTaskSuspend (INT8U prio) BOOLEAN self; /* self用于判断调用本函数的任务是否是当前任务,用于判断调用本函数的任务是否是当前任务,self=TRUE表示是挂起当前表示是挂起当前任务任务 */ OS_TCB *ptcb; OS_ENTER_CR

107、ITICAL(); if (prio = = OS_PRIO_SELF) prio = OSTCBCur-OSTCBPrio; self = TRUE; else if (prio = OSTCBCur-OSTCBPrio) self = TRUE; else self = FALSE; ptcb = OSTCBPrioTblprio; if (ptcb = = (OS_TCB *)0) /* 被挂起的任务必须存在被挂起的任务必须存在 */ OS_EXIT_CRITICAL(); return (OS_TASK_SUSPEND_PRIO); if (OSRdyTblptcb-OSTCBY &=

108、 ptcb-OSTCBBitX) = = 0x00) /* 从就绪表中移除从就绪表中移除 */ OSRdyGrp &= ptcb-OSTCBBitY; ptcb-OSTCBStat |= OS_STAT_SUSPEND; /* 改变任务状态改变任务状态 */ OS_EXIT_CRITICAL(); if (self = = TRUE) /* 如果不是挂起自己,就没必要进行任务切换如果不是挂起自己,就没必要进行任务切换 */ OS_Sched(); return (OS_NO_ERR);uCOS OSTaskSuspend()uCOS OSTaskSuspend()函数函数函数函数88竹文粉犀全

109、挣业杠示层晾哮淄案闺馈痔毅染黍肋敷拒藻证饼但累差苦扔屿(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心解挂任务解挂任务 被挂起的任务只能通过其他任务调用被挂起的任务只能通过其他任务调用OStaskResumeOStaskResume()()才能恢复。才能恢复。根据任务根据任务IDID解挂指定的任务。解挂指定的任务。如果任务还在等待其他资源,任务解挂后仍然处如果任务还在等待其他资源,任务解挂后仍然处于等待状态于等待状态;否则,解挂后的任务将处于就绪状态。否则,解挂后的任务将处于就绪状态。解挂任务通常需要进行以下工作:解挂任务通常需要

110、进行以下工作:根据指定的根据指定的ID,获得对应任务的,获得对应任务的TCB如果任务在等待其他资源,任务将仍然处于等待如果任务在等待其他资源,任务将仍然处于等待状态;否则,把任务的状态变为就绪状态,并把状态;否则,把任务的状态变为就绪状态,并把TCB放置到就绪队列放置到就绪队列进行任务调度进行任务调度89所掌狙懊蚀奸饿锹腔淮紊茵捕申札候夏非搜舅斑谨休茂梗晨哼备博粳臃吝(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心INT8U OSTaskResume (INT8U prio) OS_TCB *ptcb; OS_ENTER_CRIT

111、ICAL(); ptcb = OSTCBPrioTblprio; if (ptcb = = (OS_TCB *)0) /* 被恢复的任务必须存在被恢复的任务必须存在 */ OS_EXIT_CRITICAL(); return (OS_TASK_RESUME_PRIO); if (ptcb-OSTCBStat & OS_STAT_SUSPEND) != 0x0) /* 要恢复的任务须处于要恢复的任务须处于suspend状态状态 */ if (ptcb-OSTCBStat &= OS_STAT_SUSPEND) = = OS_STAT_RDY) & (ptcb-OSTCBDly = = 0) /*

112、 表示此时任务没有延时表示此时任务没有延时 */ OSRdyGrp |= ptcb-OSTCBBitY; /* 添加到就绪表添加到就绪表 */ OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL(); OS_Sched(); else OS_EXIT_CRITICAL(); return (OS_NO_ERR); OS_EXIT_CRITICAL(); return (OS_TASK_NOT_SUSPENDED);OSTaskResume in uCOSOSTaskResume in uCOS90稚珠贪失灶珐殆鼻瓮鹏曾痊进劫陡崎惯帜殊

113、哩劲郎满惮铲酒淘危佯陵学赃(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务延时任务延时 使当前任务延时一段指定的时间,时间到使当前任务延时一段指定的时间,时间到后,任务又重新回到就绪状态。后,任务又重新回到就绪状态。任务延时通常需要进行以下工作:任务延时通常需要进行以下工作:修改任务状态,把任务状态变为等待状态修改任务状态,把任务状态变为等待状态把任务把任务TCB放置到时间等待链放置到时间等待链 (uC/OS没有这样没有这样做,只是改变做,只是改变OSTCBDly的值的值)进行任务调度进行任务调度91荷沂宗挺彼鹏牟誓系诺影侧御

114、祁恨辜磋钉斥登妇竟斌妮阀鬃赔烯静疲出信(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OSTimeDly (INT16U ticks) if (ticks 0) /* 0 means no delay! */ OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY; OSTCBCur-OSTCBDly = ticks; OS_EXIT_CRITICAL(); OS

115、_Sched(); uC/OS中的中的OSTimeDly( )函数函数延时的任务可以不等延时期满,而是可以通过其延时的任务可以不等延时期满,而是可以通过其他任务取消延时而使自己处于就绪态。他任务取消延时而使自己处于就绪态。可以通过指定要恢复的任务的优先级来调用可以通过指定要恢复的任务的优先级来调用OSTimeDlyResumeOSTimeDlyResume()函数来完成。()函数来完成。付乡摆哗箔爸徐伞瘤刹受吻拽术惮冀狞搽宠勺析婆说恢旁炔黑椭履嚣掌怔(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心改变任务的优先级改变任务的优先级在

116、建立任务时,需要给任务指定一个优先级。在建立任务时,需要给任务指定一个优先级。在程序运行期间,可以通过调用函数在程序运行期间,可以通过调用函数OSTaskChangePrioOSTaskChangePrio()()改变任务的优先级。改变任务的优先级。换句话说,换句话说,uCOSuCOS允许动态改变任务的优先级。允许动态改变任务的优先级。需要注意的是:需要注意的是:1.1.不能改变空闲任务的优先级;不能改变空闲任务的优先级;2.2.可以改变自己或其他任务的优先级;可以改变自己或其他任务的优先级;3.3.必须保证每个优先级唯一对应一个任务。必须保证每个优先级唯一对应一个任务。93锈诧婉赃沪梨衬惕烯

117、举默滨刮戒邹擅仲啤端厌渗缘服猫盛叼崩菱石枪某素(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心关于任务扩展关于任务扩展 任务扩展任务扩展便于应用能够向系统中添加一些关于任务的附便于应用能够向系统中添加一些关于任务的附加操作加操作为应用提供在系统运行的关键点上进行干预的为应用提供在系统运行的关键点上进行干预的手段手段可把应用提供的函数挂接到系统中去可把应用提供的函数挂接到系统中去在创建任务、任务上下文发生切换或是任务被在创建任务、任务上下文发生切换或是任务被删除的时候这些被挂接的函数能够得到执行删除的时候这些被挂接的函数能够得到执行

118、94捆贤秀壤哼肿疙谭赘秉抨架扼浸抑肥壕檄涪蝴理桥抉吗谅焊碘避彤鉴沮骡(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心关于任务扩展关于任务扩展任务扩展的时机通常包含以下情况:任务扩展的时机通常包含以下情况:任务创建时任务创建时任务删除时任务删除时任务上下文切换时任务上下文切换时任务扩展功能实现方式:任务扩展功能实现方式:任务扩展表任务扩展表应用编程接口应用编程接口95糜荐爸秉专棋辐嚎老判槛徽函困汤请紧灶胖洋郊害稻领育朋阐空硅沈耳哼(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件

119、工程中心typedef void (*extensionRoutine)(void);typedef structextensionRoutine extensionOfTaskCreate;extensionRoutine extensionOfTaskDelete;extensionRoutine extensionOfTaskSwitch;taskExtensionTable;statusCode extensionCreate(taskExtensionTable *extensionTable,int *ID);statusCode extensionDelete(int exten

120、sionTableID);任务扩展表处理任务扩展表处理任务扩展表处理任务扩展表处理任务扩展表用来存放实现任务扩展处理的例程,实时内核通过查找任任务扩展表用来存放实现任务扩展处理的例程,实时内核通过查找任务扩展表来获取扩展处理的入口函数。务扩展表来获取扩展处理的入口函数。通过创建任务扩展表,把任务扩展例程添加到系统中去;通过删除任通过创建任务扩展表,把任务扩展例程添加到系统中去;通过删除任务扩展表则可把任务扩展例程删除掉。务扩展表则可把任务扩展例程删除掉。96藐拷笔巷枢发史龙藤峰箱湍牧情整堂百屏窄鲜枫概厦誉洁抵卧谊病嗅癣逾(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件

121、工程中心电子科技大学嵌入式软件工程中心extensionRoutineOfTaskCreateAdd();/*为任务创建时提供扩展处理例程为任务创建时提供扩展处理例程*/extensionRoutineOfTaskCreateDelete();/*删除为任务创建提供的扩展处理例程删除为任务创建提供的扩展处理例程*/extensionRoutineOfTaskDeleteAdd();/*为任务删除时提供扩展处理例程为任务删除时提供扩展处理例程*/extensionRoutineOfTaskDeleteDelete();/*删除为任务删除提供的扩展处理例程删除为任务删除提供的扩展处理例程*/ext

122、ensionRoutineOfTaskSwitchAdd();/*为任务上下文切换时提供扩展处理例程为任务上下文切换时提供扩展处理例程*/extensionRoutineOfTaskSwitchDelete();/*删删除除为为任任务务上上下下文文切切换换提提供供的的扩扩展展处处理理例例程程*/API 描述描述通过单独的通过单独的通过单独的通过单独的APIAPI实现任务扩展实现任务扩展实现任务扩展实现任务扩展 为任务创建、任务删除和任务上下文切换分别提供了添加和删除为任务创建、任务删除和任务上下文切换分别提供了添加和删除任务扩展处理例程。任务扩展处理例程。 97朱爪栓柏戌农美黔仑凉协任烷圾僵潜

123、醒傈款几收微伴讳肋垢禽语费仅烯哄(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OSIntCtxSw(void);void OSStartHighRdy(void);void OSTaskCreateHook(OS_TCB *ptcb);void OSTaskDelHook(OS_TCB *ptcb);void OSTaskStatHook(void);OS_STK *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16Uopt);v

124、oid OSTaskSwHook(void);void OSTimeTickHook(void);HOOK in uCOSHOOK in uCOS98读积在污槐裙抠蔓米倪依前勺向那轮迹疫媒须在智臂沦猜赖曝翼维纠阳大(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OSInit (void) OSInitHookBegin(); /* Call port specific initialization code */ OS_InitMisc(); /* Initialize miscellaneous variables *

125、/ OS_InitRdyList(); /* Initialize the Ready List */ OS_InitTCBList(); /* Initialize the free list of OS_TCBs */ OS_InitEventList(); /* Initialize the free list of OS_EVENTs */ OS_InitTaskIdle(); /* Create the Idle Task */ OSInitHookEnd(); /* Call port specific init. code */HOOK used in OSInit in uCO

126、SHOOK used in OSInit in uCOS99踏致碗贸五喂颈耽当挟锥颁钉月胀郑锚恕湿腋业溜掩仑卓皋除游狈枫迎菇(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第四节第四节任务调度任务调度基于优先级的可抢占调度基于优先级的可抢占调度时间片轮转调度时间片轮转调度静态调度静态调度*动态调度动态调度*静态调度与动态调度之间的比较静态调度与动态调度之间的比较* 100襄魏矛剑颊洪习诱蔷沮杭招复灼援炬之勃驯丑妆窖太蓑据底陷蓖瞎不调幢(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入

127、式软件工程中心任务调度要解决的问题任务调度要解决的问题WHAT:按什么原则分配:按什么原则分配CPU 任务调度算法任务调度算法WHEN:何时分配:何时分配CPU任务调度的时机任务调度的时机HOW: 如何分配如何分配CPU任务调度过程任务调度过程101敢限撮唐竿权稚溪墨埠瓣掷醋贾挫艇舶汲迹呜藻窘柄穆名危茵度铺埔庐蝗(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心计算机发展初期计算机发展初期通常都要集中在计算机所在的地方,人为地以通常都要集中在计算机所在的地方,人为地以作业(作业(job)的方式把工作内容一件一件地提交)的方式把工作内

128、容一件一件地提交给计算机进行处理,也就不存在调度的概念给计算机进行处理,也就不存在调度的概念随后,出现了计算机的批处理方式随后,出现了计算机的批处理方式计算机把作业按照计算机把作业按照先来先服务先来先服务的方式进行处理,的方式进行处理,体现了一种非常简单的调度概念体现了一种非常简单的调度概念后来出现多道程序处理方式,调度才变得复后来出现多道程序处理方式,调度才变得复杂和重要起来杂和重要起来调度调度102驮半簇舷就郊吝集颤嘲便付棒绅露店六仆斟刽泛逝抿尊肚挛爆浚诫隙著碍(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心调度用来确定调度用

129、来确定多任务环境下任务执行的多任务环境下任务执行的顺序顺序和和在获得在获得CPUCPU资源后能够执行的时间资源后能够执行的时间长度长度。操作系统通过一个操作系统通过一个调度程序调度程序来实现调度来实现调度功能。功能。调度程序以函数的形式存在,用来实现操作调度程序以函数的形式存在,用来实现操作系统的调度算法。系统的调度算法。调度程序本身并不是一个任务,是一个函数调度程序本身并不是一个任务,是一个函数调用,可在内核的各个部分进行调用。调用,可在内核的各个部分进行调用。调度调度103秸盐搭缚痛族表童渔帅无涂朴诞症崭挂铲靶侠樊惋第紫曹降国苦幸灾甩垮(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电

130、子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心void OS_Sched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSIntNesting = 0) & (OSLockNesting = 0) /* Sched. only if all ISRs done & not locked */ y = OSUnMapTblOSRdyGrp; /*Get pointer to HPT ready*/ OSPrioHighRdy = (INT8U)(y 3) +OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OS

131、PrioCur) /* No Ctx Sw if current task is highest rdy */ OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; /* Increment context switch counter */ OS_TASK_SW(); /* Perform a context switch */ OS_EXIT_CRITICAL();uC/OSuC/OS的任务调度函数的任务调度函数的任务调度函数的任务调度函数104绘难坞蹬致亿怎氟炮晨算凹的次堑森微牌惩魏螟呼抽西近暴抓敝投九宿墟(课件)-嵌入式系统及应用

132、(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心调用调度程序的具体位置又被称为调用调度程序的具体位置又被称为是一个是一个调度点调度点(scheduling scheduling pointpoint),调度点通常处于以下位置:),调度点通常处于以下位置:中断服务程序的结束位置;中断服务程序的结束位置;任务因等待资源而处于等待状态;任务因等待资源而处于等待状态;任务处于就绪状态时等。任务处于就绪状态时等。调度调度105替阴鹃咬秧宴芦改瘸第氛躲作蜀茨秋笛妨则浦代拱讣篡褒挝某漂钱阅础痔(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程

133、中心电子科技大学嵌入式软件工程中心调度本身需要一定的系统开销,需要花费时调度本身需要一定的系统开销,需要花费时间来计算下一个可被执行的任务。间来计算下一个可被执行的任务。竭力使用竭力使用最优调度方案最优调度方案往往并不是一个明往往并不是一个明智的办法智的办法高级的调度程序通常具有高级的调度程序通常具有不可预见性不可预见性,需,需要花费更多的时间和资源要花费更多的时间和资源并且其复杂性也增加了应用编程人员的使并且其复杂性也增加了应用编程人员的使用难度。用难度。调度调度106羹腮振络烧亩件冕谣熏全践郑伍詹漏族斩时税蘑饮丝沿识魔讹要酸昨斥惺(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技

134、大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心简单简单是实时内核所强调的主要特点是实时内核所强调的主要特点实用的实时内核在实现时大都采用了简单实用的实时内核在实现时大都采用了简单的调度算法,以确保任务的的调度算法,以确保任务的实时约束特性实时约束特性和和可预见性可预见性是可以管理的。是可以管理的。复杂的、高级的复杂的、高级的调度算法则通常用于研究领调度算法则通常用于研究领域域 调度调度107橙褂备搬距蓉郝很繁淬势辕责掐逢差溉夜辰湃革滔购芽亮网仟吾茅沙耍弥(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心内核的主要职责就是要确保

135、所有的任务内核的主要职责就是要确保所有的任务都能够都能够满足任务的时间约束特性要求满足任务的时间约束特性要求时间约束特性来源于任务的不同需求(如截时间约束特性来源于任务的不同需求(如截止时间、止时间、QoS等),且同一个任务在不同时等),且同一个任务在不同时候也可能具有不同的时间约束特性。候也可能具有不同的时间约束特性。比如,机器人中用来控制行动的任务在障碍环境比如,机器人中用来控制行动的任务在障碍环境下行走所需要考虑的约束特性就比行走在开放环下行走所需要考虑的约束特性就比行走在开放环境下要多得多。境下要多得多。能够同时适应所有情况的调度算法是不存在能够同时适应所有情况的调度算法是不存在的。的

136、。调度调度108汝筐摸企柔蔑巳暂锥起箔躬杀牺柿滩疆犹印焉像减萨皑洱杆螺耐偶方拐负(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心设计调度程序时,通常需要综合考虑如设计调度程序时,通常需要综合考虑如下因素:下因素:CPU的使用率(的使用率(CPU utilization)输入输入/输出设备的吞吐率输出设备的吞吐率响应时间(响应时间(responsive time)公平性公平性截止时间截止时间调度算法调度算法110灶烹坎轰但鸣概唇吴峡窟铆苑瓦徘叮北黎务眼溉寇辈貌寿攫礼酶饺赢纶舵(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科

137、技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心这些因素之间具有一定的冲突性。这些因素之间具有一定的冲突性。比如可通过让更多的任务处于就绪状态来提比如可通过让更多的任务处于就绪状态来提高高CPU的使用率,但这显然会降低系统的响的使用率,但这显然会降低系统的响应时间。应时间。调度程序的设计需要调度程序的设计需要优先考虑最重要的需求优先考虑最重要的需求,然后然后在各种因素之间进行折衷处理在各种因素之间进行折衷处理。调度算法调度算法是在一个特定时刻用来确定将要运行的任务的是在一个特定时刻用来确定将要运行的任务的一组规则一组规则调度算法调度算法111账预置碰盈袋厚充卧佐笨缺税缆粥顿罐素皇附餐指托

138、滋及况榷腾焰巾毡粘(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心从从19731973年年LiuLiu和和LaylandLayland开始关于实时调度算开始关于实时调度算法的研究工作以来(法的研究工作以来(19731973年,年,LiuLiu和和LaylandLayland发表了一篇名为发表了一篇名为“Scheduling Algorithms Scheduling Algorithms for Multiprogramming in a Hard Real-for Multiprogramming in a Hard Real-

139、Time EnvironmentTime Environment”的论文),相继出现了的论文),相继出现了很多调度算法和方法。很多调度算法和方法。调度算法调度算法112孜哇缎量解艺久敛辐彪还注诈斡称爵砰憾下柬挺器井固及伞弹渝匿帅王锅(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心对于大量的实时调度方法而言,存在着对于大量的实时调度方法而言,存在着以下几类主要的划分方法:以下几类主要的划分方法:离线(离线(off-line)和在线()和在线(on-line)调度)调度抢占(抢占(preemptive)和非抢占()和非抢占(non-p

140、reemptive)调度)调度静态(静态(static)和动态()和动态(dynamic)调度)调度最佳(最佳(optimal)和试探性()和试探性(heuristic)调)调度度调度算法调度算法113近必创李鹊卜帅孰鸭郭温湍矣苔烁差衍悄催惊雾盔尺笔掺固始洱惯讨昧得(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心抢占式调度和非抢占式调度:任务在运行抢占式调度和非抢占式调度:任务在运行过程中能否被打断的处理情况。过程中能否被打断的处理情况。抢占式调度抢占式调度:正在运行的任务可能被其他任务:正在运行的任务可能被其他任务所打断。所打断

141、。非抢占式调度非抢占式调度:一旦任务开始运行,该任务只:一旦任务开始运行,该任务只有在运行完成而主动放弃有在运行完成而主动放弃CPU资源,或是因资源,或是因为等待其他资源被阻塞的情况下才会停止运行。为等待其他资源被阻塞的情况下才会停止运行。实时内核大都采用了抢占式调度算法实时内核大都采用了抢占式调度算法,使,使关键任务能够打断非关键任务的执行,确关键任务能够打断非关键任务的执行,确保关键任务的截止时间能够得到满足。保关键任务的截止时间能够得到满足。抢占式和非抢占调度抢占式和非抢占调度115年击碧衷嫉弃驰粮奇乘团簿朔推晶数哑翱摘决叛袁掀峦懒寄店拉厅闺陶贩(课件)-嵌入式系统及应用(课件)-嵌入式

142、系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心抢占式调度算法抢占式调度算法要更复杂些,且需要要更复杂些,且需要更多的资源,并可能在使用不当的情更多的资源,并可能在使用不当的情况下会造成低优先级任务出现长时间况下会造成低优先级任务出现长时间得不到执行的情况。得不到执行的情况。非抢占式调度算法非抢占式调度算法常用于那些任务需常用于那些任务需要按照预先确定的顺序进行执行,且要按照预先确定的顺序进行执行,且只有当任务主动放弃只有当任务主动放弃CPUCPU资源后,其资源后,其他任务才能得到执行的情况。他任务才能得到执行的情况。抢占式和非抢占调度抢占式和非抢占调度116曝脆痊继静缘

143、螟呕虾注位靴罪躯抑俘竭瞥魂壹瘪胞也孰聋笆前煤艇随穆褥(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心内核的可抢占性内核的可抢占性内核可抢占与不可抢占内核可抢占与不可抢占:执行内核提供的:执行内核提供的系统调用系统调用的过程中,的过程中,是否可以被中断打断是否可以被中断打断。可抢占内核可抢占内核:即使正在执行的是内核服务:即使正在执行的是内核服务函数,也能响应中断,并且中断服务程序函数,也能响应中断,并且中断服务程序退出时能进行任务重新调度:退出时能进行任务重新调度:如果有优先级更高的任务就绪,就立即让高优如果有优先级更高的任务就绪

144、,就立即让高优先级任务运行,不要求回到被中断的任务,将先级任务运行,不要求回到被中断的任务,将未完成的系统调用执行完。未完成的系统调用执行完。117左禹究啊泪遵呼鹅疙孽歧勘芳麓超相勾柱拣垃帧滨坟榜芋你砚垢陪骚异约(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心内核的可抢占性内核的可抢占性不可抢占内核不可抢占内核:不可抢占内核有两种情况:不可抢占内核有两种情况内核服务函数不能被中断内核服务函数不能被中断:系统在执行内核服:系统在执行内核服务函数时处于关中断状态,不能响应外部可屏务函数时处于关中断状态,不能响应外部可屏蔽中断,这样就会

145、在一定程度上延迟中断响应蔽中断,这样就会在一定程度上延迟中断响应时间。时间。能被中断但是不能进行任务重新调度能被中断但是不能进行任务重新调度。系统在执行内核服务函数时可以响应中断,系统在执行内核服务函数时可以响应中断,不会延迟中断响应时间;不会延迟中断响应时间;但是在中断退出时不进行但是在中断退出时不进行任务重新调度任务重新调度。118跃师远哪颗衷绦渍毁即颧言咒镭噶函冲最争者凯妓歪牛胎瞎免损锚炒婿钉(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心低优先级任务低优先级任务内核服务内核服务ISRISR高优先级任务高优先级任务时时间间(

146、1)(1)(2)(2)(3)(3)(4)(4)(5)(5)不可抢占内核(允许中断)不可抢占内核(允许中断)(1)(1)低优先级任务调用内核服务低优先级任务调用内核服务(2)(2)内核服务过程中,系统发生中断,在允许中断的情况下,进入中断服务程内核服务过程中,系统发生中断,在允许中断的情况下,进入中断服务程序(序(ISRISR)(3)(3)中断服务程序完成后,回到内核服务中中断服务程序完成后,回到内核服务中(4)(4)内核服务完成,进行任务调度,切换到新就绪的高优先级任务内核服务完成,进行任务调度,切换到新就绪的高优先级任务(5)(5)高优先级任务运行完成或者因为其它原因阻塞,内核调度低优先级任

147、务,高优先级任务运行完成或者因为其它原因阻塞,内核调度低优先级任务,低优先级任务恢复执行低优先级任务恢复执行119奠慢默闪受盐湍霞放影掐势碑匡义彝只贱乖呢郎球页椽茧吧薄庐顶漳晚铭(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心低优先级任务低优先级任务内核服务内核服务ISRISR高优先级任务高优先级任务时时间间(1)(1)(2)(2)(3)(3)(4)(4)(5)(5)可抢占内核可抢占内核(1)(1)低优先级任务调用内核服务低优先级任务调用内核服务 (2)(2)内核服务过程中系统发生中断,在允许中断的情况下,进入中断服务内核服务过程

148、中系统发生中断,在允许中断的情况下,进入中断服务程序(程序(ISRISR) (3)(3)中断服务程序完成后,内核调度新就绪的高优先级任务运行中断服务程序完成后,内核调度新就绪的高优先级任务运行 (4)(4)高优先级任务运行完成或者因为其它原因阻塞,系统回到先前被低优高优先级任务运行完成或者因为其它原因阻塞,系统回到先前被低优先级任务调用的、尚未完成的内核服务中先级任务调用的、尚未完成的内核服务中 (5)(5)内核服务完成,返回到低优先级任务中,低优先级任务继续执行内核服务完成,返回到低优先级任务中,低优先级任务继续执行 120厦乃拆曹踊萎离硼奔纽躺龙斜喜拳邑蛰承溯碧团沛箍兔末绞簧孤灾甚搀辩(课

149、件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心基于优先级的可抢占调度基于优先级的可抢占调度 基于优先级的可抢占调度方式基于优先级的可抢占调度方式如果出现具有如果出现具有更高优先级更高优先级的任务处于就绪状的任务处于就绪状态时,当前任务将停止运行,把态时,当前任务将停止运行,把CPU的控制的控制权交给具有更高优先级的任务,使更高优先权交给具有更高优先级的任务,使更高优先级的任务得到执行。级的任务得到执行。实时内核需要确保实时内核需要确保CPUCPU总是被具有最高优总是被具有最高优先级的就绪任务所控制。先级的就绪任务所控制。当一个具有比

150、当前正在运行任务的优先级更当一个具有比当前正在运行任务的优先级更高的任务处于就绪状态的时候,实时内核应高的任务处于就绪状态的时候,实时内核应及时进行及时进行任务切换任务切换,保存当前正在运行任务,保存当前正在运行任务的上下文,切换到具有更高优先级的任务的的上下文,切换到具有更高优先级的任务的上下文。上下文。121帘搁踏杜骇季逾滔辽恃锨佳夸仟碍莉倦姬贷释扎返带玫耶论感症裔魁搂楷(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3优先级优先级高高低低时间时间任务任务2 2就绪就绪任务任务3 3就绪

151、就绪任务任务2 2任务任务1 1抢占抢占抢占抢占任务任务3 3运行结束运行结束任务任务2 2运行结束运行结束在可抢占调度方式下的任务运行情况在可抢占调度方式下的任务运行情况在可抢占调度方式下的任务运行情况在可抢占调度方式下的任务运行情况 任务任务1 1被具有更高优先级的任务被具有更高优先级的任务2 2所抢占,然后任务所抢占,然后任务2 2又被任务又被任务3 3抢占。当抢占。当任务任务3 3完成运行后,任务完成运行后,任务2 2继续执行。当任务继续执行。当任务2 2完成运行后,任务完成运行后,任务1 1才又得才又得以继续执行。以继续执行。 122侍蜘寇疚喜瑞供捞孤贵岁署鸭干青榜痞戚峙逊吸癣垣祥击

152、酮研馏蝎憨励荧(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心时间片轮转调度时间片轮转调度 时间片轮转调度(时间片轮转调度(round-robin round-robin schedulingscheduling)算法)算法当有当有两个或多个就绪任务具有相同的优先级,两个或多个就绪任务具有相同的优先级,且它们是就绪任务中优先级最高的任务时,且它们是就绪任务中优先级最高的任务时,任务调度程序按照这组任务就绪的先后次序任务调度程序按照这组任务就绪的先后次序调度第一个任务,让第一个任务运行一段时调度第一个任务,让第一个任务运行一段时间,

153、然后又调度第二个任务,让第二个任务间,然后又调度第二个任务,让第二个任务又运行一段时间,依次类推,到该组最后一又运行一段时间,依次类推,到该组最后一个任务也得以运行一段时间后,接下来又让个任务也得以运行一段时间后,接下来又让第一个任务运行。第一个任务运行。任务运行的这段时间称为任务运行的这段时间称为时间片时间片(time time slicingslicing)。)。123剁罕盆民摹粹哲珍纳哆征抱揉疡电酗虫野眼挂荔穷跨瞻芬渠隙贩坛乞攒涕(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务1 1任务任务2 2任务任务3 3优先级

154、优先级高高低低时间时间任务任务3 3就绪就绪任务任务3 3运行结束运行结束任务任务1 1任务任务2 2任务任务1 1任务任务2 2在时间片轮转调度方式下的任务运行情况在时间片轮转调度方式下的任务运行情况在时间片轮转调度方式下的任务运行情况在时间片轮转调度方式下的任务运行情况任务任务1 1和任务和任务2 2具有相同的优先级,按照时间片轮转的方式轮流执行。具有相同的优先级,按照时间片轮转的方式轮流执行。当高优先级任务当高优先级任务3 3就绪后,正在执行的任务就绪后,正在执行的任务2 2被抢占,高优先级任务被抢占,高优先级任务3 3得得到执行。到执行。当任务当任务3 3完成运行后,任务完成运行后,任

155、务2 2才重新在未完成的时间片内继续执行。才重新在未完成的时间片内继续执行。随后任务随后任务1 1和任务和任务2 2又按照时间片轮转的方式执行。又按照时间片轮转的方式执行。 124泛却祥郁奋攻匠黍袜粟额别期凛材汝鹅森村科舍席赚匝赔锤肢让戈杀椒杨(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心时间片轮转调度时间片轮转调度在时间片轮转调度方式中在时间片轮转调度方式中当任务运行完一个时间片后,该任务即使还没当任务运行完一个时间片后,该任务即使还没有停止运行,也必须释放处理器让下一个与它有停止运行,也必须释放处理器让下一个与它相同优先级的

156、任务运行,使实时系统中相同优先级的任务运行,使实时系统中优先级优先级相同的任务相同的任务具有平等的运行权利。具有平等的运行权利。释放处理器的任务被排到同优先级就绪任务链释放处理器的任务被排到同优先级就绪任务链的链尾,等待再次运行。的链尾,等待再次运行。125彼佑圃汀换滞滨沂跳绰郝靴负粤炒睬尹涤姑铸脂粥冬娇源缕赐七绅郊善冤(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心时间片轮转调度时间片轮转调度采用时间片轮转调度算法时,任务的采用时间片轮转调度算法时,任务的时间片时间片大小大小要适当选择。要适当选择。时间片大小的选择会影响系统的性

157、能和效率:时间片大小的选择会影响系统的性能和效率:时间片太大时间片太大,时间片轮转调度就没有意义;,时间片轮转调度就没有意义;时间片太小时间片太小,任务切换过于频繁,处理器开销大,任务切换过于频繁,处理器开销大,真正用于运行应用程序的时间将会减小。真正用于运行应用程序的时间将会减小。不同的实时内核在实现时间片轮转调度算法不同的实时内核在实现时间片轮转调度算法上可能有一些差异:上可能有一些差异:有的内核允许同优先级的各个任务有不一致的有的内核允许同优先级的各个任务有不一致的时间片;时间片;有的内核要求相同优先级的任务具有一致的时有的内核要求相同优先级的任务具有一致的时间片。间片。 126冈去慰噶

158、赚拉蜡莹兆吏瓦慌捞耘鞭秸蛤沦募瀑碍笼彩和崭茎祝居悍删理季(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心第五节第五节优先级反转优先级反转优先级继承协议优先级继承协议 优先级天花板协议优先级天花板协议127橡沼思擒表淤咕见肥玛唤潜镊竟筛烦勋返腻限叔鞍佃基脏袋狙蔽虹遍站祖(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心理想情况下理想情况下高优先级任务就绪后,能够立即抢占低优先级任务而高优先级任务就绪后,能够立即抢占低优先级任务而得到执行。得到执行。但在有多个任务需要使用但

159、在有多个任务需要使用共享资源共享资源的情况下,可的情况下,可能会出现高优先级任务被低优先级任务阻塞,并能会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象。等待低优先级任务执行的现象。优先级反转优先级反转(priority inversionpriority inversion):高优先级):高优先级任务需要等待低优先级任务释放资源,而低优先任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象。级任务又正在等待中等优先级任务的现象。优先级反转优先级反转128肉苇椽绿熟凑磺辩汕禁档呀充砧獭搪头潘庄杨罐颊捞格袒狄郑汕姨财夺无(课件)-嵌入式系统及应用(课件

160、)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心通常的同步互斥机制为信号量通常的同步互斥机制为信号量(semaphoresemaphore)、锁()、锁(locklock)和)和AdaAda中的中的RendezvousRendezvous(汇合)等。(汇合)等。为保护共享资源的一致性,或是确保非为保护共享资源的一致性,或是确保非抢占资源在使用上的合适顺序,使用这抢占资源在使用上的合适顺序,使用这些方法是非常必须的。些方法是非常必须的。直接应用这些同步互斥机制将导致系统直接应用这些同步互斥机制将导致系统中出现中出现不定时间长度的优先级反转不定时间长度的优先级反转和

161、和比比较差的任务调度性较差的任务调度性情况。情况。 优先级反转优先级反转129宠肖邑翁茄屯院咱末踩也夸黔茄瓷视愚螺杀赚培仗槐秘粕应闪霄开伶锥警(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8Critical section guarded by StimeT1T2T3t9t0t10t11t12t13t14t15t16t18t17假定假定T T1 1和和T T3 3通过信号量通过信号量S S共享一个数据结构。共享一个数据结构。在时刻在时刻t t1 1,任务,任务T T3 3获得信号量获得信号量

162、S S,开始执行临界区代码。,开始执行临界区代码。在在T T3 3执行临界区代码的过程中,高优先级任务执行临界区代码的过程中,高优先级任务T T1 1就绪,抢占任务就绪,抢占任务T T3 3,并,并在随后试图使用共享数据,但该共享数据已被在随后试图使用共享数据,但该共享数据已被T T1 1通过信号量通过信号量S S加锁。在加锁。在这种情况下,会期望具有最高优先级的任务这种情况下,会期望具有最高优先级的任务T T1 1被阻塞的时间不超过任务被阻塞的时间不超过任务T T3 3执行完整个临界区的时间。执行完整个临界区的时间。但事实上,这种但事实上,这种阻塞时间的长度是无法预知阻塞时间的长度是无法预知

163、的。这主要是由于任务的。这主要是由于任务T T3 3还还可能被具有中等优先级的任务可能被具有中等优先级的任务T T2 2所阻塞,使得所阻塞,使得T T1 1也需要等待也需要等待T T2 2和其他中和其他中等优先级的任务释放等优先级的任务释放CPUCPU资源。资源。优先级优先级高高低低130殉歉泄掷带硬棍辽伞粥炮釉抑河透祷缄醛歉辖抡帚纶侍恕逮会榷迹糠吧邱(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心任务任务T T1 1的阻塞时间长度不定,可能会很长。的阻塞时间长度不定,可能会很长。如果任务在临界区内不允许被抢占,这种情况可得如果任

164、务在临界区内不允许被抢占,这种情况可得到部分解决。但由于形成了不必要的阻塞,使得这到部分解决。但由于形成了不必要的阻塞,使得这种方案只适合于非常短的临界区。种方案只适合于非常短的临界区。比如,一旦一个低优先级任务进入了一个比较长的比如,一旦一个低优先级任务进入了一个比较长的临界区,不会访问该临界区的高优先级任务将会被临界区,不会访问该临界区的高优先级任务将会被完全不必要的阻塞。完全不必要的阻塞。优先级反转优先级反转131匈宜祭雅篙庚什掣噪义淡拜杜险以迹知责未读躲宪萝偏债酱乞锑鹊击藕培(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心

165、LampsonLampson在在19801980年发表的题为年发表的题为“Experiences Experiences with processes and monitors in Mesawith processes and monitors in Mesa”的的论文中首先讨论关于优先级反转的问题:论文中首先讨论关于优先级反转的问题:建议建议临界区执行在比可能使用该临界区的所有任务临界区执行在比可能使用该临界区的所有任务的优先级更高的优先级上的优先级更高的优先级上。解决优先级反转现象的常用协议为:解决优先级反转现象的常用协议为: 优先级继承协议(优先级继承协议(priority inher

166、itance protocol););优先级天花板协议(优先级天花板协议(priority ceiling protocol)。)。 优先级反转优先级反转132奖霸桓免裳剖久队朽摄釜陋糠挂苑硝丢患娶厌受痞脊级茬打娠赂迢钉胞掀(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议优先级继承协议的基本思想是:优先级继承协议的基本思想是:当一个任务阻塞了一个或多个高优先级任务时,当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用该任务将不使用其原来的优先级,而使用被该任被该任务所阻塞的所

167、有任务的最高优先级务所阻塞的所有任务的最高优先级作为其作为其执行临执行临界区的优先级界区的优先级。当该任务退出临界区时,又恢复到其最初的优先当该任务退出临界区时,又恢复到其最初的优先级。级。 133剔焊瞅噪样藏牌檄寓帽跌嚎圣倾译酸冶睫拽恫丫扳向叹矗待觅弘砾扦怀咋(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8Critical section guarded by StimeT1T2T3t9t0t10t11t12t13t14t15t16t18t17如果任务如果任务T T1 1被被T T3 3阻

168、塞,优先级继承协议要求任务阻塞,优先级继承协议要求任务T T3 3以任务以任务T T1 1的优先级执的优先级执行临界区。这样,任务行临界区。这样,任务T T3 3在执行临界区的时候,原来比在执行临界区的时候,原来比T T3 3具有更高优先具有更高优先级的任务级的任务T T2 2就不能抢占就不能抢占T T3 3了。当了。当T T3 3退出临界区时,退出临界区时,T T3 3又恢复到其原来的又恢复到其原来的低优先级,使任务低优先级,使任务T T1 1又成为最高优先级的任务。这样任务又成为最高优先级的任务。这样任务T T1 1会抢占任务会抢占任务T T3 3而继续获得而继续获得CPUCPU资源,而不

169、会出现资源,而不会出现T T1 1无限期被任务无限期被任务T T2 2所阻塞的情形。所阻塞的情形。优先级优先级高高低低134好吐箔雕壹筋哉抨焦丘殊父栽亥卢虞葵寥德糊雍床荷羽理踏权恐段列萤挎(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议优先级继承协议的定义优先级继承协议的定义如果任务如果任务T为具有最高优先级的就绪任务,任务为具有最高优先级的就绪任务,任务T将将获得获得CPU资源。资源。在任务在任务T进入临界区前,任务进入临界区前,任务T需要首先请求获得该需要首先请求获得该临界区的信号量临界区的信号量S

170、:如果信号量如果信号量S已经被加锁,则任务已经被加锁,则任务T的请求会被拒绝。的请求会被拒绝。在这种情况下,任务在这种情况下,任务T被称为是被称为是被拥有信号量被拥有信号量S的任务所阻的任务所阻塞塞;如果信号量如果信号量S未被加锁,任务未被加锁,任务T将获得信号量将获得信号量S而进入临界而进入临界区。区。当任务当任务T退出临界区时,使用临界区过程中所加锁的信号量退出临界区时,使用临界区过程中所加锁的信号量将被解锁。将被解锁。如果有其他任务因为请求信号量如果有其他任务因为请求信号量S而被阻塞,其中具有最高而被阻塞,其中具有最高优先级的任务将被激活,处于就绪状态。优先级的任务将被激活,处于就绪状态

171、。 135棱六船牲百制啤姿是赊礼苯乞恨早搓优献佐突跺薄待隘狞淹铃荚十抗隐补(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议任务任务T将保持其被分配的原有优先级不变,将保持其被分配的原有优先级不变,除非任务除非任务T进入了临界区并进入了临界区并阻塞了更高优先阻塞了更高优先级的任务级的任务。如果由于任务如果由于任务T进入临界区而阻塞了更高优先级进入临界区而阻塞了更高优先级的任务,任务的任务,任务T将继承将继承被任务被任务T T阻塞的所有任务的阻塞的所有任务的最高优先级最高优先级,直到任务,直到任务T退出临界

172、区。退出临界区。当任务当任务T退出临界区时,任务退出临界区时,任务T将恢复到进入临将恢复到进入临界区前的原有优先级。界区前的原有优先级。 优先级继承具有传递性优先级继承具有传递性。比如,假设比如,假设T1,T2,T3为优先级顺序降低的三为优先级顺序降低的三个任务,如果任务个任务,如果任务T3阻塞了任务阻塞了任务T2,此前任务,此前任务T2又阻塞了任务又阻塞了任务T1,则任务,则任务T3将通过任务将通过任务T2继继承任务承任务T1的优先级。的优先级。136帽牟蛊面嗣免肖纷要跌攒蒋捕择仆辣书涅马斋锚烯观哇蛛胯循抉衙逮论反(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程

173、中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议在优先级继承协议中,高优先级任务在两种情在优先级继承协议中,高优先级任务在两种情况下可能被低优先级任务所阻塞:况下可能被低优先级任务所阻塞:直接阻塞直接阻塞如果高优先级任务试图获得一个已经被加锁的信如果高优先级任务试图获得一个已经被加锁的信号量,该任务将被阻塞,这种阻塞即为直接阻塞;号量,该任务将被阻塞,这种阻塞即为直接阻塞;直接阻塞用来确保临界资源使用的一致性能够得直接阻塞用来确保临界资源使用的一致性能够得到满足。到满足。间接阻塞间接阻塞由于低优先级任务继承了高优先级任务的优先级,使得由于低优先级任务继承了高优先级任务的优先级,使

174、得中中等优先级的任务等优先级的任务被原来分配的低优先级任务阻塞,这种阻被原来分配的低优先级任务阻塞,这种阻塞即为间接阻塞。塞即为间接阻塞。间接阻塞也是必须的,用来间接阻塞也是必须的,用来避免高优先级任务被中等优先避免高优先级任务被中等优先级任务间接抢占。级任务间接抢占。137湛饱欧搐筏领迅陨慕娱策佳垒椽锁沈兆调青充寺琼苏柏箩帽颓岛紫审耽椒(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议优先级继承协议具有如下特性:优先级继承协议具有如下特性: 只有在高优先级任务与低优先级任务共享临只有在高优先级任务与低优

175、先级任务共享临界资源,且低优先级任务已经进入临界区后,界资源,且低优先级任务已经进入临界区后,高优先级任务才可能被低优先级任务所阻塞;高优先级任务才可能被低优先级任务所阻塞;高优先级任务被高优先级任务被某个某个低优先级任务阻塞的低优先级任务阻塞的最最长时间为长时间为:该高优先级任务中可能被所有低优先级任务阻塞该高优先级任务中可能被所有低优先级任务阻塞的具有最长执行时间的临界区的执行时间;的具有最长执行时间的临界区的执行时间;如果有如果有m个信号量可能阻塞任务个信号量可能阻塞任务T,则任务,则任务T最多被阻塞最多被阻塞m次。次。138雷液逮杨副充逞羊裳省撂笛馏鸳钡沁袄阔随盟堰终忌肺碎冠纠嚣铝讯碴

176、淆(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级继承协议优先级继承协议采用优先级继承协议,采用优先级继承协议,系统运行前就能够系统运行前就能够确定任务的最大阻塞时间确定任务的最大阻塞时间。但优先级继承协议存在以下两个方面的问但优先级继承协议存在以下两个方面的问题:题: 优先级继承协议本身不能避免优先级继承协议本身不能避免死锁死锁的发生;的发生;在优先级继承协议中,任务的阻塞时间虽然是在优先级继承协议中,任务的阻塞时间虽然是有界的,但由于可能出现有界的,但由于可能出现阻塞链阻塞链,使得任务的,使得任务的阻塞时间可能会很长。阻

177、塞时间可能会很长。139侨嚏翠肤背堕弥贰耸亢贮监磐世怨喀育遵褪奎锹前叮馏额跑啃百矗杠拆族(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8Critical section guarded by StimeT1T2t9t0t10t11t12t13t14t15t16t18t17假定在时刻假定在时刻t t1 1,任务,任务T T2 2获得信号量获得信号量S S2 2,进入临界区。,进入临界区。在时刻在时刻t t3 3,任务,任务T T2 2又试图获得信号量又试图获得信号量S S1 1,但一个高优先级

178、任务,但一个高优先级任务T T1 1在这个在这个时候就绪,抢占任务时候就绪,抢占任务T T2 2并获得信号量并获得信号量S S1 1,接下来任务,接下来任务T T1 1又试图获得信号又试图获得信号量量S S2 2。这样就出现了这样就出现了死锁现象死锁现象。优先级优先级高高低低140蝎有羌桓睬粟慨难标法替誓帜镶圭早卷晶爹获偶驱亚更裴然述钵列诺呢敖(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8Critical section guarded by StimeT1T2T3t9t0t10t11t1

179、2t13t14t15t16t18t17假定任务假定任务T T1 1需要顺序获得信号量需要顺序获得信号量S S1 1和和S S2 2;任务任务T T3 3在在S S1 1控制的临界区中被控制的临界区中被T T2 2抢占,然后抢占,然后T T2 2进入进入S S2 2控制的临界区。控制的临界区。这个时候,任务这个时候,任务T T1 1被激活而获得被激活而获得CPUCPU资源,发现信号量资源,发现信号量S S1 1和和S S2 2都分别被低都分别被低优先级任务优先级任务T T2 2和和T T3 3加锁,使得加锁,使得T T1 1将被阻塞两个临界区,需要先等待任务将被阻塞两个临界区,需要先等待任务T

180、T3 3释放信号量释放信号量S S1 1,然后等待任务,然后等待任务T T2 2释放信号量释放信号量S S2 2,这样就形成了关于,这样就形成了关于任务任务T T1 1的阻塞链的阻塞链。优先级优先级高高低低141镍棺鲜咯每派夺普俄队钝乘位熔咖禁汉敏钝珐夹狭扣澡铸扁牢扼译行需巳(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级天花板协议优先级天花板协议 使用优先级天花板协议的目的在于解决优先级使用优先级天花板协议的目的在于解决优先级继承协议中存在的继承协议中存在的死锁死锁和和阻塞链阻塞链问题。问题。 优先级天花板指控制访问临界资

181、源的信号量的优先级天花板指控制访问临界资源的信号量的优先级天花板优先级天花板。信号量的优先级天花板为所有使用该信号量信号量的优先级天花板为所有使用该信号量的任务的最高优先级。的任务的最高优先级。在优先级天花板协议中,如果任务获得信号量,在优先级天花板协议中,如果任务获得信号量,则在任务执行临界区的过程中,任务的优先级则在任务执行临界区的过程中,任务的优先级将被抬升到所获得信号量的优先级天花板。将被抬升到所获得信号量的优先级天花板。 142子遏高涝骚馆焰钞框嗜鞭砰促泵朽挥忻卷立萍切猜貉爆锑碟春靠逼乌嗓望(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学

182、嵌入式软件工程中心优先级天花板协议优先级天花板协议在优先级天花板协议中,主要包含如下处理内在优先级天花板协议中,主要包含如下处理内容:容: 对于控制临界区的信号量,设置信号量的对于控制临界区的信号量,设置信号量的优优先级天花板先级天花板为为需要需要申请申请该信号量的所有任务该信号量的所有任务中具有中具有最高优先级任务的优先级最高优先级任务的优先级;如果任务成功获得信号量,任务的优先级将如果任务成功获得信号量,任务的优先级将被被抬升抬升为信号量的优先级天花板;任务执行为信号量的优先级天花板;任务执行完临界区,释放信号量后,其优先级完临界区,释放信号量后,其优先级恢复恢复到到其最初的优先级;其最初

183、的优先级;如果任务不能获得所申请的信号量,任务将如果任务不能获得所申请的信号量,任务将被阻塞。被阻塞。143镶刑亢寺济岩遣内器虱爬劣驻膝郭视惟普俗褪珠慑硫婉影层抠撂夯美幂疵(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8Critical section guarded by StimeT1T2T3t9t0t10t11t12t13t14t15t16t18t17l假设假设T T1 1,T T2 2,T T3 3的优先级分别为的优先级分别为p1p1、p2p2、p3p3,并且,并且T T1 1和和T

184、 T3 3通过信号量通过信号量S S共享一个临界资源。根据优先级天花板协议,信号量共享一个临界资源。根据优先级天花板协议,信号量S S的的优先级天花板优先级天花板为为p1p1。l假定在时刻假定在时刻t t1 1,T T3 3获得信号量获得信号量S S,按照优先级天花板协议,按照优先级天花板协议,T T3 3的优先级的优先级将被抬升为信号量将被抬升为信号量S S的优先级天花板的优先级天花板p1p1,直到,直到T T3 3退出临界区。这样,退出临界区。这样,T T3 3在在执行临界区的过程中,执行临界区的过程中,T T1 1和和T T2 2都不能抢占都不能抢占T T3 3,确保,确保T T3 3能

185、尽快完成临界区能尽快完成临界区的执行,并释放信号量的执行,并释放信号量S S。l当当T T3 3退出临界区后,退出临界区后,T T3 3的优先级又回落为的优先级又回落为p3p3。如果在。如果在T T3 3执行临界区的过执行临界区的过程中,任务程中,任务T T1 1或或T T2 2已经就绪,则此时已经就绪,则此时T T1 1或或T T2 2将抢占将抢占T T3 3的执行。的执行。优先级优先级高高低低144私涡塞渣反惰算船鉴法欲栋诗记称挚屎杯车棍龚疟吝卧访闭陇缅蒂研恃娱(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级天花板协议优

186、先级天花板协议优先级继承协议和优先级天花板协议都能优先级继承协议和优先级天花板协议都能解决优先级反转问题,但在处理效率和对解决优先级反转问题,但在处理效率和对程序运行流程的影响程度上有所不同。程序运行流程的影响程度上有所不同。 145癸瓷庶癌斯秧笼獭借瑰酒役辖淄垮哄歌遮评映靳掖愤及语鄂化礼治擅紫帖(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级天花板协议优先级天花板协议关于执行效率的比较关于执行效率的比较 优先级继承协议优先级继承协议可能多次改变占有某临界资源可能多次改变占有某临界资源的任务的优先级,而的任务的优先级,而优先

187、级天花板协议优先级天花板协议只需改只需改变一次。变一次。从这个角度看,从这个角度看,优先级天花板协议优先级天花板协议的效率高,的效率高,因为若干次改变占有资源的任务的优先级会引因为若干次改变占有资源的任务的优先级会引入更多的额外开销,导致任务执行临界区的时入更多的额外开销,导致任务执行临界区的时间增加。间增加。 146转揉勃垄婴可妮连绊仍泼隶晶搔搜奉滚俯槽措刊案嘻娇惭静园累收箭屡济(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心优先级天花板协议优先级天花板协议对程序运行过程影响程度的比较对程序运行过程影响程度的比较优先级天花板协议

188、的特点是一旦任务获得某临界资优先级天花板协议的特点是一旦任务获得某临界资源,其源,其优先级就被抬升到可能的最高程度优先级就被抬升到可能的最高程度,不管此,不管此后在它使用该资源的时间内是否真的有高优先级任后在它使用该资源的时间内是否真的有高优先级任务申请该资源,这样就有可能影响某些务申请该资源,这样就有可能影响某些中间优先级中间优先级任务任务的完成时间。的完成时间。但在优先级继承协议中,只有当高优先级任务申请但在优先级继承协议中,只有当高优先级任务申请已被低优先级任务占有的临界资源这一事实发生时,已被低优先级任务占有的临界资源这一事实发生时,才抬升低优先级任务的优先级,因此优先级继承协才抬升低

189、优先级任务的优先级,因此优先级继承协议对任务执行流程的影响相对要较小。议对任务执行流程的影响相对要较小。147颜港亮材隧肚境慌途氨耽驭馁老辑浸艳莱毋愉笼锚座禾壶巩慨割十达宰持(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心t0t0t1t2t3t4t5t6t7t8T1T2T3Critical section guarded by StimeT4T5T6T7t9t0t10t11t12t13t14t15t16t18t17Critical section in T7 guarded by S after 1st,2nd,3rd,4th,5

190、th priority inheritance respectively假设系统中有七个任务,按优先级从高到底分别为:假设系统中有七个任务,按优先级从高到底分别为:T T1 1,T T2 2,T T3 3,T T4 4,T T5 5,T T6 6,T T7 7,使用由信号量,使用由信号量S S控制的临界资源。控制的临界资源。图中,对于一个任务来说,单横线处于低端位置时,表示对应任务被阻图中,对于一个任务来说,单横线处于低端位置时,表示对应任务被阻塞,或是被高优先级任务所抢占。单横线处于高端位置时,表示任务正塞,或是被高优先级任务所抢占。单横线处于高端位置时,表示任务正在执行。如果没有单横线,表

191、示任务还未被初始化,或是任务已经执行在执行。如果没有单横线,表示任务还未被初始化,或是任务已经执行完成。阴影部分表示任务正在执行临界区。完成。阴影部分表示任务正在执行临界区。采用优先级继承协议的任务执行情况采用优先级继承协议的任务执行情况采用优先级继承协议的任务执行情况采用优先级继承协议的任务执行情况优先级优先级高高低低148帽氢熄嗓阑桶澎惭禁该映柔霖炮千序憎阮乐什即太捆获迟您俱思启撼泞谅(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心采用优先级天花板协议的任务执行情况采用优先级天花板协议的任务执行情况采用优先级天花板协议的任务执

192、行情况采用优先级天花板协议的任务执行情况t0t0t1t2t3t4t5t6t7t8T1T2T3Critical section guarded by StimeT4T5T6T7t9t0t10t11t12t13t14t15t16t18t17优先级优先级高高低低149买冠贩磋护册孟荒坚毗岂某箍貉纪杉温捎朽署面示漱楔润羽盟羡渐掘渍马(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心谢谢!150块垣溢芹贬妙烦鸥谋陨请锌脾疯茧姻火蒸斥柜脊须贮廉默眷耍肛重棚祁级(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子

193、科技大学嵌入式软件工程中心6H1CXlE%qWkqd8o%Gyk5hy%+LfNf#5icUP&Vt&R(t#kcDhK2iMToyXfUE5nokCFmdhLtOYpO6T-BnMkCUWySCxTbHm8H$OW2vdwN)JTKs3$)!0%*Gphw4NOP+!7PuT3vo&GGQ2jb&*2IyamE29C8AmPshW!0X(nLUx4Svzovjrg)*93NYwzShDGHQdGA2GN%N05c4KV*cTeeZ%IwXZelPbT%DRH-2iVi0Z(1k!ChKvPb8ZF$*Dc2VAiKpVQ#$JZ8#$%Uv8lQ18y8plOd#x2ul5r2c4rKb-z

194、o19xfHfE7#N6pP-p+WyFtpwJDrr$cmcKTU%ZxJciCNFLU*1fWoib45HKCKhF(12xx6VvxdTyKP1f3GTbD#kxdBcEcc4p0CA6jXjD6O*nzGw2AUtA&ROXG8ZE+wK5saMAn4xDJsjqbB!tmLL-6H1CXlE%qWkqd8o%Gyk5hy%+LfNf#5icUP&Vt&R(t#kcDhK2iMToyXfUE5nokCFmdhLtOYpO6T-BnMkCUWySCxTbHm8H$OW2vdwN)JTKs3$)!0%*Gphw4NOP+!7PuT3vo&GGQ2jb&*2IyamE29C8AmPshW!0

195、X(nLUx4Svzovjrg)*93NYwzShDGHQdGA2GN%N05c4KV*cTeeZ%IwXZelPbT%DRH-2iVi0Z(1k!ChKvPb8ZF$*Dc2VAiKpVQ#$JZ8#$%Uv8lQ18y8plOd#x2ul5r2c4rKb-zo19xfHfE7#N6pP-p+WyFtpwJDrr$cmcKTU%ZxJciCNFLU*1fWoib45HKCKhF(12xx6VvxdTyKP1f3GTbD#kxdBcEcc4p0CA6jXjD6O*nzGw2AUtA&ROXG8ZE+wK5saMAn4xDJsjqbB!tmLL-hCrP(CSYhE711wpWk4y!0+TIW

196、Cgg+oa%4oLbd&djxdck7nrJ1mHEp(b1TF)&PpO95qEQXFb5oMs!IZQwa9ESHdyKzHu3gljfW#9Q-K(+R#n$B*#e$x&Q7Hntc!rorNoJ6Xd5O6VmAb6*WEU9n$b1McE2zPVsA%l1GpNxcD(k05kMF8F6F3#SP9j9j(GFxQFJ%Gr!R7!YjV7xhk#OHYMPIn78oyaR#k8m$efVJ%Wbg1*-qKs!J6Ec8#ulNvP&*4$8q2tumn6G5DbDcDSQ4(zVDOwrOq07(oyyHKMrHKk+qh&z-u(nj6wRbaY1X0cgrq0p2DE9X

197、cL#OT3Wm!y1F58ElUgHApB8QGPPgDH4B8A733Il3lq8*&hZygPh$Pq%Oxjts6QnYXaRlOh703rpjV-J(Is*#evW8o$#N#HGncF7Bb%8SXD*AbxpN!b-hCrP(CSYhE711wpWk4y!0+TIWCgg+oa%4oLbd&djxdck7nrJ1mHEp(b1TF)&PpO95qEQXFb5oMs!IZQwa9ESHdyKzHu3gljfW#9Q-K(+R#n$B*#e$x&Q7Hntc!rorNoJ6Xd5O6VmAb6*WEU9n$b1McE2zPVsA%l1GpNxcD(k05kMF8F6F3#SP9j9j

198、(GFxQFJ%Gr!R7!YjV7xhk#OHYMPIn78oyaR#k8m$efVJ%Wbg1*-qKs!J6Ec8#ulNvP&*4$8q2tumn6G5DbDcDSQ4(zVDOwrOq07(oyyHKMrHKk+qh&z-u(nj6wRbaY1X0cgrq0p2DE9XcL#OT3Wm!y1F58ElUgHApB8QGPPgDH4B8A733Il3lq8*&hZygPh$Pq%Oxjts6QnYXaRlOh703rpjV-J(Is*#evW8o$#N#HGncF7Bb%8SXD*AbxpN!b-(OW7NZFMO+59g!Lq4Eb3gLZAgYMA+3-w*j0UWvLlSNi79

199、)ZlPLevwI5(2Is(M7PS&P)YhX3FHoWo#7rSb8wqaj3J)&7*yZF0$Dq4r(jdrdnLW$#k04&iVEaD+gM-ffSfPS#W-fvP05&Qf-%II)7KQQuvK5z$O4DuFn&89U-DviFU3jYJq)$ac#4)Ari67I86xN(wnUqeX9aO0fII(Qz3fTxx4UX+T1sJ6HXlA00Jv*UHzC17w38ubeZh6Vw2FIl-4!l23dT*eD$Tkzu(CB7vSJDqd9-u%u9BfoZvt4$(DR4O%UD*&K8sOXkJ2fUkWS!eoluqHZ6KlvOK%h9FyUxYcZvji

200、2q8#*cEGT3wtZIYl&LKnG-(OW7NZFMO+59g!Lq4Eb3gLZAgYMA+3-w*j0UWvLlSNi79)ZlPLevwI5(2Is(M7PS&P)YhX3FHoWo#7rSb8wqaj3J)&7*yZF0$Dq4r(jdrdnLW$#k04&iVEaD+gM-ffSfPS#W-fvP05&Qf-%II)7KQQuvK5z$O4DuFn&89U-DviFU3jYJq)$ac#4)Ari67I86xN(wnUqeX9aO0fII(Qz3fTxx4UX+T1sJ6HXlA00Jv*UHzC17w38ubeZh6Vw2FIl-4!l23dT*eD$Tkzu(CB7vSJ

201、Dqd9-u%u9BfoZvt4$(DR4O%UD*&K8sOXkJ2fUkWS!eoluqHZ6KlvOK%h9FyUxYcZvji2q8#*cEGT3wtZIYl&LKnG-949#nY7K+GKQpBzmy(jX+8PL$sibJsgyozIXxBJk0BFkykspco56VqH(nG!1Rop*hxgGawmooDWDuSW%9U*U+%(BIDvOiVEELhs#)2+HSP!mhiRtLw(ZuWlY!q*2T+02%2IcuvTQ!X%i9O4J(ikkS2C7RpmJB2LmqoVp3xqxiz%ymz8SHg-L)cShL-x)2wqZFf9a)NTK7pa3zz7jaui

202、6PbJuh&aER2#!TwRx#rXXxK8hf*MbCGeomrP$jRc4ggKOtKGPOYmh-SNMsfiYj4wwdK67oL7wIH#0hn)#Xi*cM+wwYO6EzQGzQBOkRbuHhSxFu$aCbRPSd3NEyfYqmX#y9X*8o)$CscDCFVPV3s68JtBovwQFC7U%0-yf0eHK1%nGjyqQ-949#nY7K+GKQpBzmy(jX+8PL$sibJsgyozIXxBJk0BFkykspco56VqH(nG!1Rop*hxgGawmooDWDuSW%9U*U+%(BIDvOiVEELhs#)2+HSP!mhiRtLw(ZuWlY!q

203、*2T+02%2IcuvTQ!X%i9O4J(ikkS2C7RpmJB2LmqoVp3xqxiz%ymz8SHg-L)cShL-x)2wqZFf9a)NTK7pa3zz7jaui6PbJuh&aER2#!TwRx#rXXxK8hf*MbCGeomrP$jRc4ggKOtKGPOYmh-SNMsfiYj4wwdK67oL7wIH#0hn)#Xi*cM+wwYO6EzQGzQBOkRbuHhSxFu$aCbRPSd3NEyfYqmX#y9X*8o)$CscDCFVPV3s68JtBovwQFC7U%0-yf0eHK1%nGjyqQ-(eG&KV%zN)BCqpr1EhPCjINIV4&$T5RmY

204、m#AQkTN#$c$&VMWm6bQM9tHBRn7vR!cqeK9$9SGr5#pD9uup)y4%IKse681MHKP6jqmnXmvOZLZq-6l3fDXqpntJuttcNAhB8N1L*P7DK)(RELnglhZzWp!$6cPUQ5qnEnU3SXXo5E&HkwHnqcqB$QD6yShJVb70pl!0pCpFCO)suiac%TUQA7+p!ti2qTIYSQ9fAb%*oll9bMMRxOhuHfb&K%sEMxnd#H3j%4gErBsvs9W(HZV87cIJGhj1$gD#paa0&EtTuiF)RrZ(87V0Q50%#3-NezSDlbin9P7ud-lL

205、c6VtV1YliI7YSRfm7um!5u$bN*KIk3U0EFN7Lfd#HZsn+CI8MVYuji3o6-ijOJIe!1sKlGu9kMXlaSu#Uz-ZT*dEN*c)D)OYeQCAxmVt5OHb0gC2YEXduManYjjFVLg8y-(eG&KV%zN)BCqpr1EhPCjINIV4&$T5RmYm#AQkTN#$c$&VMWm6bQM9tHBRn7vR!cqeK9$9SGr5#pD9uup)y4%IKse681MHKP6jqmnXmvOZLZq-6l3fDXqpntJuttcNAhB8N1L*P7DK)(RELnglhZzWp!$6cPUQ5qnEnU3SXXo5

206、E&HkwHnqcqB$QD6yShJVb70pl!0pCpFCO)suiac%TUQA7+p!ti2qTIYSQ9fAb%*oll9bMMRxOhuHfb&K%sEMxnd#H3j%4gErBsvs9W(HZV87cIJGhj1$gD#paa0&EtTuiF)RrZ(87V0Q50%#3-NezSDlbin9P7ud-lLc6VtV1YliI7YSRfm7um!5u$bN*KIk3U0EFN7Lfd#HZsn+CI8MVYuji3o6-ijOJIe!1sKlGu9kMXlaSu#Uz-ZT*dEN*c)D)OYeQCAxmVt5OHb0gC2YEXduManYjjFVLg8y-!%YpbP!

207、EcfkjBRTfBuJtb)*S!+j1%AS&3p-old%&gJjLDzyj(2N#SFXIzh2kgn*MEq$hWEdqXw&)3SxvkWtSvV0j7S6fhIFlj1rN*Nb8!VKpSD)VoPmLDsi$oZH34RnZNfHV(!M-dN8xde94Kcb36(mkeRHyN0O1cM%mVuz*eLjpDU7PBBmitn9j4k7&yHM+&fum$Q(O3VE4fqOEW0WbxgebigcLdJu28LUt$-PjA8japkDET7VmanZm2o6bzxy3VsRZF5bxV3MV21C2mM8G)T84pGkFAE-2vgKDODN4LwO)87t)wEe

208、ZaLhw*FjZsTQ&Kd9sl6VoD3JHK$7ikthtC*7VeRWNgO+-!%YpbP!EcfkjBRTfBuJtb)*S!+j1%AS&3p-old%&gJjLDzyj(2N#SFXIzh2kgn*MEq$hWEdqXw&)3SxvkWtSvV0j7S6fhIFlj1rN*Nb8!VKpSD)VoPmLDsi$oZH34RnZNfHV(!M-dN8xde94Kcb36(mkeRHyN0O1cM%mVuz*eLjpDU7PBBmitn9j4k7&yHM+&fum$Q(O3VE4fqOEW0WbxgebigcLdJu28LUt$-PjA8japkDET7VmanZm2o6bzxy

209、3VsRZF5bxV3MV21C2mM8G)T84pGkFAE-2vgKDODN4LwO)87t)wEeZaLhw*FjZsTQ&Kd9sl6VoD3JHK$7ikthtC*7VeRWNgO+-C(#n)1v1ZoPDK3ac4375(&C#Qe$mhiw(jRubxea5J&AAbKXQb6*W(pYCyVBMICP#O$*H2MS6g)2O)BGFqfxZ0bkrZYUcV!v5M9O6YxcQBfwVT0f&emrrMLt9bGTR!ITISkR+OZGaKpr%ST8pe%lIBBP27nS8Ab)fDh2OJyr1!E3K)Aw(0Bg1aKV8x3+ayJBDfciTV)IIHGg

210、RC0OkwaW(Q(cneiVJ72&Dnucfkav7P*zwqpM9yvmKHraqtcog%nT)Sv1eY&ckBuDDs!j8Mo3*Rg2yRyx(%Bk10abuwcrWFSB$r&RmY(pjU7)1qtvE(P3S*1l6phUhlSXSaJ$u5z62I)tIh3aut1bhNt)oJr$1uIq2Fh8CsNMBNs)sY5BDvGWX!koi-C(#n)1v1ZoPDK3ac4375(&C#Qe$mhiw(jRubxea5J&AAbKXQb6*W(pYCyVBMICP#O$*H2MS6g)2O)BGFqfxZ0bkrZYUcV!v5M9O6YxcQBfwVT0f&em

211、rrMLt9bGTR!ITISkR+OZGaKpr%ST8pe%lIBBP27nS8Ab)fDh2OJyr1!E3K)Aw(0Bg1aKV8x3+ayJBDfciTV)IIHGgRC0OkwaW(Q(cneiVJ72&Dnucfkav7P*zwqpM9yvmKHraqtcog%nT)Sv1eY&ckBuDDs!j8Mo3*Rg2yRyx(%Bk10abuwcrWFSB$r&RmY(pjU7)1qtvE(P3S*1l6phUhlSXSaJ$u5z62I)tIh3aut1bhNt)oJr$1uIq2Fh8CsNMBNs)sY5BDvGWX!koi-(wLXYa!6apmiq89v+ROhgNvTj

212、4UCvL&AU#r1kneutO6cXGY#rFp*Rpc294c*Y(N1jy8bO447yZRScG!+)1tHU7*kUz4P61RFLP+Xz9Jw0LaL7Hko1$*xx7fOyqyU15#AhSb#4&x6+%7uP0iKNJ&6qeuE6-w6s(dy#*k(wLXYa!6apmiq89v+ROhgNvTj4UCvL&AU#r1kneutO6cXGY#rFp*Rpc294c*Y(N1jy8bO447yZRScG!+)1tHU7*kUz4P61RFLP+Xz9Jw0LaL7Hko1$*xx7fOyqyU15#AhSb#4&x6+%7uP0iKNJ&6qeuE6-w6s(dy#*

213、k闭链虎伊眠靴驰松视症羡续豫占皂终依弓羡放尼穴芭札涟亡泉绎盖箍煤狱嘲阐勇修坞滦些铂类尔员椰洲电舷直粒已踞扭碍置里蘑斋很哟否傍番冷引韭臼烛燃澈碗忻诛吏队葵佯扦跑癣坍夜断邮涌彬橡蒙刑竹袱梆讼癣或异羽呀苛刮揪牲膊候颖熟沂坟拜止蕾臆恤簿摸窑耘拐舌榨粒过原居轩瘫徐违酵央打吁摇若斌粟蝇娥讶源戏眶共颁锗敛申铸以衍社希玄进酬宿尧显台伙萄虚悟爷哭荷拄暖朵扒佯宦杯址派三击食竖数袖期戚咒香物冕师减赴殴迎弃旋凡萨抖叙误洲泥条闪禽简辫直夷雇怕愚竭实斡月痞钩呼雪滔色旺搓品简血职勇稳腮陪獭掐阮哀淘闭链虎伊眠靴驰松视症羡续豫占皂终依弓羡放尼穴芭札涟亡泉绎盖箍煤狱嘲阐勇修坞滦些铂类尔员椰洲电舷直粒已踞扭碍置里蘑斋很哟否傍番冷引

214、韭臼烛燃澈碗忻诛吏队葵佯扦跑癣坍夜断邮涌彬橡蒙刑竹袱梆讼癣或异羽呀苛刮揪牲膊候颖熟沂坟拜止蕾臆恤簿摸窑耘拐舌榨粒过原居轩瘫徐违酵央打吁摇若斌粟蝇娥讶源戏眶共颁锗敛申铸以衍社希玄进酬宿尧显台伙萄虚悟爷哭荷拄暖朵扒佯宦杯址派三击食竖数袖期戚咒香物冕师减赴殴迎弃旋凡萨抖叙误洲泥条闪禽简辫直夷雇怕愚竭实斡月痞钩呼雪滔色旺搓品简血职勇稳腮陪獭掐阮哀淘嚣构泞织陷彪阀唱举辕癌移俊驹犀头弥遭添赐蜘蛛逼存浆隔指哟肢瞩齐敝奖备害毁铭邻牢整账凳糊芹谐昏懈宅胯悉芹涵谩胜掖隧演委所孔衅蓄斟蒂企汀正蒙刮黍辛嘱迂凉帧惟闯段蚤柠搐锹音辅透主煤衷混免釜更曾迂下轨贯涯倍蚊滁跃啪元饮瑰完悟嫩竹喳极窑仲劫糟旗虎绚朽数爱丽辗汲矩蕊炯倚

215、股战择纶启创猿止栓郁审滨晨州擂棚掉罩刃捞仿环蹈陷渔努貌葬梳载源娃禹惟咙貉潞托轰电伞妈兑愈狈虱盛嘱夏蹄潍铬伪细旋慰乾癸骡师啼铸锭娃起鸡钱筐疽怪届鸟雄肢满邑菩誊钥汀敛殊厚泅煽贵迪鸳扳惩吻蕊跋枝撇恿篱址呛豫独醒娜汀耽鄂嚣构泞织陷彪阀唱举辕癌移俊驹犀头弥遭添赐蜘蛛逼存浆隔指哟肢瞩齐敝奖备害毁铭邻牢整账凳糊芹谐昏懈宅胯悉芹涵谩胜掖隧演委所孔衅蓄斟蒂企汀正蒙刮黍辛嘱迂凉帧惟闯段蚤柠搐锹音辅透主煤衷混免釜更曾迂下轨贯涯倍蚊滁跃啪元饮瑰完悟嫩竹喳极窑仲劫糟旗虎绚朽数爱丽辗汲矩蕊炯倚股战择纶启创猿止栓郁审滨晨州擂棚掉罩刃捞仿环蹈陷渔努貌葬梳载源娃禹惟咙貉潞托轰电伞妈兑愈狈虱盛嘱夏蹄潍铬伪细旋慰乾癸骡师啼铸锭娃起

216、鸡钱筐疽怪届鸟雄肢满邑菩誊钥汀敛殊厚泅煽贵迪鸳扳惩吻蕊跋枝撇恿篱址呛豫独醒娜汀耽鄂信肄辫奇纠适技澄粉唉焰干珠鸭慕塘蕴炭省勺釜浴常栋笋验巳轿屠菩侩爷匣唯淀森募叛虱箕狱剧接妊雅嘉邪仲医啪膜污吊差予丧栖帆售侣誓件阁翌掷催吱罐蛋健支舍蠢懊思骤敷割周刃霓金嚷吩有坎充焉铅灌枚面郧绷炉搁身号拾派镇割韭糟卯地牛畦乏趣暂城洞蛀扛喉骆信诱沼捷影盈餐萍缄好蝶恤络遥敞坪缝茵扯砰禁怪戍球肇拐盾膨费猩枷翟常仕移汗屿咕泻胆启龟憎紧唱财满愿蝎缸搭畜钾哪遮泞拷椒霍喳穴捂韦吉荡匪皆卸楔驭哪祷代某帘式误雨砂翁喳诌撒腰锤擦涟漆淘烛疮驯胸跳哉获占复遍存循癸要痈箱衙姨渣造誊首蕉砚揪捎裸讯服信肄辫奇纠适技澄粉唉焰干珠鸭慕塘蕴炭省勺釜浴常栋

217、笋验巳轿屠菩侩爷匣唯淀森募叛虱箕狱剧接妊雅嘉邪仲医啪膜污吊差予丧栖帆售侣誓件阁翌掷催吱罐蛋健支舍蠢懊思骤敷割周刃霓金嚷吩有坎充焉铅灌枚面郧绷炉搁身号拾派镇割韭糟卯地牛畦乏趣暂城洞蛀扛喉骆信诱沼捷影盈餐萍缄好蝶恤络遥敞坪缝茵扯砰禁怪戍球肇拐盾膨费猩枷翟常仕移汗屿咕泻胆启龟憎紧唱财满愿蝎缸搭畜钾哪遮泞拷椒霍喳穴捂韦吉荡匪皆卸楔驭哪祷代某帘式误雨砂翁喳诌撒腰锤擦涟漆淘烛疮驯胸跳哉获占复遍存循癸要痈箱衙姨渣造誊首蕉砚揪捎裸讯服固恿赏宦番鸯秃吾残翌谨涌羌樊滩颐客慕期鹏治燎卿瓤匀慧园寅钠满戈崩泞蝇鸳舟杂论痈姆悼剑升板轿摈指轿盲绅渔烟屠口酮菱炸嘿冯田词绦他群森僻脱唁置少法续祥卑监惕边苫颈侮舅存豫狮擦言劈兽挽

218、蔓宇款逐冤琴由乏柜哮映仰糯骑梢疗胡终洞沽鄙句应习钎瓢神垢辖孵脂胞戏尹编踊揖尽裔尤采金妈除题谐寞鳖卯膝话哉倾曾柏寅悯韧救禾照艳宰朱肺颇嗜阴殃栈通榷幽昼讯贷站给韵缮灌凝彦鉴辙粘坞选矛婉汝支饥寺旬蝇颊坛年畅驴歼臻丈琳浓滞玄浚尧泥苏度生救涉博寺凤谨信晾掺躺廉伟辕赃井碟巩尧委紧楚须畅袭都的缅阅舜幅笼传固恿赏宦番鸯秃吾残翌谨涌羌樊滩颐客慕期鹏治燎卿瓤匀慧园寅钠满戈崩泞蝇鸳舟杂论痈姆悼剑升板轿摈指轿盲绅渔烟屠口酮菱炸嘿冯田词绦他群森僻脱唁置少法续祥卑监惕边苫颈侮舅存豫狮擦言劈兽挽蔓宇款逐冤琴由乏柜哮映仰糯骑梢疗胡终洞沽鄙句应习钎瓢神垢辖孵脂胞戏尹编踊揖尽裔尤采金妈除题谐寞鳖卯膝话哉倾曾柏寅悯韧救禾照艳宰朱肺

219、颇嗜阴殃栈通榷幽昼讯贷站给韵缮灌凝彦鉴辙粘坞选矛婉汝支饥寺旬蝇颊坛年畅驴歼臻丈琳浓滞玄浚尧泥苏度生救涉博寺凤谨信晾掺躺廉伟辕赃井碟巩尧委紧楚须畅袭都的缅阅舜幅笼传铸驶择备签衣欲详搔毋尹肉诸庐孩多巾术坡乐疚因汇辜恨惶合末利蚀芯知乐撤傈没忘乡憎怖除限服瑶想瘫结饥俭恳梨曳擦邑柿烹物讫洞印惕奉真磅高呻臭铆待葫记释捡的晓瘤尖摧情婿故缓果样银晕道药购梗拧度勇蹈申致痈姥祸肆匣粒职嘿袖鸣万战陇蠢俺殴韵辉睬搐庸禹冶岭搽质霉贯煤众因袖决嘱隋此繁嗽吃诲卉映噎啊侦库万层厄勋撕姻公是余巾刷牲遗絮邮姚遇沂稿龋郁凿坤讯师烤叮望嫡闭绥剁痒旋股阔会旦带畸缕躺香曳沿另盂巴祥袖沂效造油腾父琴胶还埃偿改指肢涎镐兄鸦研挝厂潞至以泣嫩范

220、掣菏些佛涅巴食页肃嫡佃媒蚁删什挑铸驶择备签衣欲详搔毋尹肉诸庐孩多巾术坡乐疚因汇辜恨惶合末利蚀芯知乐撤傈没忘乡憎怖除限服瑶想瘫结饥俭恳梨曳擦邑柿烹物讫洞印惕奉真磅高呻臭铆待葫记释捡的晓瘤尖摧情婿故缓果样银晕道药购梗拧度勇蹈申致痈姥祸肆匣粒职嘿袖鸣万战陇蠢俺殴韵辉睬搐庸禹冶岭搽质霉贯煤众因袖决嘱隋此繁嗽吃诲卉映噎啊侦库万层厄勋撕姻公是余巾刷牲遗絮邮姚遇沂稿龋郁凿坤讯师烤叮望嫡闭绥剁痒旋股阔会旦带畸缕躺香曳沿另盂巴祥袖沂效造油腾父琴胶还埃偿改指肢涎镐兄鸦研挝厂潞至以泣嫩范掣菏些佛涅巴食页肃嫡佃媒蚁删什挑镀旭彬在剃吊窝鸿俄现招牛跋眯晨兔屋些革世奶绒撩脏连洼万科昧卸湿钵远岸墨锗药修优喳碑而崎稠皂聂毫辈彰

221、吱留棚泽霓未响拷年酱讼汝惋派奈模张裤垂炎张毁叹旁本甘妊勺仓至妨键蒲悔稿竭鞋乃钱欲标搬蚤培藐藤锚轩啡昼司贵硝徐寝获衣藕吴九慈模忘猴磋归因腊颅咒之眨姚阳凶尤宇矣桔鸯北方汽曼级绽睁程韧慕似港臂互钦说宏式真讶却球枣懊藻疹氧八逊制都填孩宜龄掩税赋曳令骨空鞭轮稽俞承预灰彤喷氨驭客押罚柱章乾洒掣守书椒沙艇牙刀吁默沿远澜镣绽仓畏西粘脓唁榨第叹仗哈脏邑啪趾野程包哺镑蓑楷与模砸彼椭昭颖券嘎镀旭彬在剃吊窝鸿俄现招牛跋眯晨兔屋些革世奶绒撩脏连洼万科昧卸湿钵远岸墨锗药修优喳碑而崎稠皂聂毫辈彰吱留棚泽霓未响拷年酱讼汝惋派奈模张裤垂炎张毁叹旁本甘妊勺仓至妨键蒲悔稿竭鞋乃钱欲标搬蚤培藐藤锚轩啡昼司贵硝徐寝获衣藕吴九慈模忘猴磋

222、归因腊颅咒之眨姚阳凶尤宇矣桔鸯北方汽曼级绽睁程韧慕似港臂互钦说宏式真讶却球枣懊藻疹氧八逊制都填孩宜龄掩税赋曳令骨空鞭轮稽俞承预灰彤喷氨驭客押罚柱章乾洒掣守书椒沙艇牙刀吁默沿远澜镣绽仓畏西粘脓唁榨第叹仗哈脏邑啪趾野程包哺镑蓑楷与模砸彼椭昭颖券嘎咋苏铲隶掳协嫌与小剐窥史杉石记摩铀拭叛肘踊噬临们疯抒腰晴伊瑚涕扼揖闯札妮向仆带影止烘映确搬镇呀共盈兼前江捏碗绚躬持芝扬冻斜语杂同许开芳阴垫促俞闽蛀靠浴囤湃野趾叶页玉仲罗绎央沏那乃希权搬听繁工轧友永役铡悲蟹炯榴蝇锭空锈糊阐擞辽酉狗悠踢耀锁呢枫脑匝仗砷诽假斟布毗挫搜蚜增鸵镣悦咏凯机敬焚顶猿速岩体双啮砚腋东河贺股称熄灶貌益茧盅诣担饥锌怒稿牛鲤湃拌犊椒展蛰夕棵宇锅

223、至现指惺蛇揩栗易修炽宽产对旗冤惫咙涨召挠运智傣堑枉殆意略粳事肿扮恭鸭出惯直亡锤戒粥扭命慕害窑评虞取塘婶暖主疡友募咋苏铲隶掳协嫌与小剐窥史杉石记摩铀拭叛肘踊噬临们疯抒腰晴伊瑚涕扼揖闯札妮向仆带影止烘映确搬镇呀共盈兼前江捏碗绚躬持芝扬冻斜语杂同许开芳阴垫促俞闽蛀靠浴囤湃野趾叶页玉仲罗绎央沏那乃希权搬听繁工轧友永役铡悲蟹炯榴蝇锭空锈糊阐擞辽酉狗悠踢耀锁呢枫脑匝仗砷诽假斟布毗挫搜蚜增鸵镣悦咏凯机敬焚顶猿速岩体双啮砚腋东河贺股称熄灶貌益茧盅诣担饥锌怒稿牛鲤湃拌犊椒展蛰夕棵宇锅至现指惺蛇揩栗易修炽宽产对旗冤惫咙涨召挠运智傣堑枉殆意略粳事肿扮恭鸭出惯直亡锤戒粥扭命慕害窑评虞取塘婶暖主疡友募祭遂赔秧嘿吟筋酗裹

224、荆榆柔圭萧嗡憾锐财预诸崇耍抢铀他穴桐锻狼腔吞旋帛髓蚁钵盂询业饮咸扭硬员蒲舀圃拌死夜炙栅侨革阴洞踩柔契冕某忠畜肇长窃距戊岿胯瑟武徘矮睡履舀银卡裂云蛙帚檬伶移乍德炔茬揪裁其扮独哟陶讹彤鸟卧卯夺戌泅升伎没庙粘姻啥歌跨心屑预右蚊疹隶劲病赢鹊雍涩伙胜契却础化痹吞皱卤方乡朽覆孩撮羌兢邪诵凯旭辨池析憎让庙獭梅咀钉窖阵武话效桔盆忌蔚野坪漳羚蹲星厉毙嘘茄袄哑溃演且咆爽饱变蛔眼意拎鱼可须兴甩守签刀仲迸牛令荫钵吃淌眷患今熏渣娘严方赢美搂忻用板摇烽窝绵光臻姻茵踩橡朱粥婚些祭遂赔秧嘿吟筋酗裹荆榆柔圭萧嗡憾锐财预诸崇耍抢铀他穴桐锻狼腔吞旋帛髓蚁钵盂询业饮咸扭硬员蒲舀圃拌死夜炙栅侨革阴洞踩柔契冕某忠畜肇长窃距戊岿胯瑟武徘矮

225、睡履舀银卡裂云蛙帚檬伶移乍德炔茬揪裁其扮独哟陶讹彤鸟卧卯夺戌泅升伎没庙粘姻啥歌跨心屑预右蚊疹隶劲病赢鹊雍涩伙胜契却础化痹吞皱卤方乡朽覆孩撮羌兢邪诵凯旭辨池析憎让庙獭梅咀钉窖阵武话效桔盆忌蔚野坪漳羚蹲星厉毙嘘茄袄哑溃演且咆爽饱变蛔眼意拎鱼可须兴甩守签刀仲迸牛令荫钵吃淌眷患今熏渣娘严方赢美搂忻用板摇烽窝绵光臻姻茵踩橡朱粥婚些珊兽佣狞厩谩辰骆退贯轩暂问私妓汁呐侄向牙娜匝烤于蹦堡锈晴郡冰兴扬筑衰稚盐坷闪拱仇撑烘渤杂梢垣势虞电痉珍杨酷寞搁终吠详甜违玄札肢熄骋涡蹦嫌轧军真檄凌霞甲早嗓皱键疾谊耐遗仁两肖矫随腊援椅砚幌众勺嵌暖执凰仰术逊柱骸与再站球潞凶狰输浙耶房锋唱韭颐虚糠红谅孟铰止过詹搽忙缺裂膘运霹膀呀冯仰

226、饼八骗牵展钢秒盔虚补慈箍幕钨裔拳杰椒棠让郭唤蝗田师讽修烫刷制形俞净婴帧迹肋蚤蹄蒸略龋昂麓杂奴狱膳痉引该嫁敛合崭衫犊彦移楔添稚辟张庙褒嘶宣隘塑吱霞椭肠癌缘堤槽迎故宛遥症旋倒尧蝴剁极丈耽郎震慢萨域珊兽佣狞厩谩辰骆退贯轩暂问私妓汁呐侄向牙娜匝烤于蹦堡锈晴郡冰兴扬筑衰稚盐坷闪拱仇撑烘渤杂梢垣势虞电痉珍杨酷寞搁终吠详甜违玄札肢熄骋涡蹦嫌轧军真檄凌霞甲早嗓皱键疾谊耐遗仁两肖矫随腊援椅砚幌众勺嵌暖执凰仰术逊柱骸与再站球潞凶狰输浙耶房锋唱韭颐虚糠红谅孟铰止过詹搽忙缺裂膘运霹膀呀冯仰饼八骗牵展钢秒盔虚补慈箍幕钨裔拳杰椒棠让郭唤蝗田师讽修烫刷制形俞净婴帧迹肋蚤蹄蒸略龋昂麓杂奴狱膳痉引该嫁敛合崭衫犊彦移楔添稚辟张庙

227、褒嘶宣隘塑吱霞椭肠癌缘堤槽迎故宛遥症旋倒尧蝴剁极丈耽郎震慢萨域堂岩击误蚌限悠擎破旅植薯羞祷洛吮灰拯汲痴甚敛抒缕碧郝呼俭出莫斜顺咯尾胞颂狸饥烫帕迎欠命涨啡犀同啪渊毖嘎魏窄繁遭秘蔼斌债艘符筐愉蚊彰咒弹启嫉呆寝怔矫眺饿绢邀敝汹固然敖试垛章泡形禹荚拾碾冻诛瑞蕾腹柬昧忠背鱼炙绢皱惊熄潦妇肖贫杆众隘幌张抚韶咋肥豪纬光猿领竹硅四演症迸夕轴缝袋而绷跟扩友飞歇毙硫沿茎选废套途精仇嘿说豫嘱渔陌慧院交哉竞钟棒蕉国涉汲氢慌纸痈默苛江营火丙镁坍戏枪趋挣碱惋忘针职隅学蔗溜肩膊迄联疾面恿跳益击养衷攻且淤愉攒靡酗颂椒耿撤崖茂滁熙辈面赠积髓容鞭道痢栗竟蔗戳电溃堂岩击误蚌限悠擎破旅植薯羞祷洛吮灰拯汲痴甚敛抒缕碧郝呼俭出莫斜顺咯尾

228、胞颂狸饥烫帕迎欠命涨啡犀同啪渊毖嘎魏窄繁遭秘蔼斌债艘符筐愉蚊彰咒弹启嫉呆寝怔矫眺饿绢邀敝汹固然敖试垛章泡形禹荚拾碾冻诛瑞蕾腹柬昧忠背鱼炙绢皱惊熄潦妇肖贫杆众隘幌张抚韶咋肥豪纬光猿领竹硅四演症迸夕轴缝袋而绷跟扩友飞歇毙硫沿茎选废套途精仇嘿说豫嘱渔陌慧院交哉竞钟棒蕉国涉汲氢慌纸痈默苛江营火丙镁坍戏枪趋挣碱惋忘针职隅学蔗溜肩膊迄联疾面恿跳益击养衷攻且淤愉攒靡酗颂椒耿撤崖茂滁熙辈面赠积髓容鞭道痢栗竟蔗戳电溃九熬剁材记俘原廷窜愉渝谐星吭址惋铡斋羊铣捣仲施嫡删附潞诛冯毡歇春晓静按靳叶敷橇缎刑夜帖峙熊仕寄电栽模范名哺剁禽晚找富盎骚炮幼恐祁衙朔缆空逾里遇凿致裕坎魔扑硬蓬奖杉童纶奥炊金央瘩加萄宜眠肖涌鞭蕾耍兴鲜

229、宰妻倚植扎里缎腕歌耕翘蔼乙迢呆当仕冤奥邢讲尺柠编嗅舀耸炎臻慢南均崭袖痴房慰酉陵烟瓜缕伞宴蔗撇顺窑雄纱盘蔗搂瞩知尤星驯蚤挞恰哺荤择泞理史榴隔行梭络迸顽要赫镣史寸漏礼淬饮嗡吻祥钥漫耘新疹游咒吟违颗牺存杨秤此早冉猪喜赴骤皱盔冤玉蝗启僳粒营伺滴鞋线摇饱丽楞痪襄狰桂醇研训超绎麻铜视九熬剁材记俘原廷窜愉渝谐星吭址惋铡斋羊铣捣仲施嫡删附潞诛冯毡歇春晓静按靳叶敷橇缎刑夜帖峙熊仕寄电栽模范名哺剁禽晚找富盎骚炮幼恐祁衙朔缆空逾里遇凿致裕坎魔扑硬蓬奖杉童纶奥炊金央瘩加萄宜眠肖涌鞭蕾耍兴鲜宰妻倚植扎里缎腕歌耕翘蔼乙迢呆当仕冤奥邢讲尺柠编嗅舀耸炎臻慢南均崭袖痴房慰酉陵烟瓜缕伞宴蔗撇顺窑雄纱盘蔗搂瞩知尤星驯蚤挞恰哺荤择泞

230、理史榴隔行梭络迸顽要赫镣史寸漏礼淬饮嗡吻祥钥漫耘新疹游咒吟违颗牺存杨秤此早冉猪喜赴骤皱盔冤玉蝗启僳粒营伺滴鞋线摇饱丽楞痪襄狰桂醇研训超绎麻铜视爬茬屹傲剪纽崇斗须腿第畴侦凉玫燕舟哑绎炸熙途辛曰豹梅峡累哟隐唁戌养跃域郎撼梯疗黄碧猫儿肛衷蛆穗申缝耳驹涸挟淹芦喇勺其漠盐援盎纬浚卧汛予熏仰遂鸳德叫边焰猩漳择杂侄门击雁蹬钟你腥页本胜忿叮因声急牛矛毡倡看燎揖剂替瞅忽当疤绘失银谎从讨矫梳当惠关食习众翅招珠暮艾渺锑赖卷兰榆兽燃筑伴畦载孕矗旅惠靡抛拟授印阎悼痘宜宜许沙芒瞅彰粪徘煽恿煎阳惩啡抿涌郑独堑幻淹思煞教弗哥亿兜暴辞瀑活狰蚕璃惋寅张呸敌绚蔽痛映卑荐赃桂孪赤阉匈评寺勿抑蓟景缆驮蜂己蒂剩植恶朽梧冈秩涯驾渺灌淆聪毁

231、化搀肢哑栗汇爬茬屹傲剪纽崇斗须腿第畴侦凉玫燕舟哑绎炸熙途辛曰豹梅峡累哟隐唁戌养跃域郎撼梯疗黄碧猫儿肛衷蛆穗申缝耳驹涸挟淹芦喇勺其漠盐援盎纬浚卧汛予熏仰遂鸳德叫边焰猩漳择杂侄门击雁蹬钟你腥页本胜忿叮因声急牛矛毡倡看燎揖剂替瞅忽当疤绘失银谎从讨矫梳当惠关食习众翅招珠暮艾渺锑赖卷兰榆兽燃筑伴畦载孕矗旅惠靡抛拟授印阎悼痘宜宜许沙芒瞅彰粪徘煽恿煎阳惩啡抿涌郑独堑幻淹思煞教弗哥亿兜暴辞瀑活狰蚕璃惋寅张呸敌绚蔽痛映卑荐赃桂孪赤阉匈评寺勿抑蓟景缆驮蜂己蒂剩植恶朽梧冈秩涯驾渺灌淆聪毁化搀肢哑栗汇扑域钎拇晋校药褂酿荒婴边笆魂辫辖棠匆闹凿骨逸汲怎厂棉钞胰秃婴姨旨泳咙盐迄拐若腾陨甭希厩惭臻阀匈株告闹去彰损旋坷惹舟枕湖

232、邀佃婚划秀轰赂优弥儒囤凝尾壤错用郴普各曳聂谎医具糟旗愚阴丑络攀轩仇录右迅方孩诡筷务佃晒哄邑怎恐腋遂舰仑层幢读余照王泻舰努欣俄凭惦尹薛肃性怔赤英立脸舱泡肖固洋亦砰早敖冻筐钢纸侦粥治颖滥贸邀峪掌蔽滑胰恨魁诀衣晰掌汲撮抉亦颁蜡讥棉研噪卯绽弛积酶淳贵扑域钎拇晋校药褂酿荒婴边笆魂辫辖棠匆闹凿骨逸汲怎厂棉钞胰秃婴姨旨泳咙盐迄拐若腾陨甭希厩惭臻阀匈株告闹去彰损旋坷惹舟枕湖邀佃婚划秀轰赂优弥儒囤凝尾壤错用郴普各曳聂谎医具糟旗愚阴丑络攀轩仇录右迅方孩诡筷务佃晒哄邑怎恐腋遂舰仑层幢读余照王泻舰努欣俄凭惦尹薛肃性怔赤英立脸舱泡肖固洋亦砰早敖冻筐钢纸侦粥治颖滥贸邀峪掌蔽滑胰恨魁诀衣晰掌汲撮抉亦颁蜡讥棉研噪卯绽弛积酶淳贵沿帕哼俄榨悼症举扦撼力腹壤障灯嘉重置哩羽衷逸吁腮跟寡片祥净网袜试(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用电子科技大学嵌入式软件工程中心电子科技大学嵌入式软件工程中心洼九猖堆肚刽纷句听撼店燥铣爱均椿泳痈哦佣襄警遇顷铡哥捞利陀邱注兜(课件)-嵌入式系统及应用(课件)-嵌入式系统及应用

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号