AUTOSAR进阶图解==>AUTOSAR_SWS_COMBasedTransformer

AUTOSAR COM Based Transformer 详解

基于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

类 BufferProperties:

  • 功能: 定义转换器缓冲区的属性
  • 关键属性:
    • transformationDescription:
      • 描述: 转换过程的描述文本
      • 类型: String
    • hasInternalState:
      • 描述: 指示转换器是否维护内部状态
      • 类型: Boolean
    • needsOriginalData:
      • 描述: 指示转换是否需要原始数据
      • 类型: Boolean

类 SwDataDefProps:

  • 功能: 定义信号的数据类型属性
  • 关键属性:
    • dataTypePolicy:
      • 描述: 数据类型策略
      • 类型: DataTypePolicyEnum
    • iSignalType:
      • 描述: I-信号类型
      • 类型: ISignalTypeEnum
      • 可选性: 可选[0…1]
    • length:
      • 描述: 数据长度
      • 类型: Integer
    • dynamicLength:
      • 描述: 指示数据长度是否动态
      • 类型: Boolean

类 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在数据发送和接收过程中的交互流程:

在这里插入图片描述

发送数据序列:

  1. 应用程序调用RTE接口发送数据

    • 应用层软件组件通过RTE接口提出数据发送请求
    • RTE处理请求并准备调用变换器链
  2. 调用转换函数处理数据

    • RTE调用ComXf_函数
    • 转换器作为链中的第一个转换器处理结构化数据的序列化
    • 根据配置,执行SenderReceiver接口数据元素的序列化
    • 处理数据对齐和字节序问题
    • 处理数组表示中的空隙,按照ComTxIPduUnusedAreasDefault设置填充值
  3. 将序列化数据传递给COM模块

    • 转换后的数据传递给COM模块
    • COM模块返回操作结果
    • 转换器将结果返回给RTE
    • RTE将结果返回给应用程序

接收数据序列:

  1. 应用程序请求接收数据

    • 应用层软件组件通过RTE接口请求接收数据
    • RTE处理请求并准备数据接收流程
  2. 接收PDU数据

    • RTE从COM模块接收PDU原始数据
    • 准备进行数据转换
  3. 调用反向转换函数

    • 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标准对错误进行分类和处理。主要包括以下几类错误:

  1. 开发错误

    • 描述: 在开发过程中可能出现的错误,如参数无效、未初始化调用等
    • 处理方式: 使用开发错误报告机制(DET)检测和报告
    • 示例错误码: COMXF_E_UNINIT, COMXF_E_PARAM_INVALID
  2. 运行时错误

    • 描述: 在运行时可能出现的错误,如配置不匹配、缓冲区溢出等
    • 处理方式: 返回特定的错误代码,通过返回值指示错误
    • 示例错误码: E_NOT_OK, COMXF_E_BUFFER_OVERFLOW
  3. 瞬态故障

    • 描述: 可能自行恢复的临时错误,如暂时资源不足
    • 处理方式: 返回特定错误代码,允许操作重试
  4. 生产错误

    • 描述: 在生产环境中可能出现的严重错误
    • 处理方式: 使用生产错误报告机制报告错误并采取失效处理措施
/* 错误处理示例 */
#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函数:

  1. ComXf_

    • 功能: 序列化函数,将结构化数据转换为线性表示
    • 调用时机: 由RTE在数据发送过程中调用
    • 参数:
      • sourceDataPtr: 指向源数据的指针
      • sourceDataLength: 源数据长度
      • targetDataPtr: 指向目标缓冲区的指针
      • targetDataLength: 目标缓冲区长度
      • usedTargetLength: 用于返回实际使用的目标缓冲区长度
    • 返回值: Std_ReturnType,表示操作是否成功
  2. ComXf_Inv_

    • 功能: 反序列化函数,将线性数据转换回结构化表示
    • 调用时机: 由RTE在数据接收过程中调用
    • 参数:
      • sourceDataPtr: 指向源数据的指针
      • sourceDataLength: 源数据长度
      • targetDataPtr: 指向目标缓冲区的指针
      • targetDataLength: 目标缓冲区长度
      • usedTargetLength: 用于返回实际使用的目标缓冲区长度
    • 返回值: Std_ReturnType,表示操作是否成功
  3. ComXf_Init

    • 功能: 初始化COM Based Transformer模块
    • 调用时机: 在系统启动过程中调用
    • 参数: 无
    • 返回值: 无
  4. ComXf_DeInit

    • 功能: 反初始化COM Based Transformer模块
    • 调用时机: 在系统关闭过程中调用
    • 参数: 无
    • 返回值: 无
  5. 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配置,遵循以下参数和条件:

  1. 转换技术参数

    • protocol: 必须设置为"COM-Based"
    • version: 必须设置为"1.0.0"
    • transformerClass: 必须设置为"serializer"
  2. 支持的数据类型

    • 支持COM模块支持的所有基本数据类型,但不包括UINT8_DYN
  3. 信号组配置

    • COM Based Transformer根据以下信息确定序列化逻辑:
      • Software Components PortPrototype
      • SenderReceiverInterface的dataElement列表
      • SenderReceiverToSignalGroupMapping
      • SystemSignalGroup的ISignalToIPduMapping
  4. 数据位置和偏移

    • COM配置隐式定义信号组长度和起始位置
    • 转换器需要根据ComGroupSignal在ComIPdu中的位置和头部数据引入的偏移进行处理
  5. 空隙处理

    • 如果信号组数组表示中存在空隙,这些空隙将使用相应ComTxIPdu的ComTxIPduUnusedAreasDefault值填充
  6. 兼容性支持

    • 支持接受比预期更大的数组表示,忽略追加在已知参数列表末尾的数据元素
/* 配置示例 */
/* 这是一个简化的配置示例,实际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的主要优势包括:

  1. 标准化接口

    • 符合AUTOSAR标准的API设计
    • 与RTE和COM模块无缝集成
    • 提供清晰的初始化和操作流程
  2. 灵活的数据处理

    • 支持几乎所有COM模块支持的基本数据类型
    • 能够处理不同的字节序和符号扩展
    • 处理数组表示中的空隙区域
  3. 错误处理机制

    • 符合AUTOSAR标准的错误分类和处理
    • 详细的错误报告和跟踪
  4. 配置灵活性

    • 基于ECU配置,适应不同应用场景
    • 支持向后兼容性,提高系统稳定性

COM Based Transformer在AUTOSAR架构中扮演着重要角色,为软件组件之间的通信提供了可靠的数据转换机制,是实现标准化车载软件架构的关键环节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiGer666

慧眼~施主!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值