
一、引言
在当今高度智能化的汽车电子领域,软件系统的复杂性呈指数级增长。为了应对这一挑战,汽车开放系统架构(AUTOSAR)应运而生,它为汽车电子软件开发提供了标准化的分层架构和开发方法。其中,运行时环境(RTE)作为 AUTOSAR 架构中的关键部分,负责协调软件组件之间的通信和调度,确保整个系统的高效运行。本文将深入探讨 AUTOSAR 中 RTE 的生成过程,详细介绍 RTE 合同阶段和 RTE 生成阶段,并通过具体的例子,包括文件内容、源代码以及.arxml 文件,帮助读者更好地理解这一复杂的过程。
二、AUTOSAR 分层架构
AUTOSAR 采用分层架构,这种架构设计使得软件的开发和维护更加模块化和可扩展。主要包含三个层次:
(一)应用层(Application Layer)
应用层是汽车电子系统中与具体功能相关的部分,它包含了各种软件组件和 RTE。例如,在一个智能驾驶汽车的系统中,应用层可能包含了用于处理传感器数据的软件组件、用于决策的软件组件以及用于控制执行器的软件组件。这些软件组件通过 RTE 进行通信和协作,共同实现智能驾驶的功能。
(二)RTE 层
RTE 层就像是一个桥梁,负责软件组件之间的通信和调度。当应用层中的一个软件组件需要与另一个软件组件进行数据交换时,它会通过 RTE 来完成。例如,传感器数据处理组件需要将处理后的数据发送给决策组件,这一过程就需要 RTE 来协调。
(三)基础软件层(Base Software Layer)
基础软件层为应用层和 RTE 层提供了底层的支持,它又细分为服务层、ECU 抽象层和微控制器抽象层。
- 服务层(Service Layer):提供了一系列的服务,如内存管理、任务调度等。例如,在一个汽车的多媒体系统中,服务层可能会提供内存分配服务,用于存储音频和视频数据。
- ECU 抽象层(ECU Abstraction Layer):将应用层和微控制器抽象层隔离开来,使得应用层可以独立于具体的硬件平台进行开发。例如,不同型号的汽车可能使用不同的 ECU,但应用层的软件组件可以通过 ECU 抽象层来访问这些 ECU,而不需要关心具体的硬件细节。
- 微控制器抽象层(Microcontroller Abstraction Layer):直接与微控制器进行交互,提供了对微控制器硬件资源的访问接口。例如,它可以提供对 GPIO 引脚、定时器等硬件资源的控制接口。
下面是一个简单的 AUTOSAR 分层架构示意图:

三、软件组件开发与部署
在软件组件开发过程中,可分为两个阶段:
(一)软件组件开发(Software Component Development)
软件组件开发涵盖了软件组件的规格定义、设计和实现。例如,我们要开发一个用于控制汽车发动机的软件组件,在规格定义阶段,我们需要明确该组件的功能需求,如控制发动机的转速、温度等。在设计阶段,我们需要设计组件的内部结构和接口,如定义输入输出端口、事件和可运行实体等。在实现阶段,我们使用编程语言(如 C 语言)来编写具体的代码。
以下是一个简单的软件组件代码示例:
c
// 发动机控制软件组件
#include <stdio.h>
// 定义输入端口
typedef struct {
int current_speed;
int current_temperature;
} EngineInput;
// 定义输出端口
typedef struct {
int throttle_position;
int cooling_fan_speed;
} EngineOutput;
// 可运行实体函数
void EngineControl(EngineInput input, EngineOutput *output) {
// 根据输入计算输出
if (input.current_speed < 50) {
output->throttle_position = 80;
} else {
output->throttle_position = 60;
}
if (input.current_temperature > 90) {
output->cooling_fan_speed = 100;
} else {
output->cooling_fan_speed = 50;
}
}
(二)软件组件部署(Software Component Deployment)
软件组件部署涉及将应用程序集成到基础软件中,并将组件分配到 ECU。例如,我们将上述发动机控制软件组件集成到汽车的 ECU 中,需要考虑组件与基础软件的接口兼容性,以及组件在 ECU 中的资源分配情况。
四、RTE 概述
RTE 即运行时环境,其主要职责是实现应用层中软件组件之间的通信,以及软件组件的调度。当应用层需要与基础软件通信时,也需通过 RTE 进行。
例如,在一个汽车的车身控制系统中,有一个用于控制车门锁的软件组件和一个用于控制车窗升降的软件组件。当驾驶员按下车门锁按钮时,车门锁控制组件会通过 RTE 将信号发送给车窗升降控制组件,以确保在车门锁定时车窗也能自动关闭。
五、RTE 生成阶段
RTE 生成器主要在两个阶段运行:
(一)合同阶段(Contract Phase)
- 输入:仅考虑软件组件描述文件(如.arxml 文件)。以下是一个简单的.arxml 文件示例:
xml
<?xml version="1.0" encoding="UTF-8"?>
<AR-PACKAGE>
<SHORT-NAME>EngineControlComponent</SHORT-NAME>
<ELEMENTS>
<SW-COMPONENT-TYPE>
<SHORT-NAME>EngineControl</SHORT-NAME>
<Ports>
<R-PORT-PROTOTYPE>
<SHORT-NAME>EngineInputPort</SHORT-NAME>
<DATA-PROTOTYPE>
<SHORT-NAME>EngineInput</SHORT-NAME>
<TYPE-TREF>EngineInputType</TYPE-TREF>
</DATA-PROTOTYPE>
</R-PORT-PROTOTYPE>
<P-PORT-PROTOTYPE>
<SHORT-NAME>EngineOutputPort</SHORT-NAME>
<DATA-PROTOTYPE>
<SHORT-NAME>EngineOutput</SHORT-NAME>
<TYPE-TREF>EngineOutputType</TYPE-TREF>
</DATA-PROTOTYPE>
</P-PORT-PROTOTYPE>
</Ports>
</SW-COMPONENT-TYPE>
<DATA-TYPE-MAP>
<SHORT-NAME>EngineDataTypes</SHORT-NAME>
<DATA-TYPE-REFS>
<DATA-TYPE-REF>
<SHORT-NAME>EngineInputType</SHORT-NAME>
<TYPE-TREF>STRUCTURE-TYPE</TYPE-TREF>
<STRUCTURE-TYPE>
<SHORT-NAME>EngineInput</SHORT-NAME>
<ELEMENTS>
<STRUCTURE-ELEMENT>
<SHORT-NAME>current_speed</SHORT-NAME>
<TYPE-TREF>INTEGER-TYPE</TYPE-TREF>
</STRUCTURE-ELEMENT>
<STRUCTURE-ELEMENT>
<SHORT-NAME>current_temperature</SHORT-NAME>
<TYPE-TREF>INTEGER-TYPE</TYPE-TREF>
</STRUCTURE-ELEMENT>
</ELEMENTS>
</STRUCTURE-TYPE>
</DATA-TYPE-REF>
<DATA-TYPE-REF>
<SHORT-NAME>EngineOutputType</SHORT-NAME>
<TYPE-TREF>STRUCTURE-TYPE</TYPE-TREF>
<STRUCTURE-TYPE>
<SHORT-NAME>EngineOutput</SHORT-NAME>
<ELEMENTS>
<STRUCTURE-ELEMENT>
<SHORT-NAME>throttle_position</SHORT-NAME>
<TYPE-TREF>INTEGER-TYPE</TYPE-TREF>
</STRUCTURE-ELEMENT>
<STRUCTURE-ELEMENT>
<SHORT-NAME>cooling_fan_speed</SHORT-NAME>
<TYPE-TREF>INTEGER-TYPE</TYPE-TREF>
</STRUCTURE-ELEMENT>
</ELEMENTS>
</STRUCTURE-TYPE>
</DATA-TYPE-REF>
</DATA-TYPE-REFS>
</DATA-TYPE-MAP>
</ELEMENTS>
</AR-PACKAGE>
- 处理过程:读取软件组件描述文件,并生成组件 API。
- 输出:特定软件组件的头文件。以下是根据上述.arxml 文件生成的头文件示例:
c
#ifndef ENGINE_CONTROL_RTE_H
#define ENGINE_CONTROL_RTE_H
// 定义输入输出数据类型
typedef struct {
int current_speed;
int current_temperature;
} EngineInput;
typedef struct {
int throttle_position;
int cooling_fan_speed;
} EngineOutput;
// 声明 RTE 函数
void Rte_Read_EngineInputPort(EngineInput *input);
void Rte_Write_EngineOutputPort(EngineOutput *output);
#endif // ENGINE_CONTROL_RTE_H
- 用例及优势:可用于软件与目标库的共享。同时,该阶段能解决 RTE 生成过程中的一些问题。例如,在 RTE 生成时,RT 缓冲区访问默认被授予,其缓冲区编号可能会因 AUTOSAR 接口变更或.arxml 文件配置更改而改变,这可能导致链接器错误。而合同阶段通过用函数调用替代直接的缓冲区访问,确保应用开发者在源代码中无需直接访问变量,而是调用 RTE 生成的函数,从而避免此类问题。以下是修改后的发动机控制软件组件代码,使用 RTE 函数进行数据读写:
c
// 发动机控制软件组件
#include "EngineControlRte.h"
// 可运行实体函数
void EngineControl(void) {
EngineInput input;
EngineOutput output;
// 从 RTE 读取输入数据
Rte_Read_EngineInputPort(&input);
// 根据输入计算输出
if (input.current_speed < 50) {
output.throttle_position = 80;
} else {
output.throttle_position = 60;
}
if (input.current_temperature > 90) {
output.cooling_fan_speed = 100;
} else {
output.cooling_fan_speed = 50;
}
// 将输出数据写入 RTE
Rte_Write_EngineOutputPort(&output);
}
(二)生成阶段(Generation Phase)
- 输入:包括 ECU 提取文件、系统描述文件、ECC 值、s_swcd 文件和 bsmd 文件等。假设 ECU 提取文件包含了 ECU 的硬件配置信息,如 GPIO 引脚的分配、定时器的参数等。以下是一个简单的 ECU 提取文件示例:
plaintext
# ECU 提取文件
GPIO_Pin_1: Input
GPIO_Pin_2: Output
Timer_1_Period: 100ms
- 处理过程:利用这些文件为单个 ECU 生成 RTE 代码。
- 输出:生成等效的头文件、源文件(如.rte.c)以及相关的 XML 文件。以下是生成的 RTE 源文件示例:
c
#include "EngineControlRte.h"
// 模拟的 RT 缓冲区
static EngineInput rt_input_buffer;
static EngineOutput rt_output_buffer;
// RTE 读取输入端口函数实现
void Rte_Read_EngineInputPort(EngineInput *input) {
*input = rt_input_buffer;
}
// RTE 写入输出端口函数实现
void Rte_Write_EngineOutputPort(EngineOutput *output) {
rt_output_buffer = *output;
}
- 用例:当需要将应用层软件(ASW)集成到基础软件(BSW),或者有来自 OEM 或第三方的软件共享文件时,这些操作都会在生成阶段进行处理。例如,将发动机控制软件组件集成到汽车的基础软件中,需要在生成阶段将 RTE 代码与基础软件进行链接和编译。
六、软件组件实现类别
软件组件实现类别在 RTE 生成过程中起着关键作用。在创建软件组件时,需明确其交付形式,如源文件(s_SW_SRC)、目标文件或头文件。当指定为 s_SW_SRC 时,会触发生成阶段;而指定为目标文件时,则会触发合同阶段。此外,在软件组件实现映射中,还需明确特定软件组件的内部行为。
例如,我们将发动机控制软件组件以源文件的形式交付,那么在 RTE 生成过程中,会触发生成阶段,将源文件与 RTE 代码一起编译和链接。如果以目标文件的形式交付,则会触发合同阶段,对目标文件进行处理。
七、总结
通过上述内容,我们对 RTE 生成过程有了清晰的认识。合同阶段以软件组件描述文件为输入,输出等效的头文件;而生成阶段则综合考虑更多文件,输出等效的头文件、源文件及相关 XML 文件。理解这两个阶段对于汽车电子软件开发中确保软件组件的正确通信和调度至关重要。同时,通过具体的例子,包括.arxml 文件、源代码等,我们更加直观地了解了 RTE 生成过程的具体实现。在实际的汽车电子软件开发中,开发者需要根据具体的需求和场景,合理运用 RTE 生成过程,提高软件的开发效率和质量。