版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统操作系统吴国伟wgwdut@大连理工大学软件学院/10/101多任务第1页第三章任务管理3.3任务同时3.2
多任务3.1
任务描述和状态,控制
/10/102多任务第2页3.2多任务多任务运行实现实际上是靠CPU在许多任务之间转换,调度实现。多任务运行是CPU利用率得到最大发挥,并使应用程序模块化在实际应用中,多任务化最大特点是,可发人员能够将很复杂应用程序层次化。使用多任务,应用程序将更轻易设计与维护/10/103多任务第3页3.2.1任务优先权及优先级别当有多个任务需要运行时,操作系统必须在这些待运行任务中选择一个来运行。uC/OS-II采取了按优先级抢占式规则系统中每个任务都按照其任务主要性分配有一个唯一优先级别优先级别高任务先运行,优先级别低任务后运行/10/104多任务第4页uC/OS-II最多可创建64个任务,任务优先级别最多64级,用整数表示,0,1,2...,63.数字越小,优先级越高uC/OS-II系统配置文件OS_CFG.H中定义了LOWEST_PRIO:定义了一个用来表示最低优先级别常数系统总是把最低优先级LOWEST_PRIO赋给空闲任务/10/105多任务第5页假如应用程序中使用了统计任务,系统会将OS_LOWEST_PRIO-1自动赋给统计任务用户任务能够使用优先级从0~OS_LOWEST_PRIO-2用户任务优先级要由用户在创建一个任务时显示地定义/10/106多任务第6页3.2.2可剥夺型内核uC/OS-II属于可剥夺型内核总是让就绪态高优先级任务先运行中止服务程序能够抢占CPU,到中止服务完成时,内核让此时优先级最高任务运行(不一定是那个被中止了任务)任务级响应时间得到了最优化,且是可知应用程序不应直接使用不可重入型函数/10/107多任务第7页3.2.3任务就绪表uC/OS-II用一个就绪任务记录表,统计系统中全部处于就绪状态任务uC/OS-II中这个记录表就是一个位图,每个任务在这个位图中占据一个二进制位该位置状态(1/0)就表示任务是否处于就绪状态是一个类型为INT8U数组OSRdyTbl[]在就绪表中以任务优先级别(也是任务标识)高低,为每个任务安排了一个二进制位,并要求该位值为1表示对应任务处于就绪状态/10/108多任务第8页为了便于对就绪表查找uC/OS-II定义了一个数据类型为INT8U变量OSRdyGrp,并使该变量每一个位都对应OSRdyTbl[]一个任务组假如某任务组中有任务就绪,则变量OSRdyGrp里把该任务组所对应位置为1;不然置为0/10/109多任务第9页/10/1010多任务第10页因为优先级别是一个单字节数字,而其其最大值不会超出63,即二进制形式00111111.所以,能够把优先级别看成是一个6位二进制数,这么就能够用高3位来指明变量OSRdyGrp详细数据位,并用来确定就绪表数据元素下标。用低3位来表明该数组元素详细数据位/10/1011多任务第11页对任务就绪表操作系统对于就绪表主要有三个操作:登记,注销和从就绪表就绪任务中得知含有最高优先级任务标识1.登记:当某个任务处于就绪态时,系统就将该任务登记在任务就绪表中,即在就绪表中将改任务对应位置1.OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];/10/1012多任务第12页2.注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务对应位置0if((OSRdyTbl[prio>>3]&-OSMapTbl[prio&0x07])==0)OSRdyGrp&=-OSMapTbl[prio>>3];/10/1013多任务第13页3.最高优先级就绪任务查找y=OSUnMapTal[OSRdyGrp];//取得优先级别高三位x=OSUnMapTal[OSRdyGrp[x]];//取得低三位prio=(y<<3)+x; //取得就绪任务优先级别OSUnMapTbl[]识uc/os为提升查找速度定义一个数组,共有256个元素/10/1014多任务第14页依据就绪表确定最高优先级经过OSRdyGrp值确定高3位,假设OSRdyGrp=0x08,对应OSRdyTbl[3],经过OSRdyTbl[3]值来确定低3位,假设OSRdyTbl[3]=0x3a,最高优先级任务为25/10/1015多任务第15页使任务进入就绪态假如prio是任务优先级,也是任务识别号,则将任务放入就绪表,即使任务进入就绪态方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假设优先级为12——1100bOSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;在这里我们要尤其注意OSMapTbl[]值/10/1016多任务第16页3.2.4任务调度在多任务系统中,令CPU中止当前正在运行任务转而去运行另一个任务工作叫做任务切换,而按某种规则进行任务切换工作叫做任务调度uC/OS-II中,任务调度由调度器完成调度器主要有两项工作:在任务就绪表中查找含有最高优先级别就绪任务实现任务切换/10/1017多任务第17页uC/OS-II有两种调度器:任务级调度器:由函数OSSched()实现中止级调度器:由函数OSIntExt()实现这里主要介绍任务级调度器调度器把任务切换工作分为:1.取得待运行任务TCB指针2.进行端点数据切换/10/1018多任务第18页取得待运行任务TCB因为操作系统是经过任务控制块TCB来管理任务,所以调度器真正实施任务切换之前主要任务就是要取得待运行任务任务控制块指针和当前任务控制块指针被中止任务任务控制块指针就存放在全局变量OSTCBCur中,所以调度器主要工作就是取得待运行任务任务控制块指针任务级调度器OSSched()源代码以下:/10/1019多任务第19页voidOS_Sched(void){#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/OS_CPU_SRcpu_sr;#endifINT8Uy;OS_ENTER_CRITICAL();if((OSIntNesting==0)&&(OSLockNesting==0)){/*只有ISR完成同时没有锁住调度才进行切换*///找最高优先级任务y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);if(OSPrioHighRdy!=OSPrioCur){/*检验寻找到优先级最高任务是否是当前正在运行任务,若是则不进行调度*/OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];//指向优先级最高任务控制块OSCtxSwCtr++;/*切换计数器加*/OS_TASK_SW();/*进行实际任务切换*/}}OS_EXIT_CRITICAL();}/10/1020多任务第20页uc/os允许应用程序给调度器上锁,解锁给调度器上锁函数OSSchedlock()用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。调用OSSchedlock()任务保持对CPU控制权,尽管有个优先级更高任务进入了就绪态。然而,此时中止是能够被识别,中止服务也能得到(假设中止是开着)。OSSchedlock()和OSSchedUnlock()必须成对使用。变量OSLockNesting跟踪OSSchedLock()函数被调用次数,以允许嵌套函数包含临界段代码,这段代码其它任务不得干预。/10/1021多任务第21页μC/OS-Ⅱ允许嵌套深度达255层。当OSLockNesting等于零时,调度重新得到允许。函数OSSchedLock()和OSSchedUnlock()使用要非常慎重,因为它们影响μC/OS-Ⅱ对任务正常管理。当OSLockNesting减到零时候,OSSchedUnlock()调用OSSched[L3.10(2)]。OSSchedUnlock()是被某任务调用,在调度器上锁期间,可能有什么事件发生了并使一个更高优先级任务进入就绪态。调用OSSchedLock()以后,用户应用程序不得使用任何能将现行任务挂起系统调用。/10/1022多任务第22页任务切换宏OS_TASK_SW()OS_TASK_SW()要做7项工作1.把被中止任务断点指针保留到任务堆栈中2.把CPU通用存放器内容保留到任务堆栈中3.把被中止任务堆栈指针当前值保留到该任务控制块OSTCBStkPtr中4.取得待运行任务任务控制块/10/1023多任务第23页5.使CPU经过任务控制块取得待运行任务任务堆栈指针6.把待运行任务堆栈中通用存放器内容恢复到CPU通用存放器中使CPU取得待运行任务断点指针(该指针是待运行任务在上一次调度器中止运行时保留在任务堆栈中)/10/1024多任务第24页调用OS_TASK_SW()前数据结构/10/1025多任务第25页保留当前CPU存放器值/10/1026多任务第26页重新装入要运行任务/10/1027多任务第27页功效2-6示意性代码:用压栈指令把CPU通用存放器R1,R2...压入堆栈//把SP保留在中止任务控制块中OSTCBCur->OSTCBStckPtr=SP;//使系统取得待运行任务控制块OSTCBCur->OSTCBHighRdy;//把待运行任务堆栈指针赋予SPSP=OSTCBHighRdy;用出栈指令把R1,R2,...弹入CPU通用存放器;/10/1028多任务第28页功效1,7因为任务切换时需要对CPU存放器进行操作,所以在普通情况下,中止服务程序OSCtxSw()都要用汇编语言来编写。下面给出OSCtxSw()示意性代码:voidOSCtxSw(void){用压栈指令把CPU通用存放器R1,R2,...压入堆栈;OSTCBCur->OSTCBStkPtr=SP;//在中止任务控制块中保留SPOSTCBCur->OSTCBHighRdy;//任务控制块切换OSPrioCur=OSPrioHighRdy;SP=OSTCBHighRdy->OSTCBStkPtr;//使SP指向待运行任务堆栈用出栈指令把R1,R2.....弹入CPU通用存放器;IRET;//中止返回,使PC指向待运行任务}/10/1029多任务第29页3.2.5任务创建创建任务实质上是创建一个任务控制块,并经过任务控制块把任务代码和任务堆栈关联起来形成一个完整任务uC/OS-II有两个用来创建任务函数:OSTaskCreate()和OSTaskCreateExt()OSTaskCreateExt()是前者扩展,并提供了一些附加功效/10/1030多任务第30页创建任务普通方法习惯在调用函数OSStart()之前创建一个任务,并赋予它最高优先级别,从而使它成为起始任务;在起始任务中,在创建其它各任务注意:uC/OS-II不允许在中止服务程序中创建任务/10/1031多任务第31页voidmain(void){....OSInit();....OSTaskCreate(TaskStart,.......);//创建起始任务TaskStartOSStart(); //开始多任务调度}/*********起始任务*********/voidTaskStart(void*pdata){ ... //在这个位置安装并开启uc/os时钟 OStatInit(); ... //在这个位置创建其它任务 for(;;){ 起始任务代码}}/10/1032多任务第32页3.2.6任务挂起和恢复uC/OS-II中,用户任务可经过调用系统提供OSTaskSuspend()函数来挂起本身或者除空闲任务之外其它任务。用函数OSTaskSuspend()挂起任务,只能在其它任务中经过恢复函数OSTaskResume()使其恢复为就绪状态/10/1033多任务第33页/10/1034多任务第34页/10/1035多任务第35页任务挂起流程图/10/1036多任务第36页任务恢复流程图
/10/1037多任务第37页3.2.7任务删除把删除任务任务控制块从任务控制块链表中删除,并偿还给空任务控制块链表在任务就绪表中把该任务就绪状态位置0能够经过调用函数OSTaskDel()来删除任务本身或者除了空闲任务之外其它任务/10/1038多任务第38页函数OSTaskDel()原型以下:#ifOS_TASK_DEL_ENINT8UOSTaskDel(INT8Uprio//要删除任务)/10/1039多任务第39页有时任务会占用一些动态分配内存或信号量之类资源,这时假如其它任务把这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年展架租赁合同范本3篇
- 2024年二手车交易合同新规定3篇
- 2024年新能源车辆租赁与运营合同
- 2024年度文具采购标准协议范例版B版
- 2024年度粮食批量采购与销售合作合同版
- 2024年国际物流运输服务协议模板版A版
- 2024年度股权转让合同(优先购买权)
- 2024年度企业员工借款与劳动争议风险评估合同3篇
- 2024年度软件定制开发合同的用户使用权限3篇
- 2024年农产品买卖合同2篇
- 《泰坦尼克号》电影赏析
- 小红书种草营销师模拟判断题
- 风电场危险源辨识、风险评价和风险控制清单
- 大学生劳动教育概论智慧树知到期末考试答案章节答案2024年南昌大学
- 2024年高考化学河北卷试卷评析暨2025届高考化学备考策略
- 齐鲁名家谈方论药 知到智慧树网课答案
- 科研伦理与学术规范(研究生)期末试题库及答案
- 2024年广东佛山市交通投资集团有限公司招聘笔试参考题库附带答案详解
- 大学生劳动教育-南京大学中国大学mooc课后章节答案期末考试题库2023年
- 小型步进电机控制系统设计
- 压铸件表面喷涂通用检验标准
评论
0/150
提交评论