华北水利水电学院课程报告课程名称: 嵌入式操作系统姓名:学号:班级:专业: 电子信息工程日期: 2012/12/27摘要:嵌入式计算机系统出现于20世纪60年代。
多年来随着计算机技术、电子信息技术等的发展,嵌入式计算机的各项技术也蓬勃发展,市场迅猛扩大,嵌入式计算机已深入到生产和生活的每个角落。
本文是在学习完嵌入式实时操作系统及应用开发后,从诸多知名嵌入式操作系统选择uC/OS II ,并就其中的任务的管理与调度进行的资料综述的课程报告。
主要介绍了任务的定义、任务的管理、任务的调度和优先级反转的内容。
引言:uC/OS II是一个可以基于ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。
为了提供最好的移植性能,uC/OS II 最大程度上是使用ANSI的C语言进行开发,并且已经移植到近40 多种处理器体系上,涵盖了从8 位到64 位各种CPU。
世界上已经有数千人在各个领域中使用uC/OS-II,这些领域包括:照相机行业、航空业、医疗器械、网络设备、自动提款机以及工业机器人等。
任务是uC/OS II实时内核的最基本的调度单位,所以研究uC/OS II的任务管理与调度对于理解整个uC/OS II系统以及后续的开发有很大的帮助。
一、μC/OS-II的概述μC/OS-II 的前身是μC/OS,最早出自于1992年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把μC/OS的源码发布在该杂志的BBS上。
uC/OS-II 是一个抢占式实时多任务内核。
uC/OS-II 是用ANSI的C语言编写的,包含一小部分汇编语言代码,使之可以提供给不同架构的微处理器使用。
μC/OS-II 具有移植方便,构思巧妙,结构简洁精练,执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。
所以至今从8 位到64 位,uC/OS-II 已经在40 多种不同架构的微处理器上使用,几乎已经移植到了所有知名的CPU上。
uC/OS-II 全部以源代码的方式提供给读者,大约有5500行。
CPU 相关的部分使用的是针对Intel80x86 微处理器的代码。
虽然uC/OS-II 可以在PC机上开发和测试,但是可以很容易地移植到不同架构的嵌入式微处理器上。
严格一点地说uC/OS-II 只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II 良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
uC/OS-II 目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,任务的管理与调度,内存管理,中断管理等。
二、任务的管理与调度1、任务任务是一个具有独立功能的无限循环的程序段的一次运行活动,是实时内核调度的单位,具有以下特性:动态性、并行性、异步独立性。
一个任务主要包括代码、数据、堆栈以及程序执行的上下文环境。
任务所包含的程序通常为一个具有无限循环的程序,但任务和程序是两个不同的概念,他们的区别主要是第一,任务能真实地描述工作内容的并发性,而程序不能;第二,程序是任务的组成部分;第三,程序是静态的,任务是动态的;第四,任务有生命周期,有诞生、有消亡,是短暂的,而程序是相对长久的;第五,一个程序可对应多个任务,反之亦然;第六,任务具有创建其他任务的功能,而程序没有。
任务上下文环境(context)包括了实时内核管理任务、以及处理器执行任务所需要的所有信息,如任务优先级、任务的状态以及处理器的各种寄存器的内容。
任务的上下文环境通过任务控制块(Task Control Block,TCB)来体现。
按照到达情况的可预测性,任务可以划分为:周期任务和非周期任务;按照重要程度,又可分为:关键任务和非关键任务。
任务的特性可以通过优先级、周期、计算时间、就绪时间和截止时间等参数来描述。
2、任务管理uC/OS‐II 中最多可以支持64个任务,分别对应优先级0~63,其中0为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
在多任务系统中,任务要参与资源的竞争,只有在所需要的资源都得到满足的情况下才能得到执行。
因此,任务拥有的资源的情况是不断变化的,导致任务状态也表现出不断变化的特性。
不同的实时内核实现方式对任务状态的定义不尽相同,但是都可以概括为三种基本的状态:等待(waiting)、就绪(ready)、执行(running)。
任务在不同的状态之间进行转换,即任务状态的变迁。
任务管理是通过对任务控制块(Task Control Block,TCB)的操作来实现的。
任务控制块是包含任务相关信息的数据结构,包含了任务执行过程中所需要的所有信息,一般包括任务的名字、任务执行的起始地址、任务的状态、任务的优先级、任务的上下文和任务的队列指针等内容。
为节约内存,任务的数量通常需要进行预先配置,在任务创建时,实时内核从空闲任务控制块链中为任务分配一个任务控制块。
任务切换是指保存当前任务的上下文,并恢复需要执行的任务的上下文的过程。
当发生任务切换时,当前正在运行的任务的上下文就需要通过该任务的任务控制块保存起来,并把需要投入运行的任务的上下文从对应的任务控制块中恢复出来,同时任务切换将导致任务状态发生变化。
在中断、自陷,运行任务因缺乏资源而被阻塞,时间片轮转调度超时以及被更高优先级任务抢占时可发生任务切换。
任务队列通过任务控制块实现对系统中所有任务的管理。
队列是由任务控制块构成,分为单等待队列和多等待队列的处理方式。
对于就绪任务,如果采用上述多等待队列方式进行管理,在基于优先级的调度处理中,要获得当前具有最高优先级的就绪任务,通常有两种方式:方式一,任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾。
方式二,就绪队列按照优先级从高到低的顺序排列。
但这两种处理方式中,所花费的时间与任务数量有密切的关系,具有不确定性,为提高实时内核的确定性,可采用一种被称为优先级位图的就绪任务处理算法。
任务管理用来实现对任务状态的直接控制和访问。
内核的任务管理是通过系统调用来体现,uC/OS‐II 提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
建立任务OSTaskCreat(),获得并初始化任务控制块TCB,为任务分配一个ID,使任务就绪并进行调度。
删除任务OSTaskDel(),根据指定的ID,把任务的TCB从队列中取出来,挂入空闲TCB 队列,并释放任务所占用的资源。
改变任务的优先级OSTaskChangePrio(),根据指定ID,找到任务的TCB,更改其中的优先级。
挂起任务OSTaskSuspend(),根据指定ID,找到任务的TCB,把任务的状态变为等待状态,并把TCB放置到等待队列。
恢复任务OSTaskResume(),根据指定ID,找到任务的TCB,若任务在等待其他资源,任务将仍然处于等待状态;否则,把任务的状态变为就绪状态,并把TCB放置到就绪队列。
3、任务调度任务调度要解决的问题就是按什么原则分配CPU、何时分配CPU、如何分配CPU。
由此可知任务调度主要包括任务调度的算法、任务调度的时机、任务调度的过程。
调度用来确定多任务环境下任务执行的顺序和在获得CPU资源后能够执行的时间长度。
操作系统通过一个调度程序来实现调度功能。
调度程序以函数的形式存在,用来实现操作系统的调度算法。
调度程序本身并不是一个任务,而是一个函数调用,可在内核的各个部分进行调用。
调度程序的具体位置又被称为是一个调度点,调度点通常处于以下位置:中断服务程序的结束位置;任务因等待资源而处于等待状态;任务处于就绪状态时等。
调度本身需要一定的系统开销,需要花费时间来计算下一个可被执行的任务。
所以简单是实时内核所强调的主要特点,复杂的、高级的调度算法则通常用于研究领域。
内核的主要职责就是要确保所有的任务都能够满足任务的时间约束特性要求。
所以在设计调度程序时,通常需要综合考虑如下因素:CPU的使用率、输入/输出设备的吞吐率、响应时间、公平性、截止时间。
但这些因素之间具有一定的冲突性,因此,调度程序的设计需要优先考虑最重要的需求,然后在各种因素之间进行折衷处理。
对于大量的实时调度算法而言,存在着以下几类主要的划分方法:离线和在线调度、抢占和非抢占调度、静态和动态调度、最佳和试探性调度。
uC/OS‐II是一个实时多任务系统,它和其它实时内核一样都采用了抢占式调度算法,使关键任务能够打断非关键任务的执行,确保关键任务的截止时间能够得到满足。
如基于优先级的可抢占调度,在基于优先级的可抢占调度中,如果出现具有更高优先级的任务处于就绪状态时,当前任务将停止运行,把CPU的控制权交给具有更高优先级的任务,使更高优先级的任务得到执行。
因此,实时内核需要确保CPU总是被具有最高优先级的就绪任务所控制。
4、优先级反转在理想情况下,当高优先级任务就绪后,就能够立即抢占低优先级任务而得到执行,但在有多个任务需要使用共享资源的情况下,可能会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象。
高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务的现象,这就称为优先级反转现象。
解决优先级反转现象的常用协议为:优先级继承协议和优先级天花板协议。
优先级继承协议的基本思想是:当一个任务阻塞了一个或多个高优先级任务时,该任务将不使用其原来的优先级,而使用被该任务所阻塞的所有任务的最高优先级作为其执行临界区的优先级。
当该任务退出临界区时,又恢复到其最初的优先级。
采用优先级继承协议,系统运行前就能够确定任务的最大阻塞时间。
但也存在两个问题:优先级继承协议本身不能避免死锁的发生、可能出现阻塞链,使得任务的阻塞时间可能会很长。
使用优先级天花板协议的目的在于解决优先级继承协议中存在的死锁和阻塞链问题。
优先级天花板指控制访问临界资源的信号量的优先级天花板。
信号量的优先级天花板为所有使用该信号量的任务的最高优先级。
总结及展望:在本次课程报告中,我又重新系统的学习了一次uC/OS‐II的任务管理与调度,对实时内核是如何进行任务管理与调度有了更深的认识,进一步熟悉了任务的定义、任务的管理、任务的调度和优先级反转的主要内容。
但鉴于篇幅和个人水平有限,文中还有许多问题还有待进一步的研究,如任务管理中优先级位图的就绪任务处理算法、任务调度算法的设计以及不同调度算法之间的比较、优先级继承协议和优先级天花板协议在处理效率和对程序运行过程的影响程度的比较。