AUTOSAR COM Based Transformer 详解
目录
1 介绍与功能概述
COM Based Transformer 是AUTOSAR架构中的一个关键变换器组件,它提供了在运行时环境(RTE)中发送和接收数据时链接任意变换器的功能。当目标总线系统使用固定通信矩阵和打包数据表示时,COM Based Transformer 提供了这种功能。
根据AUTOSAR规范,COM Based Transformer的主要职责是将结构化数据序列化为线性形式,因此它在发送端只能作为第一个变换器,在接收端只能作为最后一个变换器使用。这种设计确保了数据转换的一致性和可靠性。
COM Based Transformer的关键特性包括:
- 支持COM模块支持的所有基本数据类型(除UINT8_DYN外)
- 能够处理SenderReceiver接口的每个数据元素
- 与COM模块一致的序列化和反序列化机制
- 提供明确的初始化和反初始化功能
2 COM Based Transformer 架构
2.1 整体架构
以下图表展示了COM Based Transformer在AUTOSAR系统中的位置以及与其他模块的关系:
组件 软件组件 (SWC):
- 职责: 应用层组件,通过RTE接口发送和接收数据
- 功能点:
- 作为数据的生产者或消费者
- 通过RTE提供的接口进行通信
组件 RTE:
- 职责: 运行时环境,为软件组件提供通信抽象
- 功能点:
- 提供Transformer API接口
- 协调不同层次间的数据传递
- 管理变换器链
组件 COM Based Transformer:
- 职责: 在RTE中作为顶层变换器提供序列化/反序列化功能
- 功能点:
- 提供数据元素序列化到Com信号组的功能
- 支持从Com信号组反序列化数据到结构化形式
- 处理序列化过程中的字节序转换和符号扩展
- 处理数组表示中的空隙区域
接口 Transformer API:
- 提供的服务: 标准化的变换器访问接口
- 调用方式: 由RTE管理和调用
组件 ComXf_:
- 职责: 序列化函数,将结构化数据转换为线性表示
- 功能点:
- 根据Com配置序列化数据元素
- 处理数据对齐和字节序转换
组件 ComXf_Inv_:
- 职责: 反序列化函数,将线性数据转换回结构化表示
- 功能点:
- 根据Com配置反序列化数据
- 处理字节序和符号扩展
组件 COM 模块:
- 职责: 提供通信服务,处理信号的传输和接收
- 功能点:
- 管理PDU的发送和接收
- 提供信号处理功能
/* COM Based Transformer初始化示例代码 */
#include "ComXf.h"
#include "ComStack_Types.h"
/* 初始化函数 */
void ComXf_Init(void) {
/* 初始化COM Based Transformer内部状态和缓冲区 */
/* 根据COM配置设置转换器参数 */
}
/* ComXf_<transformerId>的通用模式 */
Std_ReturnType ComXf_ExampleTransformer(
const void* sourceDataPtr,
uint16 sourceDataLength,
void* targetDataPtr,
uint16 targetDataLength,
uint16* usedTargetLength)
{
/* 序列化处理:
- 将sourceDataPtr指向的结构化数据序列化
- 根据COM配置执行数据对齐和字节序转换
- 将结果存储到targetDataPtr中 */
return E_OK;
}
2.2 配置结构
下图展示了COM Based Transformer的类结构和配置数据模型:
类 TransformationTechnology:
- 功能: 定义转换技术的关键属性和参数
- 关键属性:
- protocol:
- 描述: 指定转换器使用的协议类型
- 类型: String
- 取值范围: 必须为"COM-Based"才会识别为COM Based Transformer
- 默认值: 无默认值,必须显式设置
- 约束: 必须精确匹配
- version:
- 描述: 指定转换器版本号
- 类型: String
- 取值范围: 必须为"1.0.0"才会识别为当前版本
- 默认值: 无默认值,必须显式设置
- 约束: 必须精确匹配
- transformerClass:
- 描述: 指定转换器的类型
- 类型: TransformerClassEnum
- 取值范围: serializer或deserializer
- 默认值: 无默认值,必须显式设置
- 约束: 要使用COM Based Transformer,必须设置为serializer
- protocol:
类 BufferProperties:
- 功能: 定义转换器缓冲区的属性
- 关键属性:
- transformationDescription:
- 描述: 转换过程的描述文本
- 类型: String
- hasInternalState:
- 描述: 指示转换器是否维护内部状态
- 类型: Boolean
- needsOriginalData:
- 描述: 指示转换是否需要原始数据
- 类型: Boolean
- transformationDescription:
类 SwDataDefProps:
- 功能: 定义信号的数据类型属性
- 关键属性:
- dataTypePolicy:
- 描述: 数据类型策略
- 类型: DataTypePolicyEnum
- iSignalType:
- 描述: I-信号类型
- 类型: ISignalTypeEnum
- 可选性: 可选[0…1]
- length:
- 描述: 数据长度
- 类型: Integer
- dynamicLength:
- 描述: 指示数据长度是否动态
- 类型: Boolean
- dataTypePolicy:
类 SystemSignalGroup:
- 功能: 表示系统信号组,用于组织和管理相关信号
- 关联关系:
- 与SwDataDefProps通过networkRepresentationProps属性关联
- 与TransformationTechnology通过comBasedSignalGroupTransformation属性关联
/* COM Based Transformer配置示例代码 */
/* 系统级配置结构 */
typedef struct {
uint8 ComXfTransformerClass; /* 转换器类 (serializer/deserializer) */
uint8 ComXfProtocolType; /* 协议类型 (必须为COM-Based) */
uint8 ComXfVersion[3]; /* 版本号 (1.0.0) */
} ComXf_TransformationConfigType;
/* 信号转换配置 */
typedef struct {
uint16 ComXfSignalId; /* 信号ID */
uint16 ComXfSignalLength; /* 信号长度 */
uint8 ComXfByteOrder; /* 字节序 (LITTLE_ENDIAN/BIG_ENDIAN) */
boolean ComXfSignExtension; /* 是否执行符号扩展 */
uint16 ComXfStartPosition; /* 信号组中的起始位置 */
} ComXf_SignalConfigType;
/* 信号组转换配置 */
typedef struct {
uint16 ComXfGroupId; /* 信号组ID */
uint16 ComXfSignalCount; /* 信号数量 */
const ComXf_SignalConfigType* ComXfSignals; /* 信号配置指针数组 */
} ComXf_SignalGroupConfigType;
/* 全局配置结构 */
typedef struct {
ComXf_TransformationConfigType ComXfTransformation;
uint16 ComXfSignalGroupCount;
const ComXf_SignalGroupConfigType* ComXfSignalGroups;
} ComXf_ConfigType;
3 数据转换过程
3.1 序列化与反序列化流程
下图展示了COM Based Transformer在数据发送和接收过程中的交互流程:
发送数据序列:
-
应用程序调用RTE接口发送数据
- 应用层软件组件通过RTE接口提出数据发送请求
- RTE处理请求并准备调用变换器链
-
调用转换函数处理数据
- RTE调用ComXf_函数
- 转换器作为链中的第一个转换器处理结构化数据的序列化
- 根据配置,执行SenderReceiver接口数据元素的序列化
- 处理数据对齐和字节序问题
- 处理数组表示中的空隙,按照ComTxIPduUnusedAreasDefault设置填充值
-
将序列化数据传递给COM模块
- 转换后的数据传递给COM模块
- COM模块返回操作结果
- 转换器将结果返回给RTE
- RTE将结果返回给应用程序
接收数据序列:
-
应用程序请求接收数据
- 应用层软件组件通过RTE接口请求接收数据
- RTE处理请求并准备数据接收流程
-
接收PDU数据
- RTE从COM模块接收PDU原始数据
- 准备进行数据转换
-
调用反向转换函数
- RTE调用ComXf_Inv_函数
- 转换器作为链中的最后一个转换器处理序列化数据的反序列化
- 根据信号组配置反序列化数据
- 处理字节序和符号扩展
- 将反序列化数据映射到SenderReceiver接口的数据元素
- 反序列化后的数据返回给RTE
- RTE将接收到的数据返回给应用程序
/* 序列化函数示例 */
Std_ReturnType ComXf_Serialize(
const void* sourceDataPtr,
uint16 sourceDataLength,
void* targetDataPtr,
uint16 targetDataLength,
uint16* usedTargetLength)
{
Std_ReturnType result = E_NOT_OK;
uint8* source = (uint8*)sourceDataPtr;
uint8* target = (uint8*)targetDataPtr;
/* 参数检查 */
if (sourceDataPtr == NULL || targetDataPtr == NULL || usedTargetLength == NULL) {
return E_NOT_OK;
}
/* 序列化处理 - 遍历数据元素并应用转换 */
/* 这里是简化示例,实际实现更复杂 */
for (uint16 i = 0; i < sourceDataLength && i < targetDataLength; i++) {
/* 应用字节序转换等处理 */
target[i] = source[i];
}
/* 设置使用的目标长度 */
*usedTargetLength = (sourceDataLength < targetDataLength) ?
sourceDataLength : targetDataLength;
return E_OK;
}
/* 反序列化函数示例 */
Std_ReturnType ComXf_Deserialize(
const void* sourceDataPtr,
uint16 sourceDataLength,
void* targetDataPtr,
uint16 targetDataLength,
uint16* usedTargetLength)
{
/* 类似于序列化函数,但逻辑相反 */
/* 反序列化处理 */
return E_OK;
}
3.2 状态转换
下图展示了COM Based Transformer的各种状态和状态转换过程:
状态 未初始化:
- 描述: 系统启动后转换器的初始状态,包括等待初始化、正在初始化、初始化失败和初始化完成几个子状态
- 特点: 在此状态下,所有转换器功能无法使用
- 转换条件:
- ComXf_Init函数调用触发从等待初始化到正在初始化的状态变化
- 初始化成功则进入已初始化状态
- 初始化失败则停留在未初始化状态的初始化失败子状态
状态 已初始化:
- 描述: 转换器初始化成功后的工作状态,包括空闲、正在序列化和正在反序列化几个子状态
- 特点: 在此状态下,转换器可以执行序列化和反序列化操作
- 转换条件:
- ComXf_调用触发从空闲到正在序列化的状态变化
- ComXf_Inv_调用触发从空闲到正在反序列化的状态变化
- 序列化或反序列化完成后返回空闲状态
- ComXf_DeInit调用触发从已初始化到终止状态的变化
子状态 正在序列化:
- 描述: 执行序列化操作的过程,包括处理数据元素、应用转换规则、填充数据缓冲区和序列化完成几个步骤
- 功能: 在此过程中执行字节序转换、符号扩展和处理数组表示中的空隙区域
- 完成条件: 所有数据元素处理完毕后进入序列化完成状态,然后返回空闲状态
子状态 正在反序列化:
- 描述: 执行反序列化操作的过程,包括解析输入缓冲区、应用反向转换规则、填充数据元素和反序列化完成几个步骤
- 功能: 在此过程中根据信号组配置反序列化数据,处理字节序和符号扩展,并将数据映射到SenderReceiver接口
- 完成条件: 输入缓冲区处理完毕后进入反序列化完成状态,然后返回空闲状态
/* 状态管理函数示例 */
typedef enum {
COMXF_STATE_UNINIT,
COMXF_STATE_INIT_PENDING,
COMXF_STATE_INIT_FAILED,
COMXF_STATE_IDLE,
COMXF_STATE_SERIALIZING,
COMXF_STATE_DESERIALIZING
} ComXf_StateType;
/* 当前模块状态 */
static ComXf_StateType ComXf_CurrentState = COMXF_STATE_UNINIT;
/* 初始化函数 */
void ComXf_Init(void) {
/* 状态转换: UNINIT -> INIT_PENDING */
ComXf_CurrentState = COMXF_STATE_INIT_PENDING;
/* 执行初始化操作 */
boolean initSuccess = TRUE;
/* 初始化内部数据结构和缓冲区 */
/* 根据初始化结果更新状态 */
if (initSuccess) {
ComXf_CurrentState = COMXF_STATE_IDLE;
} else {
ComXf_CurrentState = COMXF_STATE_INIT_FAILED;
}
}
/* 反初始化函数 */
void ComXf_DeInit(void) {
/* 只有在已初始化状态下才能执行反初始化 */
if (ComXf_CurrentState != COMXF_STATE_UNINIT &&
ComXf_CurrentState != COMXF_STATE_INIT_FAILED) {
/* 清理资源 */
/* 重置状态 */
ComXf_CurrentState = COMXF_STATE_UNINIT;
}
}
/* 序列化函数 */
Std_ReturnType ComXf_Serialize(/* 参数 */) {
Std_ReturnType result = E_NOT_OK;
/* 检查状态 */
if (ComXf_CurrentState == COMXF_STATE_IDLE) {
/* 更新状态 */
ComXf_CurrentState = COMXF_STATE_SERIALIZING;
/* 执行序列化操作 */
/* ... */
/* 恢复空闲状态 */
ComXf_CurrentState = COMXF_STATE_IDLE;
result = E_OK;
}
return result;
}
4 错误处理
COM Based Transformer模块根据AUTOSAR标准对错误进行分类和处理。主要包括以下几类错误:
-
开发错误
- 描述: 在开发过程中可能出现的错误,如参数无效、未初始化调用等
- 处理方式: 使用开发错误报告机制(DET)检测和报告
- 示例错误码: COMXF_E_UNINIT, COMXF_E_PARAM_INVALID
-
运行时错误
- 描述: 在运行时可能出现的错误,如配置不匹配、缓冲区溢出等
- 处理方式: 返回特定的错误代码,通过返回值指示错误
- 示例错误码: E_NOT_OK, COMXF_E_BUFFER_OVERFLOW
-
瞬态故障
- 描述: 可能自行恢复的临时错误,如暂时资源不足
- 处理方式: 返回特定错误代码,允许操作重试
-
生产错误
- 描述: 在生产环境中可能出现的严重错误
- 处理方式: 使用生产错误报告机制报告错误并采取失效处理措施
/* 错误处理示例 */
#define COMXF_E_UNINIT 0x01U /* 模块未初始化 */
#define COMXF_E_PARAM_INVALID 0x02U /* 参数无效 */
#define COMXF_E_BUFFER_OVERFLOW 0x03U /* 缓冲区溢出 */
/* 错误报告函数 */
static void ReportError(uint8 errorId, uint8 instanceId) {
/* 调用开发错误跟踪函数 */
#if (COMXF_DEV_ERROR_DETECT == STD_ON)
Det_ReportError(COMXF_MODULE_ID, instanceId, 0, errorId);
#endif
}
/* 使用错误处理的函数示例 */
Std_ReturnType ComXf_Function(uint8 param1, void* dataPtr) {
/* 检查初始化状态 */
if (ComXf_CurrentState == COMXF_STATE_UNINIT) {
ReportError(COMXF_E_UNINIT, 0);
return E_NOT_OK;
}
/* 参数检查 */
if (dataPtr == NULL) {
ReportError(COMXF_E_PARAM_INVALID, 0);
return E_NOT_OK;
}
/* 实际功能实现 */
return E_OK;
}
5 API规范
5.1 函数定义
COM Based Transformer模块提供以下关键API函数:
-
ComXf_
- 功能: 序列化函数,将结构化数据转换为线性表示
- 调用时机: 由RTE在数据发送过程中调用
- 参数:
- sourceDataPtr: 指向源数据的指针
- sourceDataLength: 源数据长度
- targetDataPtr: 指向目标缓冲区的指针
- targetDataLength: 目标缓冲区长度
- usedTargetLength: 用于返回实际使用的目标缓冲区长度
- 返回值: Std_ReturnType,表示操作是否成功
-
ComXf_Inv_
- 功能: 反序列化函数,将线性数据转换回结构化表示
- 调用时机: 由RTE在数据接收过程中调用
- 参数:
- sourceDataPtr: 指向源数据的指针
- sourceDataLength: 源数据长度
- targetDataPtr: 指向目标缓冲区的指针
- targetDataLength: 目标缓冲区长度
- usedTargetLength: 用于返回实际使用的目标缓冲区长度
- 返回值: Std_ReturnType,表示操作是否成功
-
ComXf_Init
- 功能: 初始化COM Based Transformer模块
- 调用时机: 在系统启动过程中调用
- 参数: 无
- 返回值: 无
-
ComXf_DeInit
- 功能: 反初始化COM Based Transformer模块
- 调用时机: 在系统关闭过程中调用
- 参数: 无
- 返回值: 无
-
ComXf_GetVersionInfo
- 功能: 获取COM Based Transformer模块的版本信息
- 调用时机: 在需要版本信息时调用
- 参数:
- versioninfo: 指向版本信息结构的指针
- 返回值: 无
/* API函数定义示例 */
/* 序列化函数 */
Std_ReturnType ComXf_MyTransformerId(
const void* sourceDataPtr,
uint16 sourceDataLength,
void* targetDataPtr,
uint16 targetDataLength,
uint16* usedTargetLength)
{
/* 实现省略 */
return E_OK;
}
/* 反序列化函数 */
Std_ReturnType ComXf_Inv_MyTransformerId(
const void* sourceDataPtr,
uint16 sourceDataLength,
void* targetDataPtr,
uint16 targetDataLength,
uint16* usedTargetLength)
{
/* 实现省略 */
return E_OK;
}
/* 初始化函数 */
void ComXf_Init(void)
{
/* 实现省略 */
}
/* 反初始化函数 */
void ComXf_DeInit(void)
{
/* 实现省略 */
}
/* 获取版本信息 */
void ComXf_GetVersionInfo(Std_VersionInfoType* versioninfo)
{
/* 实现省略 */
}
6 配置参数
COM Based Transformer的配置主要基于ECU配置,遵循以下参数和条件:
-
转换技术参数
- protocol: 必须设置为"COM-Based"
- version: 必须设置为"1.0.0"
- transformerClass: 必须设置为"serializer"
-
支持的数据类型
- 支持COM模块支持的所有基本数据类型,但不包括UINT8_DYN
-
信号组配置
- COM Based Transformer根据以下信息确定序列化逻辑:
- Software Components PortPrototype
- SenderReceiverInterface的dataElement列表
- SenderReceiverToSignalGroupMapping
- SystemSignalGroup的ISignalToIPduMapping
- COM Based Transformer根据以下信息确定序列化逻辑:
-
数据位置和偏移
- COM配置隐式定义信号组长度和起始位置
- 转换器需要根据ComGroupSignal在ComIPdu中的位置和头部数据引入的偏移进行处理
-
空隙处理
- 如果信号组数组表示中存在空隙,这些空隙将使用相应ComTxIPdu的ComTxIPduUnusedAreasDefault值填充
-
兼容性支持
- 支持接受比预期更大的数组表示,忽略追加在已知参数列表末尾的数据元素
/* 配置示例 */
/* 这是一个简化的配置示例,实际AUTOSAR配置通常以XML形式定义 */
/* COM Based Transformer配置结构 */
const ComXf_ConfigType ComXfConfiguration = {
/* 转换技术配置 */
.ComXfTransformation = {
.ComXfTransformerClass = COMXF_SERIALIZER,
.ComXfProtocolType = COMXF_PROTOCOL_COM_BASED,
.ComXfVersion = {1, 0, 0}
},
/* 信号组配置 */
.ComXfSignalGroupCount = 2,
.ComXfSignalGroups = &ComXfSignalGroupsConfig
};
/* 信号组配置数组 */
const ComXf_SignalGroupConfigType ComXfSignalGroupsConfig[2] = {
{
.ComXfGroupId = 0,
.ComXfSignalCount = 3,
.ComXfSignals = &ComXfSignals1
},
{
.ComXfGroupId = 1,
.ComXfSignalCount = 2,
.ComXfSignals = &ComXfSignals2
}
};
/* 第一个信号组的信号配置 */
const ComXf_SignalConfigType ComXfSignals1[3] = {
{
.ComXfSignalId = 0,
.ComXfSignalLength = 16,
.ComXfByteOrder = COMXF_BIG_ENDIAN,
.ComXfSignExtension = FALSE,
.ComXfStartPosition = 0
},
/* 其他信号配置 */
};
/* 第二个信号组的信号配置 */
const ComXf_SignalConfigType ComXfSignals2[2] = {
/* 信号配置 */
};
7 总结
COM Based Transformer作为AUTOSAR架构中的关键组件,提供了在RTE中发送和接收数据时链接任意变换器的功能。它专注于将结构化数据序列化为线性形式,并在接收端执行反向过程。
COM Based Transformer的主要优势包括:
-
标准化接口
- 符合AUTOSAR标准的API设计
- 与RTE和COM模块无缝集成
- 提供清晰的初始化和操作流程
-
灵活的数据处理
- 支持几乎所有COM模块支持的基本数据类型
- 能够处理不同的字节序和符号扩展
- 处理数组表示中的空隙区域
-
错误处理机制
- 符合AUTOSAR标准的错误分类和处理
- 详细的错误报告和跟踪
-
配置灵活性
- 基于ECU配置,适应不同应用场景
- 支持向后兼容性,提高系统稳定性
COM Based Transformer在AUTOSAR架构中扮演着重要角色,为软件组件之间的通信提供了可靠的数据转换机制,是实现标准化车载软件架构的关键环节。