文章主要参照国际 Autosar 软件标准,结合项目实际要求,提出了新基础软件架构,并通过 MATLAB 的命令行工具 Legacy Code Tool 及 S- function 等功能,将底层驱动源代码封装成 Simulink 模块库,形成平台化产品。采用一键式集成的方式对其进行编译,生成可执行文件。经过开发测试验证,平台化开发的基础软件安全可靠。
1. Autosar 标准
Autosar 是面向汽车领域的嵌入式软件体系结构标准。该体系结构采用了分层模型,每一层只能使用下一层的接口,并向上一层提供服务接口。这样对于不同的硬件平台具有更大的灵活性,使得硬件和软件更大程度地彼此独立,同时分层独立开发可以缩短开发周期和减少开发成本。
按照 Atuosar 标准分层的架构体系,自上而下分别是应用层(Application Layer)、运行时环境(RuntimeEnvironment)、基础软件层(Basic Software Layer)及微控制器层,即硬件。
而基础软件分为 3 个层次,分别为:微控制器抽象层(Microcontroller Abstraction Layer)、ECU 抽象层(ECUAbstraction Layer)、服务层 (Services Layer)。另外,在Autosar 软件架构中将复杂驱动(Complex Drivers)独立出来,这部分并没有标准化,主要用于对复杂的传感器执行器进行操作。Autosar 标准软件架构具体分层结构,如图 1 所示。
整车控制器(VCU)是纯电动汽车的核心控制部件之一,主要功能是解析驾驶员需求,监视汽车行驶状态,协调控制单元(如 BMS,MCU,EMS,TCU 等)工作,实现整车的上下电、驱动控制、能量回收、附件控制和故障诊断功能。整车控制器基础软件需要实现开关量输入/输出模块(DI/DO)、模拟量输入模块(ADC)及通信模块(包括SPI 通信及 CAN 通信)的功能,负责整车控制器信号的采集和传递,并通过 CAN 总线传递到其他控制单元或驱动继电器来使执行器工作。整车控制器的系统功能结构,如图 2 所示。开关量输入模块接收的信号主要有钥匙信号、挡位信号及制动开关信号等;输出信号主要是控制继电器信号,如水泵继电器控制信号等。模拟量输入模块采集加速踏板和制动踏板开度信号及小蓄电池电压信号。SPI 通信模块主要负责电路板上不同芯片之间数据的交互,包括功能安全的问答机制;CAN 通信模块负责整车控制器内部通信及与整车其他设备 (主要有车载充电机(OBC)、电机控制器(MCU)、电池管理系统(BMS)及网关(GW)等)的通信。根据整车控制器对底层的要求,划分基础软件的结构形式及各个功能模块,对芯片的 RAM及 Flash 存储器等进行内存分配,定义各模块的功能要求并规定各模块之间的接口,最终形成基础软件架构,如图3所示。为了便于理解,将基础软件分层内容进行了重新定义,分为驱动层、ECU 抽象层及服务层。1)驱动层是基础软件的最底层,它主要对硬件提供驱动和诊断,并对接口层提供硬件资源调用服务的支持。该层主要由 I/O 驱动模块、存储驱动模块、通信驱动模块及 MCU 驱动模块组成。2)ECU 抽象层封装了驱动层以及外围设备的驱动,主要包括 IO 硬件抽象单元及 CAN 接口单元等。3)服务层包含了操作系统、系统服务(模式管理)、存储器服务、通讯服务及诊断通讯等。它为应用软件和基础软件模块提供基础服务。服务层的实现和运行与驱动层、ECU 抽象层及应用软件息息相关。对各个功能模块的描述,如表 1 所示。在软件架构定义完成之后,根据 Autosar 软件模块的功能规范,软件需要编写各模块的设计文档,设计文档需要明确该模块的编码手段 (C/C++ 汇编语言),并定义函数功能接口包括的类型参数、原型声明、外部声明及函数返回值等内容。根据完成的设计文档及编程规范来编写各功能模块的源代码,并进行动静态测试及功能测试。由于应用软件是基于 MATLAB 中的 Simulink 来搭建完成的,要想使应用层软件与基础软件相集成,首先需要将应用层模型生成 C 代码,然后编写中间层代码,使得应用层的接口与底层接口进行匹配交互。这样在软件开发过程中每一版软件都需要不断维护中间层代码,势必造成很大的工作量,并增加了开发周期,耗费了人力资源。为了更快更方便地将基础软件与应用层软件相集成,通过使用 MATLAB 中的 Legacy Code Tool 命令行工具、S-function 函数及 m 文件工具,将基础软件各个功能模块的源代码封装成 Simulink 模块,并将封装完成的各个子功能模块集成到模型中,称其为 BSW Library,形成平台化产品。Legacy Code Tool 可以很方便地将已有的源代码(C/C++ 代码)与模型结合起来。通过将源代码编译生成用于仿真的 S- Funciton,也可以生成一个封装了外部C 代码参数化的 S- function 模块。通过 S- function 可以定义每个功能模块与应用层的接口。具体封装流程,如图 4 所示。1)首先将要封装的源代码(包括头文件等)放到指定目录下;2)生成一个特定的 Legacy Code Tool 参数集,参数集制定了要包含的 C 代码、头文件,以及生成 S- func-tion 的名称等诸多信息;3)通过 Legacy Code Tool 的命令行语句,调用第1 步配置好的参数集变量,生成相应的 S- function 源文件;4) 将生成的 S- function 源文件变为可动态加载的执行文件,即 mexw32 文件;5) 通过 Legacy Code Tool 的命令行语句将上面生成的 S- function 执行文件封装成 Simulink 模块。封装完成后的 I/O 模块程序界面,如图 5 所示。对源代码封装完成后,在开发应用层模型时,可以在 Simulink BSW Library 库中直接调用基础软件的模型,将其与应用层模块进行集成,这样将大大提升集成的效率,并且能够保证集成的质量。将集成好的模型通过运行编写好的 m 文件并使用MATLAB 的 Embedder Coder 功能来生成源代码(*.c 及*.h)。最后在编译器中运行 makefile 文件,将所有的源代码及芯片中固化的 lib 文件进行编译连接,生成可执行文件及 A2L 文件。对集成后的可执行文件按照定义的测试项进行测试验证后,测试全部通过。从而得出:基于Autosar架构定义的基础软件架构使得当底层硬件升级时不需要更改整个系统,只需要将部分内容做一定程度的修改,即可重复利用,有利于未来整车系统的更新。通过对开发的基础软件源代码进行封装,变成平台化的产品,可以提高软件集成的可靠度并降低维护成本,进而降低开发费用。
声明:本文内容及图片由BC-AUTO转载至网络。作者:孙涛、宋安、王辉。单位:中汽研汽车工业工程(天津)有限公司、李斯特技术中心(天津)有限公司。