1、标准的产生标准的产生l年月,几家德国汽车制造商同意在适用于汽车且通用的实时分布式操作系统的规范化方面进行合作,产物就是(:)。l与此同时,法国的和开发了一个类似的系统,该系统被成为(:)。l年,两项目合并,年,面世,译文大意是用于汽车电子的、带有接口的开放式系统。l是什么?是什么?l是用于分布式实时结构的一组标准,它包含四个标准:操作系统()、通信()、网络管理()和实现语言()。l虽然是欧洲汽车工业开发的,但它并不只是一个用于汽车的实时操作系统。基于这个标准的系统能够并且将要用于其他应用中,只要这些应用是被静态定义且需要一个紧凑的分布式实时系统。l我们所主要关心的是其中的操作系统标准部分。l
2、工作组于年月推出 版本的几个要点的几个要点l在单处理器上运行l在启动时由用户配置指令生成,以后不支持任务的动态生成。l提供的服务提供了标准接口,对于不同的处理器实现接口必须相同,即通常所说的的移植。l支持符合类(见后面详细介绍)和不同的调度策略。l几乎所有的都返回一个类型,有几个例外。()、()、()、()、()l标准状态模式(只返回)和扩展状态模式(可以返回错误码),一般系统测试阶段采用扩展状态模式,发布的时候采用标准状态模式。l回调函数和应用程序模式。 体系结构体系结构l标准中定义的服务被两种实体来使用:中断服务程序()和任务()l标准定义了三个处理级别:中断、调度、任务。以下分别翻译成:
3、中断层、调度层、任务层。图示如下: 体系结构体系结构l优先级的划分必须满足下列条件,分配给,分配给调度程序,分配给任务,其中l调度层:调度任务,所有的调度活动处在这一层。优先级规则优先级规则l中断的优先级要高于任务l中断处理层可以包含一个或多个中断优先级l的中断优先级是静态分配的l的优先级的分配与具体实现或硬件体系结构有关l对于任务的优先级和资源的天花板优先级来说,大的数字指较高的优先级。 .l任务的优先级由用户(应用程序开发人员)指定体系结构体系结构l在标准里,符合类也算作了体系结构的一部分l四个符合类: l(基本符合类)l(基本符合类)l(扩展符合类)l(扩展符合类)l因牵涉到很多任务的具
4、体概念,每个符合类的定义放在任务之后再说。任务任务的类型任务任务的类型l任务有两种类型:基本任务()和扩展任务()。l基本任务只在以下三种情况释放:l一、任务结束 l二、切换到高优先级的任务去运行 l三、产生中断,去执行。l区别于基本任务,扩展任务可调用()服务进入等待()状态,等待状态下的任务释放,允许原本比它低优先级的任务去执行。扩展任务状态转换扩展任务状态转换基本任务状态转换基本任务状态转换两种任务类型的比较两种任务类型的比较l基本任务没有等待状态,仅在任务开始和结束形成同步点( ),如果应用程序需要内部同步点,可以用两个以上任务实现。l标准中有这样一句: ().(?)l扩展任务的有点是
5、:可以由一个任务完成一个连贯的工作,即使有同步需求。当扩展任务缺少继续往下运行需要的信息时,便进入等待状态。当具有需要的信息(事件被设置或者数据被更新)时,脱离等待状态。任务的优先级任务的优先级l标准中的任务具有静态定义的优先级,它不能被应用程序修改。l有一种特殊情况,就是优先级天花板协议有效时,操作系统能改变一个任务的优先级。l标准中定义是最低的优先级,没有定义最高优先级,定义太多的优先级将会影响应用程序的可移植性l如果允许多个任务具有相同的优先级,则需要多级任务队列。同优先级按照进行调度。l见下图:任务的激活任务的激活l激活将会使任务从挂起状态到就绪状态。l基本任务有一个独特的特性:多重激
6、活,应用程序可以对基本任务提出多重激活请求(“ ”)。意思是操作系统接收并记录已激活基本任务的并发激活请求。操作系统生成阶段会有一个激活次数的最大值。l基本任务状态转换图中的特殊情况:当一个基本任务处于非挂起状态时,激活并立即不进入就绪状态。l多重激活允许一个任务终止后然后立即在执行。l缺点:需要(?)一个包含所有优先级的多任务队列。符合类符合类l一个符合类被定义为操作系统要求的一个具体实现这样要求包括一个由应用指定的属性集。属性基本任务激活数每个优先级任务数基本任务扩展任务符合类符合类l任务是向上兼容的:任何为符合类开发的任务可在可在一个符合类中使用,任何为符合类编写的任务可在符合类中使用。
7、符合类符合类l具体开发,支持一个符合类即可。标准中为每个符合类的属性定义了一组最小的需求数值,超过这组数字将会影响可移植性。调度策略调度策略l调度策略分三种:非抢占、全抢占、混合抢占l软件开发人员或者系统集成者通过给每个任务分配优先级并且把是否可抢占作为一个任务的属性来决定任务的执行顺序。l调度函数()检查就绪的最高优先级的任务,把处理器交给它。l 如果 (或者称系统服务)正在运行,调度可能要推迟到这个完成之后。非抢占调度非抢占调度非抢占调度的调度点非抢占调度的调度点l非抢占调度的调度点:l一个任务的成功结束(调用)l一个任务成功结束并显示激活一个任务(当前任务调用())l显示调用调度函数()
8、l一个任务调用(),并转入等待状态。全抢占调度策略全抢占调度策略全抢占调度的调度点全抢占调度的调度点l调度点:l一个任务的成功结束(当前任务调用()一个任务要结束必须调用它)l一个任务成功结束并显示激活一个任务(当前任务调用())l在任务层激活一个任务l显示的调用(),并转入等待转态l在任务层设置了某个任务正在等待的事件l任务层资源的释放l从中断层转到任务层运行混合抢占任务调度混合抢占任务调度l如果应用程序中的一些任务被指定为抢占任务,而另一些被指定为非抢占任务,则该程序采用混合抢占任务调度策略。l在这种策略下,操作系统根据当前运行任务允许的抢占类型决定是否启动调度程序。l非抢占任务在混合调度
9、中的意义:l如果任务的执行时间和上下文切换时间差不多l如果为保存任务的上下文需耗费大量内存l应用程序中某个任务被强制指定为非抢占任务的终止任务的终止l在操作系统中,一个任务只能被它自己终止。l标准定义了一个 ();允许在当前任务终止后立即再激活参数中指定的任务,当然可以指定任务自己。l每个任务在它的代码最后必须结束它自己。或者调用();或者调用(); !应用程序模式应用程序模式()l操作系统启动时需提供要运行的l一种标准的实现至少要支持一种l操作系统启动后不允许改变l被应用程序用于定义当前的操作环境, 。用户可以按某种来决定是否启动某个任务或。就是说,某些任务和只有在特定的下才启动l 标准并未
10、规定各个和的关系,纯粹是为应用程序提供另一种层次的信息和控制。的特性()l标准中提到三个特性: , , 。l因为检查当前的开销很小,所有的符合类均支持。l在启动之前,用户需决定要启动的,然后将其作为一个参数传递给操作系统。(在()作为参数传递)。中断分类中断分类l中断服务程序()分为三类:类,类和类。l类:此类中断不需要调用。对任务管理没有影响。l类:需要调用。典型地,这类中断需要增加计数器的值、激活任务,设置时间和发送消息。操作系统为这类提供了准备其运行环境的框架,在框架内执行用户编写的中断处理程序。l类:这类中断在满足一定条件时会调用,也有可能不调用。但调用时必须调用()和()。图示如下:
11、中断分类中断分类中断中断l在内部不会调度。l调度发生在类和类返回时,没有其它要处理的中断且该中断是在一个可抢占任务运行时发生的。l此时的调度应根据全抢占调度策略的调度点去调度任务。l中断的调度顺序是由具体硬件来决定的。l可被任务和使用的中断服务如下图:事件机制事件机制l事件用于任务同步l操作系统只为扩展任务提供事件机制,每个事件均被分配给某个任务,每个任务可以拥有有限个事件。l事件机制激发任务进入或者脱离等待状态。l以下两图为全抢占和非抢占情况下设置事件对任务调度的影响:资源管理资源管理l资源管理对四个符合类都是必须的。l资源管理的目标:l两个任务不能同时占有同一资源(互斥)。l不出现优先级反
12、转l不能出现死锁l访问资源的任务不能进入等待状态。l只有在其所需要的资源全部可用的时候才执行。 。调度程序作为资源调度程序作为资源l如果一个任务在执行期间不想被打断,可以锁定调度程序。l在系统生成的时候,系统生成一个资源。l由于中断层的优先级高于调度者,所以中断不会受到调度资源被上锁的影响。优先级反转优先级反转死锁死锁资源的优先级天花板协议资源的优先级天花板协议资源的优先级天花板协议资源的优先级天花板协议资源的优先级天花板协议资源的优先级天花板协议报警报警()l计数器():计数器由计数器的值(滴答数)来衡量, 必须提供一个计数器(硬件或者软件定时器)。l标准没有提供标准对计数器操作的l报警会与
13、一个计数器和一个任务事件相关联,当计数器值达到预定义的数值时,就会激活相关联的任务或设置相应的事件。l标准提供了设置报警何时触发的相关l报警例子如下:报警报警l用户定义计数器和报警l ;l ; ;l();l();l绝对计数器值 相对计数器值,如果最后一个参数被设置为,不是周期报警。报警与报警与系统的启动系统的启动l执行硬件相关代码,比如关掉类和类中断,到阶段再开中断l调用,作为参数l操作系统调用内部启动代码,比如找到优先级最高的任务置为就绪,但并不调度。l调用()回调函数和错误处理回调函数和错误处理l操作系统在合适的地方调用如下回调函数:l()l()l()l()l()l错误处理:应用错误、致命错误l如果操作系统提供的服务结果不正确,但是内部数据没有破坏,则认为是应用错误。比如一个基本任务等待事件。l认为内部数据不正确则认为是致命错误,此时要关闭。比如在调度新任务执行时,所有任务处于非就绪状态。OS的关闭和调试的关闭和调试lOSEK标准中定义了一个关闭操作系统的系统调用ShutdownOS(),在其中调用ShutdownHook()。