




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
淮阴工学院 DSP技术及应用课程设计选题名称: uCOSII多任务设计 系(院): 计算机工程学院专 业:计算机科学与技术(嵌入式系统软件设计)班 级: 计算机1073 姓 名: 学 号: 指导教师: 学年学期: 2009 2010 学年 第 2 学期2010年 6 月 12 日摘要:uCOS-II 中最多可以支持64 个任务,分别对应优先级063,其中0 为最高优先级,63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。uC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。关键词:uCOS-II; 函数调用; 可剥夺型; 多任务内核; 任务优先级; 抢占式调度目录1.多任务概述12. 就绪表(Ready List)13 任务状态43.1睡眠态43.2等待状态53.3中断服务态55 任务调度分析66 uCOS II的初始化7总 结8DSP技术及应用课程设计报告1.多任务概述 多任务是操作系统的一项基本功能.在DSP系统上引入操作系统之后,我们可以非常方便的使用它的多任务功能.多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。uCOS II有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少。2. 就绪表(Ready List)uCOS II采用内存映射的方式来实现READY队列的加入,查找,删除功能,效率非常高。但是也因此只能支持64个任务,每个任务都有自己的优先级,不能和其他任务优先级相同。每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变OSRdyGrp和OSRdyTbl。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl中的相应元素的相应位也置位。就绪表OSRdyTbl数组的大小取决于OS_LOWEST_PRIO。 为确定下次该哪个优先级的任务运行了,内核调度器总OS_LOWEST_PRIO在就绪表中相应字节的相应位置1。OSRdyGrp和OSRdyTbl的关系见图3.3,是按以下规则给出的: 当OSRdyTbl0中的任何一位是1时,OSRdyGrp的第0位置1, 当OSRdyTbl1中的任何一位是1时,OSRdyGrp的第1位置1, 当OSRdyTbl2中的任何一位是1时,OSRdyGrp的第2位置1, 当OSRdyTbl3中的任何一位是1时,OSRdyGrp的第3位置1, 当OSRdyTbl4中的任何一位是1时,OSRdyGrp的第4位置1, 当OSRdyTbl5中的任何一位是1时,OSRdyGrp的第5位置1, 当OSRdyTbl6中的任何一位是1时,OSRdyGrp的第6位置1, 当OSRdyTbl7中的任何一位是1时,OSRdyGrp的第7位置1, 程序清单3.5中的代码用于将任务放入就绪表。Prio是任务的优先级。 程序清单 L3.5 使任务进入就绪态 /*这行代码功能是找到列, 把列上的值置为1不妨假设prio的值为13, 即优先级为13. prio3 右移3位后值为1, 可以查表T3.1找出 OSMapTbl1 的值为 0000 0010. 再用 0000 0010 和 OSRdyGrp 进行异或运算*/OSRdyGrp |= OSMapTblprio 3;/*/OSRdyTblprio 3 |= OSMapTblprio & 0x07; 任务优先级的低三位用于确定任务在总就绪表OSRdyTbl中的所在位。接下去的三位用于确定是在OSRdyTbl数组的第几个元素。 OSMapTbl是在ROM中的屏蔽字,用于限制OSRdyTbl数组的元素下标在0到7之间,见表3.1 表3.1 OSMapTbl表IndexBit Mask (Binary)000000001100000010234567000001000000100000010000001000000100000010000000如果一个任务被删除了,则用程序清单3.6中的代码做求反处理。 程序清单 L3.6 从就绪表中删除一个任务 if (OSRdyTblprio 3 &= OSMapTblprio & 0x07) = 0) OSRdyGrp &= OSMapTblprio 3; 以上代码将就绪任务表数组OSRdyTbl中相应元素的相应位清零,OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRdyTblprio3所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRdyTbl0开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSUnMapTbl (256)。OSRdyTbl中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的。 找出进入就绪态的优先级最高的任务 y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; prio = (y 3) + x; 3 任务状态 uCOS II主要有4种任务状态,睡眠态就是挂起态,阻塞态和延时态这里统一为等待状态。增加了一个被中断状态。UC/OS-总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务OSTaskIdle()永远设为最低优先级空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。空闲任务不可能被应用软件删除。 3.1睡眠态 睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给C/OS-管理,把任务交给C/OS-是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。 正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数 OSTimeTick()使延迟了的任务进入就绪态。3.2等待状态 正在运行的任务期待某一事件的发生时也要等待,手段是调用以下 3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。 正在运行的任务是可以被中断的,除非该任务将中断关了,或者C/OS-将中断关了。3.3中断服务态被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,C/OS-要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。 当所有的任务都在等待事件发生或等待延迟时间结束,C/OS-执行空闲任务(idle task),执行OSTaskIdle()函数。4 任务切换 Context Switch 在有的书中翻译成上下文切换,实际含义是任务切换,或CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区(Tasks Context Storage area),也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。任务切换过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于 CPU有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。 5 任务调度分析 uCOS II提供最简单的实时内核任务调度,算法简单,因此也只支持优先级抢占任务调度,不支持时间片轮训调度算法,不支持优先级逆转。uCOS II总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(Scheduler)完成的。任务级的调度是由函数OSSched()完成的。中断级的调度是由另一个函数OSIntExt()完成的,这个函数将在以后描述。uCOS II任务调度所花的时间是常数,与应用程序中建立的任务数无关。在uCOS中曾经是先得到OSTCBHighRdy然后和OSTCBCur做比较。因为这个比较是两个指针型变量的比较,在8位和一些16位微处理器中这种比较相对较慢。而在C/OS-中是两个整数的比较。并且,除非用户实际需要做任务切换,在查任务控制块优先级表OSTCBPrioTbl时,不需要用指针变量来查OSTCBHighRdy。综合这两项改进,即用整数比较代替指针的比较和当需要任务切换时再查表,使得uCOS II比uCOS在8位和一些 16位微处理器上要更快一些。为实现任务切换,OSTCBHighRdy必须指向优先级最高的那个任务控制块OS_TCB,这是通过将以 OSPrioHighRdy为下标的OSTCBPrioTbl数组中的那个元素赋给OSTCBHighRdy来实现的L3.8(4)。最后宏调用 OS_TASK_SW()来完成实际上的任务切换L3.8(6)。任务切换很简单,由以下两步完成,将被挂起任务的微处理器寄存器推入堆栈,然后将较高优先级的任务的寄存器值从栈中恢复到寄存器中。在uCOS II中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有微处理器的寄存器都保存在栈中。换句话说,C/OS-运行就绪态的任务所要做的一切,只是恢复所有的CPU寄存器并运行中断返回指令。为了做任务切换,运行 OS_TASK_SW(),人为模仿了一次中断。多数微处理器有软中断指令或者陷阱指令TRAP来实现上述操作。中断服务子程序或陷阱处理(Trap hardler),也称作事故处理(exception handler),必须提供中断向量给汇编语言函数OSCtxSw()。 OSCtxSw()除了需要OS_TCBHighRdy指向即将被挂起的任务,还需要让当前任务控制块OSTCBCur指向即将被挂起的任务。 OSSched ()的所有代码都属临界段代码。在寻找进入就绪态的优先级最高的任务过程中,为防止中断服务子程序把一个或几个任务的就绪位置位,中断是被关掉的。为缩短切换时间,OSSched()全部代码都可以用汇编语言写。为增加可读性,可移植性和将汇编语言代码最少化,OSSched()是用C写的。 6 uCOS II的初始化OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低。这两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。换句话说,OSTCBList总是指向最后建立的那个任务。链的终点指向空字符NULL(也就是零)。因为这两个任务都处在就绪态,在就绪任务表OSRdyTbl中的相应位是设为1的。还有,因为这两个任务的相应位是在OSRdyTbl的同一行上,即属同一组,故OSRdyGrp中只有1位是设为1的。uCOS II还初始化了4个空数据结构缓冲区。每个缓冲区都是单向链表,允许uCOS II从缓冲区中迅速得到或释放一个缓冲区中的元素。控制块OS_TCB的数目也就自动确定了。当然,包括足够的任务控制块分配给统计任务和空闲任务。 总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。回顾起此次DSP课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 弱电项目实施组织与管理
- 2025年乡镇社区工作者招聘面试注意事项与模拟题
- 会计主管面试题库及答案
- 2024年长安大学兴华学院校长开学讲话稿9000字
- 四川省泸州市叙永一中教育共同体2023-2024学年七年级上学期语文(12月份)月考模拟试卷(含答案)
- 国际报关实训课件
- 国药集团安全培训课件
- 广东省四校联考2026届高三上学期9月联考(一)语文试题(含答案)
- 广州建筑文明施工方案
- 河南铁路投资有限责任公司校园招聘考试题库及答案解析
- 四轮定位外协协议合同
- 药学知识与技能课件
- 主持人个人礼仪规范
- 2025年人教版《太阳》标准课件
- 老年患者的安全管理课件
- 教学课件:《公差配合与技术测量》
- 《天体和天体系统》课件
- 《生物制品连续制造指南》
- 2025年高压电工作业考试国家总局题库及答案(共280题)
- 给药错误的应急流程
- 交流电能表现场校验仪检定规程
评论
0/150
提交评论