1.2.4 软件工程技术

在汽车电气系统中引入嵌入式控制之后,汽车软件便开始了它的演化之旅。整车电子系统软件占比持续增大。有报告指出,2010年主流车型电子软件约含1000万源代码行数,而2016年则达到约1.5亿行。2018年软件约占D级车或大型乘用车整车价值超过10%;整车技术与工程核心正从传统硬件层面转移到软件,据预测软件创新将占未来汽车创新的90%左右。另据摩根士丹利估算,未来软件价值占比将达到60%左右。

1.面向数据和过程的开发方法

早期的软件代码设计经常需要考虑计算机硬件的特性,开发前期一般采用模块化设计来处理功能和架构,后期实施阶段采用结构化设计方法来实现代码。20世纪50年代末诞生的高级程序设计语言在很大程度上提高了软件的开发效率。

模块化设计就是要把软件系统的需求和功能对应到软件系统的各个组成部分,这些组成部分称为模块。模块化是指把软件系统划分成独立命名和可独立访问的单元,每个单元完成一个子功能,将它们集成到一起满足软件的整体功能需求。实现模块化的手段是抽象和信息隐蔽,模块化方法强调模块独立性,模块独立是指开发具有独立功能并且与其他模块之间没有过多相互作用的模块,模块独立的意义在于功能分割、简化接口、易于测试和维护、易于多人合作开发同一系统。

结构化程序设计关注软件详细设计阶段的程序过程描述。1968年,Dijkstra提出了程序中无条件转移语句(goto)有害的观点,从而引起了大范围的学术讨论。经过讨论,人们得到共识:goto语句使得程序的静态结构与程序的动态执行不一致,从而使得程序难以理解和调试。在此基础上,进一步形成了结构化程序设计的主要思想。结构化程序设计的主要思想是使用(仅使用)顺序、选择和重复这3种结构表示程序过程。由于这3种结构具有单入口和单出口特性,因而能够降低程序的复杂性,易于程序理解和维护,提高了可靠性。

2.面向对象的编程方法

面向对象的编程方法(Object Oriented Programming,OOP)通过一组对象的交互来完成系统的功能对象是数据及其所允许操作的封装体,是应用领域现实实体的软件抽象,面向对象的软件构造乃是基于系统所操作之对象类型,而非系统需实现之功能,来架构系统的途径。面向对象方法的实施步骤包含了面向对象分析、面向对象设计和面向对象实现等。

在应对需求复杂性方面,面向对象的软件开发方法通过建立与现实世界中的实体、概念、关系和结构直接对应的软件抽象来刻画需求,并支持该软件抽象在需求、设计、实现之间的无缝过渡,有助于弥合问题空间与解空间之间的语义鸿沟。在应对需求变化方面,结构化方法下功能的变化将导致如此设计的系统结构发生较大的变化而应用领域的概念和结构远比应用功能更稳定因此,较之结构化方法,面向对象方法开发的软件具有更好的结构稳定性、可修改性和可复用性。

3.面向复用的构件化开发方法

长期以来,复用性一直是软件技术和产业发展的重要关注点,软件复用不仅能够提高开发效率,而且由于使用得越多就越容易发现错误,所以能够保障质量。汇编语言的子程序(Subroutine)、结构化程序语言的函数(Function)以及面向对象语言的类(Class)都是可以复用的基本构件。然而体系化的软件复用则要求将软件复用全过程、全技术紧密结合的开发过程,使软件复用从早期的关注代码复用逐步发展到基于复用的软件开发全过程。

构件是指软件系统中具有相对独立功能、可以明确辨识、接口由契约指定、与语境有明显依赖关系、可独立部署且多由第三方提供的可组装软件实体。基于构件的软件开发方法(Component based software development)便是一种典型的软件复用开发方法。基于构件的软件开发将软件的生产模式从传统的软件编码工作,转换为以软件构件为基础的系统集成和组装软件,构件充当基本复用对象的角色,软件构件技术是软件复用技术的核心和基础。

软件复用的基本单元从程序代码开始,发展到了面向对象的类以及封装的构件,包括运行态的构件(如CORBA、EJB等分布式运行构件)。21世纪开始的网络服务(Web Service)提供了互联网上可访问的服务实体,这使得软件复用的方法扩展到了互联网的实体中。针对Web服务的选择、服务质量(QoS)预测和服务组装的研究,成为软件复用领域的技术和应用新扩展。

4.面向模型的软件开发方法

伴随着工业信息化和消费电子行业(汽车电子也属于消费类电子)进程的迅猛发展,软件的复杂度在不断提高同时,其演进形态也日益多样化。在这种情况下,如何有效地解决功能、效率、复用、可靠之间的问题,成为学术和工业界共同关注的焦点。模型驱动方法正是在这样的背景下逐渐受到重视,被认为是可以应对“高效、低成本地开发优质软件”的一条有效途径。而这一认识也伴随着实践不断得到深化,经历了从统一建模语言(Unified Modeling Language,UML)到模型驱动架构(Model Driven Architecture,MDA)、从模型驱动架构到模型驱动工程(Model Driven Engineering,MDE)再到基于模型的开发过程(Model Based Development,MBD)。

在汽车嵌入式系统领域,面向模型的软件开发得到了极大的应用。一方面面向车辆的嵌入式控制算法(闭环系统)要严格遵循被控对象(如汽车动力系统、底盘系统、转向系统等)的特性,另一方面面向驾驶员的舒适性系统(开环系统)也是以驾驶员偏好统计、行为、个性化配置等为目标,具有模型特性。

5.服务化软件开发方法

随着以互联网为主干,电信网、移动网、传感网等多种网络正在不断渗透融合,软件的运行环境正在逐步从静态、封闭、固定的单计算机环境转变为动态、开放、多变的网络环境。为了应对网络环境中各类分布式资源的共享、集成和协同,软件服务得到了广泛关注。

软件服务是指将软件的功能以服务的形式通过互联网来交付,可以被使用者(最终用户或者第三方客户端程序)直接使用的独立的基本单元。就其形态而言,软件服务一般基于可共享和集成的应用系统和资源来构建,对外则表现为一组相对独立的业务功能单元(通常是可供外部直接调用的应用编程接口,即API);软件服务的另外一个重要目标是屏蔽开放网络环境带来的异构性问题。在汽车电子电气架构中,本地的传感器网络、局域控制器网络、视频媒体网络等都存在异构性问题,从软件工程的角度来看,有较高的抽象级别和独立性的软件服务之间能够成为较为松散的耦合关系,从而使得汽车软件工程师可以灵活选择服务并进行组装来生成增值服务。软件服务不仅改变了智能网联环境下汽车的产品形态,也正在逐步改变汽车的交付方式,使得汽车产业开始从“以产品为中心的制造业”向“以用户为中心的服务业”转变。

在21世纪前十年,软件服务开始成为研究和应用的热点,其代表为面向服务的软件体系结构(Service Oriented Architecture,SOA)及其主要的实现工具Web服务技术。“软件定义汽车(Software Defined Vehicles,SDV)即是从互联网软件工程出发,重新定义汽车研发和生产的一种商业概念。

基于SOA方法的智能网联汽车软件架构及代码分层设计如图1-10所示,从下至上分别为基础底层功能管理、物理层功能管理、车辆控制服务、面向用户的应用服务和云端远程管理。

图1-10 基于SOA方法的智能网联汽车软件架构及代码分层设计

底层驱动功能管理用于实现包含诊断、日志记录、存储管理、驱动管理等相关功能。

物理层功能管理主要是设置I/O接口将原始传感器数据进行输入,同时也是执行到车端的控制单元(如电机、制动卡钳等);

车辆控制服务包含上层高级辅助驾驶系统(ADAS)发送的执行指令到控制执行器执行该指令的相应ECU(如VCU、HCU或ESP),该车辆控制服务是综合考虑了车身稳定性与动力学反馈模型得出的。

应用层服务就是智能驾驶面向用户级别的顶层开发功能,主要用于实现常规的智能驾驶功能,比如HWP、NOP、TJP以及ALC等。

云端管理服务主要是面向远程监控、大数据存储等特殊场景。通常该服务需要基于4G/5G网络进行远程连接。

人机交互管理功能,一般是针对不同的车型呈现出不同的模式的,因此,这一块一般是独立于SOA的功能架构。SOA通常只涉及底层对车辆控制逻辑,对于平台化车型功能开发来说,这一块是无法为用户所感知的。而HMI的显示设置则是用户能够真切感知和控制的,因此,不同车型肯定有极大的不同之处。从协议上分析不难看出,SOA内部的网络架构一般是基于以太网为基础的交互方式,采用Some/ip的协议进行通信控制。而如果在平台化车型的开发过程中,HMI这一块的通常仍然按照原始CAN/CANFD信号模式的通信协议进行交互控制。这么做的原因是,智能驾驶的HMI行为比核心应用功能更容易改变,特别是在不同车型开发后期通常会选择不同的显示和交互方式。同时,由于开发核心软件和HMI设计需要不同的能力技能,因此,将HMI功能与其他应用层软件功能分离,为了实现这一点,一般需要使用Model-View-Controller,用户输入由Controller处理,Controller用于解释用户的意图并操作模型。

6.未来面向智能网联环境汽车软件工程方法探索

随着物联网、云计算、大数据、智慧交通、数字城市等概念从设想提出到工程方案落地,车辆作为交通大环境中的元素,不可逆转地要接收越来越多的来自外部环境的信息、并受外部环境约束与调控。

汽车软件的应用方式从经典封闭应用模式经过分布式、模块化、普适化与服务化,将逐步接受x-计算(如网格计算、云计算、服务计算、边缘计算等)、x-系统(如嵌入式系统、混合系统、物联系统等)及x-数据(实时数据、大数据、超大数据等)为代表的多样化开放式应用模式,其设计方法如自适应软件系统、面向代理的软件开发、面向物联网的程序设计、自组织系统程序设计等等。