ucos源码中文版ii原理之任务调度机制252译注_第1页
ucos源码中文版ii原理之任务调度机制252译注_第2页
ucos源码中文版ii原理之任务调度机制252译注_第3页
ucos源码中文版ii原理之任务调度机制252译注_第4页
ucos源码中文版ii原理之任务调度机制252译注_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UCOS2009-10-1110:1893字号:大中小多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU25个百分点之间。uCOSII有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,uCOSII64个优先级,只能创建64个任务,用户只能创建56 任务TCB为静态数组,建立任务只是从中获得一个TCB0优先级最高,63三OS_TCB描述uCOSII的TCB数据结构简单,内容容易理解,保存最基本的任务信息,同时还支持裁减来减小内存消耗,TCB是事先根据用户配置,静态分配内存的结构数组,通过优先级序号进行添加,查找,删除等功能。减少动态内存分配和释放。因为依靠优先级进行TCB分配,每个任务必须有自己的优先typedefstruct{#if structos_tcbstructos_tcb#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN|| #if(OS_Q_EN&&(OS_MAX_QS>=2))|| #if }.OSTCBStkSize;.OSTCBNext和.OSTCBPrev用于任务控制块OS_TCBs的双 待 的发生.OSTCBX,.OSTCBY,.OSTCBBitX.OSTCBBitYOSTCBY=priority>>OSTCBBitY=OSMapTbl[priority>>OSTCBX=priority&OSTCBBitX=OSMapTbl[priority&四表(ReadyuCOSII采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级相同。每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRdyGrp和OSRdyTbl[](OSRdyGrp占用一个字节:8位,每位代表一个优先级组;OSRdyTbl[]8个字节,共64位,每位代表一个优先级)在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PRIO(见文件OS_CFG.H)。为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PRIO在就绪表中相应字节的相应位置1。OSRdyGrp和OSRdyTbl[]的关系见图3.3,是按以下规则给出的:当OSRdyTbl[0]中的任何一位是1时,OSRdyGrp的第0当OSRdyTbl[1]中的任何一位是1时,OSRdyGrp的第1位置当OSRdyTbl[2]中的任何一位是1时,OSRdyGrp的第2位置INT8UconstOSMapTbl[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的[5:3]三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的(见文件 用于限制OSRdyTbl[]07之间,见表BitBitMask01234567程 程 程L3.5(这行代码功能是找到组,把组上的值置为不妨假设prio的值为13,即优先级为13prio>>3右移3位后值为1,可以查表T3.1找出OSMapTbl[1]的值为00000010.再用00000010和OSRdyGrp进行异或运算:OSRdyGrp|=OSMapTbl[prio>>3];//先根据高3位[5:3]找到所在的组OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];//3位把该组的具体某一位置1程L3.6从就绪表中删除一个任if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==OSRdyGrp&=~OSMapTbl[prio>>以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位 ,而对于OSRdyGrp,只有当被 。也就是说OSRdyTbl[prio>>3]所有的位都是零时,OSRdyGrp的相应位才 需要从OSRdyTbl[0]开始扫描整个就绪任务表,只需要查另外一 ,即优先级判定表OSUnMapTbl([256])(见文件OS_CORE.C)。OSRdyTbl[]中每个字节的8位代表这一组的8个任务哪些进入就绪态了 。利用这个字节为下标来查OSUnMapTbl INT8UconstOSUnMapTbl[]=4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,例如,如果OSRdyGrp的值为二进,查OSUnMapTbl[OSRdyGrp]得到的值是它相应于OSRdyGrp中的第3位bit3,这里假设最右边的一位是第0位bit0。类似地,如果 ,则OSUnMapTbl[OSRdyTbc[3]]的值是2,即第2位。于是任务的优先级Prio就等于26(3*8+2)。利用这个优先级的值。查任务控制块优先级表OSTCBPrioTbl[],得到指向相应任务的任务控制块OS_TCB的工作就完成了。五uCOSII主要有五种任务状态,睡眠态就是挂起态,阻塞 设为最低优先级空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。空闲任务不可能被应用软件删除。 = =OSUnMapTbl[OSRdyTbl[y]];prio=(y<<3)+x;睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-μ刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟正在运行的任务期待某一的发生时也要等待,是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。当任务因等待被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当发生了,被挂起的任务进入就绪态。发生的报告可能来自另一个任务,也可能来自中正运的务可被断,非任将断了者OⅡ中关。中了的务进了断务(I)响中时正执的务挂,断务程控制了U的用。断务程可会告个多个 的,使个多任进就态在种情下从断务程返之,/O-要定中的务否是绪任中先最高。果断务程使个先更的务入绪,新入绪的个先更的 发生或等待延迟时间结束,μC/OS-Ⅱ执行空闲任务(idletask),行OSTaskIdle()六ContextSwitch在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Task’sContextStoragearea),也就是任务自己的栈区之中。(见图2.2)。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于C七uCOSII提供最简单的实时内核任务调度,算法简单,因此也只支持优先级抢占任务调度,不支uCOSII总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述uCOSII任务调度所花的时间是常数,与应用程序中建立的任务数无为实现任务切换,OSTCBHighRdy必须指向优先级最高的那个任务控制块OS_TCB,这是通过将以OSPrioHighRdy为下标的OSTCBPrioTbl[]数组中的那个元素赋给OSTCBHighRdy来实现的[L3.8。最后宏调用OSIOUOW人为P(rpr(ctnr)Ox。OtxOyOSSched()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防代码都可以用汇编语言写。为增加可读性,可移植性和将汇编语言代码最少化,OSSched()是用C写任务切换的相关函数:与CPUOSStartHighRdy()执行优先级最高的任 OSIntCtxSw()中断后的上下文切OSTickISR()中断服务程序启八.uCOSIIOSInit()建立空闲任务idletask,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优 在一起的。OSTCBList指向这个链表向最后建立的那个任务。链的终点指向空字符NULL(也就是零)因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl[]中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp1位是设为1的uCOSII还初始化了4个空数据结构缓冲区,如图F3.8所示。每个缓冲区都是单向链表,允uCOSII从缓冲区中迅速得到或释放一个缓冲区中的元素。控制块OS_TCB的数目也就自动确定了。当 如果说CPU是计算机系统的心脏,那么进程调度就是计算机系统的,因为它决定了如何使用CPU。例如,Linux是一个多任务操作系统,它的理想状况是保持CPU有效运行。如果某

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论