汽车ECU操作系统标准OSEKVDX及AUTOSAR标准
随着社会的进步和汽车工业的飞速发展,汽车在降低能耗、提高安全性和舒适度以及环保等方面的要求越来越高。这些要求刺激了电子技术在汽车上的应用,而且比重不断增加,其结果是汽车在零部件控制技术、通信和网络方面的复杂性大大增加。
在这个强大的市场需求和激烈竞争的环境下,汽车电子的软硬件产品不断发展并出现多元化格局。 这时一些问题凸显出来,比如,由于处理器( CPU)不断升级导致不同的CPU间的软件移植滞后,由于不同实时操作系统的应用程序接口(API)不同,导致应用程序的移植性差等。
为了改变这些状况,汽车行业借鉴通信行业的做法,把汽车嵌入式系统、部件间通信、部件管理逐步规范化、标准化。从而出现了车规级操作系统及标准。当前主要的汽车行业操作系统有:
ECU/TCU等底层控制单元:基于AUTOSAR OSEK/VDX的rtos;
仪表等需要简单界面的人机交互单元:QNX,AGL
导航中控等强人机交互单元:Windows CE、Android
当然,还有其他一些大厂自行开发的操作系统,而且上述的各类系统也是在相互渗透的,比如早期的导航不少也是用的QNX。本文只讲述OSEK/VDX标准的实时操作系统。
OSEK/VDX标准
1993年德国汽车工业界提出了OSEK(德文:Offene Systeme and deren Schnittstellen fur dieElektronik im Kraftfahr-zeug)体系,其含义是汽车电子开放式系统及其接口。这个体系的最早倡导者有:宝马、博世、戴姆勒克莱斯勒、欧宝、西门子、大众和卡尔斯鲁厄大学的工业信息技术研究所。法国的汽车制造商标致和雷诺于1994年加人了OSEK体系,并将法国汽车工业使用的汽车分布式运行系统(Vehicle Distributed eX-ecutivr, V DX)也纳人这一体系,V
DX的作用与OSEK相似。
在1995年召开的研讨会上,众多的厂商对OSEK和VDX的认识达成了共识,产生了OSEK/VDX规范(1997年发布)。它主要由四部分组成:操作系统规范(OSEK Operating System,OSEK OS)、通信规范(OSEK Communication,OSEK COM )、网络管理规范( OSEK Net Management,OSEK NM)和OSEK实现语言(OSEK Implementation Language,OIL)。
从此之后,各嵌入式OS厂商都相继推出了符合OSEK规范的产品,比较典型的有WINDRIVER公司的OSEKWorks,ETAS公司的RTA-OSEK,MOTOROLA的OSEKturbo和美国密西根大学的EMERALDS-OSEK等。随着该规范应用的不断深人,其结构和功能不断完善和优化,版本也不断升级和扩展。
OSEK/VDX操作系统的特点
实时性
由于越来越多的微处理器被应用到汽车控制领域,如汽车刹车的防抱死系统、动力设备的安全控制等这些系统直接关系着人的生命安全,即使出现丝毫的差错也会导致危及生命安全的严重后果,因此要求操作系统具有严格的实时性。OSEK操作系统通过静态的系统配置、占
先式调度策略、提供警报机制和优化系统运行机制以提高中断响应速度等手段来满足用户的实时需求。
可移植性
OSEK规范详细规定了操作系统运行的各种机制,并在这些机制基础上制定了标准的应用程序编程接口,使那些独立编写的代码能够很容易地整合起来,增强了应用程序的可移植性。OSEK还制定了标准的OIL,用户只需更改OIL配置文件中与硬件相关部分,便可实现不同微处理器之间的应用程序移植。通过这些手段,减少了用于维护应用程序软件和提高它的可移植性的花费,降低了应用程序的开发成本。
可扩展性
为了适用于广泛的目标处理器,支持运行在广泛硬件基础上的实时程序,OSEK操作系统具备高度模块化和可灵活配置的特性。它定义了不同的符合级别( Conformance Classes),并采用对不同应用程序有可靠接收能力的体系结构,从而增强了系统的可扩展性。OSEK操作系统可以在很少的硬件资源(RAM,ROM,CPC时间)环境下运行,即便在8位微处理器上也是如此。
OSEK/VDX操作系统的运行机制
进程(TASK)管理和调度
在OSEK操作系统中,进程管理能力相对有限,这是因为系统的进程设置在系统生成时已经定义好了,并目,系统中进程的数量保持不变,不允许动态创建和删除进程。OSEK规范把进程分为基础进程和扩展进程。基础进程状态包括:就绪态、运行态和挂起态,进程切换只发生在这三种状态之间;扩展进程除了具有基础进程的三种状态外,还有等待态,并支持事件机制。
基础进程通常在开始运行后,只有当它被高优先级进程占先或者是被中断时,它才会停止,否则一直运行到进程结束。而扩展进程除了能被高优先级的进程占先和被中断外,还会因等待事件而停止运行,进人等待态。处于等待态的扩展进程只有当它所等待的事件中至少有一个发生才会被激活继续运行。
处于就绪态的进程由调度程序调度运行,OSEK规范采用静态优先级调度策略。进程的优先级在系统生成的时候进行静态分配,高优先级的进程先处理,低优先级的进程后处理,具有
相同优先级的进程则进入一个先来先服务的队列。此外进程可分为可被占先进程和不可被占先进程:对不可被占先的进程而言,一旦进程开始运行,就不会被占先,只有到达其调度点时才发生调度,程序设计员可以预知调度点;而对可被占先的进程而言,由于中断可能激活更高优先级的进程,所以任何时候都有可能进行调度,使用这两种进程可使程序设计具有更高的灵活性。
OSEK操作系统不允许同一进程的多个并行调用,因为这需要动态改变进程的数量。当请求调用一个已经激活的进程时,该请求进人一个请求队列,直到前一个激活进程运行终止(转换为挂起态),第二个激活请求才执行。
进程间通信及同步机制
OSEK提供了两种同步机制,即对共享资源的互斥访问机制和事件机制。
OSEK的资源可以是一段临界区代码、调度程序、共享内存或数据结构,也可以是共享硬件设备。系统在处理多个进程对共享资源的互斥访问时,采用信号量对临界区数据或资源加锁。在某一时刻只能有一个进程访问资源,但是用信号量机制可能会导致优先级反转,即当
一个高优先级的进程试图访问一个已经被较低优先级的进程占用的资源时,则该高优先级的进程必须等待,直到低优先级的进程释放该资源。这时如果有大量的介于前两个进程优先级之间的进程被激活,而且它们根本不使用该资源,那么,占据资源的低优先级进程就会被占先,等待资源的高优先级进程也不能执行,而中间优先级的进程要先于高优先级的进程运行,这就是优先级反转。为了避免这种情况发生,OSEK操作系统采用了优先级最高限度协议(Priority Ceiling Protocol ),即当一个进程占用了一个资源后,该进程的优先级会临时升高为该资源优先级。其优先级为可能使用该资源的所有进程优先级的最高值。这样,该进程只会被不使用该资源并且比该资源的优先级高的进程占先,直到它释放该资源为止。因此,当一个进程试图占用一个资源的时候,不可能有任何其他进程正占用着该资源,也就不会有因试图占用资源而进人等待态的进程。使用该协议同时解决了死锁的问题,当两个进程都已占用了一个资源,而且又试图访问对方所占有的资源时,它们无限期地相互等待下去就会发生死锁。该协议中不存在等待进程,自然也就避免了死锁。