AUTOSAR COM Based Transformer(ComXf)详解:配置模型、序列化流程与工程排查
基于 AUTOSAR Classic Platform R25-11《Specification of COM Based Transformer》整理,并结合当前工程中的 COM、RTE 和 PduR 代码进行说明。
规范依据:AUTOSAR CP R25-11,
AUTOSAR_CP_SWS_COMBasedTransformer,Document ID 662。
目录
1. 概述
1.1 ComXf 的作用
COM Based Transformer 是 AUTOSAR RTE Transformer 链中的序列化 Transformer。它把软件组件(SWC)侧的复合数据转换为按照通信矩阵定义的线性 uint8 数组,再交给 COM 放入 Signal Group 对应的 I-PDU;接收侧执行相反过程。
text
发送:SWC 复合数据
-> RTE Transformer Chain
-> ComXf_<transformerId>
-> uint8 数组
-> Com_SendSignalGroupArray
-> COM I-PDU Buffer
-> PduR / CanIf / 总线
接收:总线 I-PDU
-> COM I-PDU Buffer
-> Com_ReceiveSignalGroupArray
-> uint8 数组
-> ComXf_Inv_<transformerId>
-> RTE Transformer Chain
-> SWC 复合数据
从 SWC 角度看,Transformer 对通信是透明的。SWC 只处理原始数据元素,RTE 负责执行配置的 Transformer 链,COM 负责把线性数组放入或取出 I-PDU。
1.2 适用范围
规范定义的 COM Based Transformer 适用于:
- 固定通信矩阵;
- 固定长度的复合数据;
- COM Signal Group 数组访问;
- 通过通信矩阵确定信号组内每个元素的布局、字节序和位置;
- RTE 中需要与其他 Transformer 串联的 Sender/Receiver 通信。
1.3 规范限制
COM Based Transformer 有明确边界:
- 不支持 Client-Server 通信;
- 不支持 external trigger communication;
- 只支持复合数据类型,通常对应 COM Signal Group;
- 只支持固定长度数据;
- Signal Group 必须按字节对齐;
- 只允许作为发送侧 Transformer 链的第一个 Transformer;
- 接收侧对应为最后一个执行的反序列化 Transformer;
- 不支持
UINT8_DYN作为其基础数据类型; - 线性数组中的未映射间隙需要使用 COM 配置的未使用区域默认值填充。
如果需要对单个基本数据元素使用 COM Based Transformer,规范建议把该元素封装成只包含一个成员的结构,使其在系统模型中作为复合数据和 Signal Group 处理。
2. 模块架构与工程现状
2.1 AUTOSAR 逻辑架构
#mermaid-svg-wmFG4Jt8Adsf1PN3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .error-icon{fill:#552222;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .marker.cross{stroke:#333333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 p{margin:0;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster-label text{fill:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster-label span{color:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster-label span p{background-color:transparent;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .label text,#mermaid-svg-wmFG4Jt8Adsf1PN3 span{fill:#333;color:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .node rect,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node circle,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node ellipse,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node polygon,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .rough-node .label text,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node .label text,#mermaid-svg-wmFG4Jt8Adsf1PN3 .image-shape .label,#mermaid-svg-wmFG4Jt8Adsf1PN3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .rough-node .label,#mermaid-svg-wmFG4Jt8Adsf1PN3 .node .label,#mermaid-svg-wmFG4Jt8Adsf1PN3 .image-shape .label,#mermaid-svg-wmFG4Jt8Adsf1PN3 .icon-shape .label{text-align:center;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .node.clickable{cursor:pointer;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .arrowheadPath{fill:#333333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wmFG4Jt8Adsf1PN3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wmFG4Jt8Adsf1PN3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster text{fill:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .cluster span{color:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wmFG4Jt8Adsf1PN3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .icon-shape,#mermaid-svg-wmFG4Jt8Adsf1PN3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .icon-shape p,#mermaid-svg-wmFG4Jt8Adsf1PN3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .icon-shape .label rect,#mermaid-svg-wmFG4Jt8Adsf1PN3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wmFG4Jt8Adsf1PN3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wmFG4Jt8Adsf1PN3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wmFG4Jt8Adsf1PN3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复合数据
线性 uint8 数组
增强后的数组
Com_SendSignalGroupArray
Com_ReceiveSignalGroupArray
反序列化数据
Application SWC
RTE Transformer Chain
COM Based Transformer
ComXf_
E2E / Safety / Other Transformer
COM
Signal Group Array API
PduR
CanIf / FrIf / LinIf
通信总线
COM Based Transformer 与 E2E、Security 或其他 Transformer 的关系取决于 Transformer 链配置。典型发送顺序是:
text
COM Based Serializer -> E2E / Security / Custom Transformer -> COM
接收时顺序反向:
text
COM -> E2E / Security / Custom Inverse Transformer -> COM Based Deserializer
COM Based Transformer 必须是发送链第一项。原因是它负责把结构化数据转换成线性字节布局,后续 Transformer 才能在字节数组上追加头部、尾部、CRC、计数器或安全信息。
2.2 当前工程的实际证据
当前工程扫描结果如下:
| 工程位置 | 证据 | 结论 |
|---|---|---|
BSWL\_gen\RTE\Rte.h |
定义 Rte_TransformerError、RTE_TRANSFORMER_SERIALIZER、RTE_TRANSFORMER_SAFETY 等类型 |
RTE 具备通用 Transformer 类型和错误模型 |
BSWL\BSW\Com\api\Com.h |
声明 Com_SendSignalGroupArray、Com_ReceiveSignalGroupArray |
COM 提供 Signal Group 数组接口 |
BSWL\BSW\Com\src\Com_SendSignalGroupArray.c |
函数受 #ifdef COM_TX_SIGNALGROUP_ARRAY 保护 |
发送数组 API 是否存在取决于有效宏 |
BSWL\BSW\Com\src\Com_ReceiveSignalGroupArray.c |
函数受 #ifdef COM_RX_SIGNALGROUP_ARRAY 保护 |
接收数组 API 是否存在取决于有效宏 |
BSWL\_gen\BSW\Com\Com_Cfg.h |
COM_TX_SIGNALGROUP、COM_RX_SIGNALGROUP 为注释,未见数组开关定义 |
当前生成配置未证明已启用 Signal Group Array |
| 工程全局扫描 | 未找到 ComXf_<transformerId>、ComXf_Inv_<transformerId> 或独立 ComXf 生成文件 |
当前工程未发现已生成的 COM Based Transformer 实例 |
因此,当前工程可以确认"COM 层存在 Signal Group Array 的实现代码",但不能据此直接确认"当前 ECU 已启用 COM Based Transformer"。必须继续核对实际编译命令、包含的配置头、RTE 生成输出以及系统配置源文件。
2.3 当前工程的实际 COM 数组发送路径
当前实现中的 Com_SendSignalGroupArray 逻辑为:
- 检查 COM 是否初始化;
- 检查输入指针和 Signal Group ID;
- 将外部 Signal Group ID 映射为内部 ID;
- 检查该 Signal Group 是否启用 ArrayAccess;
- 检查 TP 大数据发送是否正在进行;
- 根据
firstByteNo和length把数组复制到 COM I-PDU Buffer; - 如配置了 Triggered-on-change,比较相关 GroupSignal;
- 调用内部 Signal Group 发送逻辑。
对应代码中的关键行为是:
c
Com_ByteCopy(
txIpduConstPtr_pcst->buffPtr_pu8 + txSigGrpArrayConstPtr_pcst->firstByteNo_uo,
signalGroupArrayPtr_pcu8,
txSigGrpArrayConstPtr_pcst->length_uo);
这说明 COM 数组接口本身并不负责把 C 结构体序列化为数组;它接收的输入必须已经是符合 Signal Group 数组表示的线性字节序列。这正是 ComXf 的职责。
2.4 当前工程的实际 COM 数组接收路径
当前实现中的 Com_ReceiveSignalGroupArray 逻辑为:
- 检查 COM 状态、输出指针和 Signal Group ID;
- 把外部 Signal Group ID 映射为内部 ID;
- 检查 ArrayAccess;
- 找到对应 I-PDU 和接收主函数缓存;
- 检查 I-PDU 是否处于可接收状态;
- 将接收 Signal Group 数组缓存复制到调用者缓冲区。
对应实现通过 firstByteNo 和最后字节位置计算数组复制长度。这个长度必须与 RTE Transformer 申请的缓冲区布局一致,否则会产生字段错位、越界或尾部数据未更新等问题。
3. 配置对象关系
3.1 配置对象实体关系图
下面的图按照截图中的配置对象风格,使用实体框、属性行和关系线描述 COM Based Transformer 的关键配置链路。
#mermaid-svg-wSbjzTkMhPwFnOFz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wSbjzTkMhPwFnOFz .error-icon{fill:#552222;}#mermaid-svg-wSbjzTkMhPwFnOFz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wSbjzTkMhPwFnOFz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wSbjzTkMhPwFnOFz .marker.cross{stroke:#333333;}#mermaid-svg-wSbjzTkMhPwFnOFz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wSbjzTkMhPwFnOFz p{margin:0;}#mermaid-svg-wSbjzTkMhPwFnOFz .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-wSbjzTkMhPwFnOFz .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-wSbjzTkMhPwFnOFz .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-wSbjzTkMhPwFnOFz .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-wSbjzTkMhPwFnOFz .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-wSbjzTkMhPwFnOFz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wSbjzTkMhPwFnOFz .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-wSbjzTkMhPwFnOFz .node rect,#mermaid-svg-wSbjzTkMhPwFnOFz .node circle,#mermaid-svg-wSbjzTkMhPwFnOFz .node ellipse,#mermaid-svg-wSbjzTkMhPwFnOFz .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wSbjzTkMhPwFnOFz .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-wSbjzTkMhPwFnOFz .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-wSbjzTkMhPwFnOFz .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wSbjzTkMhPwFnOFz .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-wSbjzTkMhPwFnOFz .edgeLabel .label text{fill:#333;}#mermaid-svg-wSbjzTkMhPwFnOFz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} aligns_with
defines
generates
configures
configures
uses
maps
references
realizes
references
maps_to
maps_to
belongs_to
chains
reserves
executed_by
calls
uses_array_layout
routed_by
ECUC_COMXf
string
apiServicePrefix
boolean
postBuildVariantSupport
string
configurationVariant
COM_CONFIGURATION
boolean
SignalGroupArrayApi
boolean
MetaDataSupport
enum
ConfigurationVariant
string
ConfigSet
SWC_PORT
string
PortPrototype
string
CommunicationType
string
DataElementType
SENDER_RECEIVER_INTERFACE
string
InterfaceName
string
DataElementList
string
CompositeDataType
SYSTEM_MAPPING
string
DataElementRef
string
SystemSignalGroupRef
string
TypeMapping
SYSTEM_SIGNAL_GROUP
string
SystemSignalGroupRef
string
SystemSignalList
string
TransformingSystemSignal
ISIGNAL_GROUP
string
ISignalGroupRef
string
ComBasedTransformationRef
boolean
ByteAligned
uint32
GroupLengthBits
COM_SIGNAL_GROUP
uint16
SignalGroupId
boolean
ArrayAccess
uint16
FirstByte
uint16
Length
ISIGNAL_TO_IPDU_MAPPING
string
SignalGroupRef
uint32
StartPosition
enum
PackingByteOrder
uint32
UpdateBitPosition
COM_IPDU
uint16
PduId
uint16
Length
uint8
UnusedAreaDefault
enum
TransmissionMode
DATA_TRANSFORMATION
string
DataTransformationRef
enum
DataTransformationKind
boolean
ExecuteDespiteNoData
string
TransformerChain
TRANSFORMATION_TECHNOLOGY
string
Protocol
string
Version
enum
TransformerClass
boolean
HasInternalState
boolean
NeedsOriginalData
BUFFER_PROPERTIES
uint32
HeaderLengthBits
boolean
InPlace
COMXF_API
string
SerializeApi
string
DeserializeApi
uint8
ServiceId
enum
ReturnCode
RTE
string
TransformerChainOrder
uint32
BufferLength
enum
ErrorClass
PduR_ROUTE
uint16
SourcePduId
uint16
DestinationPduId
enum
RoutingType
3.2 对象阅读方式
ECUC_COMXf:ComXf 模块的 ECUC 定义,规范要求 API 前缀为ComXf。COM_CONFIGURATION:真正决定 Signal Group 数组长度、起始位置和 I-PDU 布局的 COM 配置。SENDER_RECEIVER_INTERFACE:定义 SWC 侧复合数据元素。SYSTEM_MAPPING:把 Sender/Receiver 数据元素映射到 System Signal Group。SYSTEM_SIGNAL_GROUP:在系统模型中保持一组信号的原子性。ISIGNAL_GROUP:定义网络侧 Signal Group,并引用comBasedSignalGroupTransformation。DATA_TRANSFORMATION:有序的 Transformer 链。TRANSFORMATION_TECHNOLOGY:链中的具体 Transformer,COM Based Transformer 的关键属性是protocol = COM-Based、version = 1.0.0、transformerClass = serializer。COM_SIGNAL_GROUP:COM ECUC 侧数组访问对象,必须启用 ArrayAccess 才能使用数组 API。ISIGNAL_TO_IPDU_MAPPING:决定 Signal Group 在 I-PDU 中的起始位置、长度和布局。COM_IPDU:承载 Signal Group 的 I-PDU,包含长度、未使用区域默认值和传输模式。RTE:执行 Transformer 链并提供输入/输出缓冲区。PduR_ROUTE:ComXf 和 COM 完成数组操作之后,PduR 只负责正常 I-PDU 路由。
3.3 配置一致性要求
以下关系必须同时满足:
- SWC 复合数据元素必须映射到
SystemSignalGroup。 ISignalGroup必须引用相应的 COM BasedDataTransformation。- COM Signal Group 必须配置数组访问能力。
- Signal Group 必须有确定的
firstByte和length。 - Signal Group 的布局必须满足字节对齐要求。
- COM I-PDU 长度必须覆盖 Signal Group 的起始位置和数组长度。
- Transformer 链中的 COM Based Transformer 必须排在第一位。
- RTE 缓冲长度必须覆盖所有 Transformer 使用的输入、输出、头部和尾部空间。
- COM 的 Post-Build 配置时,ComXf 对应配置也必须是 Post-Build。
- PduR 的源 PDU ID 必须对应 COM 产生的实际 Tx PDU。
4. 序列化与反序列化流程
4.1 发送流程
CanIf / Lower Layer PduR COM E2E / Other Transformer ComXf_<transformerId> RTE Application SWC CanIf / Lower Layer PduR COM E2E / Other Transformer ComXf_<transformerId> RTE Application SWC #mermaid-svg-adwj1nfUQ4bhpF5s{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-adwj1nfUQ4bhpF5s .error-icon{fill:#552222;}#mermaid-svg-adwj1nfUQ4bhpF5s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-adwj1nfUQ4bhpF5s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-adwj1nfUQ4bhpF5s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-adwj1nfUQ4bhpF5s .marker.cross{stroke:#333333;}#mermaid-svg-adwj1nfUQ4bhpF5s svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-adwj1nfUQ4bhpF5s p{margin:0;}#mermaid-svg-adwj1nfUQ4bhpF5s .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-adwj1nfUQ4bhpF5s text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-adwj1nfUQ4bhpF5s .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-adwj1nfUQ4bhpF5s .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-adwj1nfUQ4bhpF5s #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-adwj1nfUQ4bhpF5s .sequenceNumber{fill:white;}#mermaid-svg-adwj1nfUQ4bhpF5s #sequencenumber{fill:#333;}#mermaid-svg-adwj1nfUQ4bhpF5s #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-adwj1nfUQ4bhpF5s .messageText{fill:#333;stroke:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-adwj1nfUQ4bhpF5s .labelText,#mermaid-svg-adwj1nfUQ4bhpF5s .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .loopText,#mermaid-svg-adwj1nfUQ4bhpF5s .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-adwj1nfUQ4bhpF5s .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-adwj1nfUQ4bhpF5s .noteText,#mermaid-svg-adwj1nfUQ4bhpF5s .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-adwj1nfUQ4bhpF5s .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-adwj1nfUQ4bhpF5s .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-adwj1nfUQ4bhpF5s .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-adwj1nfUQ4bhpF5s .actorPopupMenu{position:absolute;}#mermaid-svg-adwj1nfUQ4bhpF5s .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-adwj1nfUQ4bhpF5s .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-adwj1nfUQ4bhpF5s .actor-man circle,#mermaid-svg-adwj1nfUQ4bhpF5s line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-adwj1nfUQ4bhpF5s :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Rte_Write(DataElement) 结构化 dataElement 按 COM Signal Group 布局序列化 uint8 数组 + bufferLength 传递线性数组 增加 CRC / Counter / Header 等 Com_SendSignalGroupArray(SignalGroupId, buffer) 检查 ArrayAccess、复制到 I-PDU Buffer PduR_ComTransmit(TxPduId, PduInfo) Lower_Transmit TxConfirmation Com_TxConfirmation
ComXf 的序列化要点:
- 每个 Sender/Receiver dataElement 按 COM 规则分别处理;
- 遵循 COM 的字节序转换和符号扩展规则;
- 使用 COM Signal Group 在 I-PDU 中定义的 bit/byte 位置;
- 为没有映射信号的空洞填充
ComTxIPduUnusedAreasDefault; - 为后续 Transformer 预留头部或尾部空间;
- 输出长度必须与 RTE 和 COM Signal Group Array 配置一致。
4.2 接收流程
Application SWC ComXf_Inv_<transformerId> E2E / Other Inverse Transformer RTE COM PduR CanIf / Lower Layer 通信总线 Application SWC ComXf_Inv_<transformerId> E2E / Other Inverse Transformer RTE COM PduR CanIf / Lower Layer 通信总线 #mermaid-svg-4UQX6AjwmJHr2h4L{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4UQX6AjwmJHr2h4L .error-icon{fill:#552222;}#mermaid-svg-4UQX6AjwmJHr2h4L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4UQX6AjwmJHr2h4L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4UQX6AjwmJHr2h4L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4UQX6AjwmJHr2h4L .marker.cross{stroke:#333333;}#mermaid-svg-4UQX6AjwmJHr2h4L svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4UQX6AjwmJHr2h4L p{margin:0;}#mermaid-svg-4UQX6AjwmJHr2h4L .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4UQX6AjwmJHr2h4L text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4UQX6AjwmJHr2h4L .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-4UQX6AjwmJHr2h4L .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-4UQX6AjwmJHr2h4L #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-4UQX6AjwmJHr2h4L .sequenceNumber{fill:white;}#mermaid-svg-4UQX6AjwmJHr2h4L #sequencenumber{fill:#333;}#mermaid-svg-4UQX6AjwmJHr2h4L #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-4UQX6AjwmJHr2h4L .messageText{fill:#333;stroke:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4UQX6AjwmJHr2h4L .labelText,#mermaid-svg-4UQX6AjwmJHr2h4L .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .loopText,#mermaid-svg-4UQX6AjwmJHr2h4L .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4UQX6AjwmJHr2h4L .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-4UQX6AjwmJHr2h4L .noteText,#mermaid-svg-4UQX6AjwmJHr2h4L .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-4UQX6AjwmJHr2h4L .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4UQX6AjwmJHr2h4L .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4UQX6AjwmJHr2h4L .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4UQX6AjwmJHr2h4L .actorPopupMenu{position:absolute;}#mermaid-svg-4UQX6AjwmJHr2h4L .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-4UQX6AjwmJHr2h4L .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4UQX6AjwmJHr2h4L .actor-man circle,#mermaid-svg-4UQX6AjwmJHr2h4L line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-4UQX6AjwmJHr2h4L :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 接收 I-PDU RxIndication Com_RxIndication 更新 I-PDU / Signal Group Array 缓存 Com_ReceiveSignalGroupArray(SignalGroupId, buffer) 线性 uint8 数组 执行逆向 Transformer 去除 CRC / Counter / Header ComXf_Inv_<transformerId>(buffer, length, dataElement) 按 COM 布局反序列化 结构化 dataElement Rte_Read(DataElement)
ComXf_Inv_<transformerId> 如果收到 buffer = NULL_PTR 且 bufferLength = 0,必须保持输出数据不变并返回 E_NO_DATA。这对应规范中的无数据场景,实际排查时不能把该返回值误判为普通序列化失败。
4.3 Transformer 链中的数据范围
一个 Signal Group 的数组可能同时包含:
- COM Based Transformer 负责的业务数据;
- E2E Transformer 负责的 CRC、Sequence Counter;
- 其他 Transformer 负责的头部或尾部;
- 没有对应信号的空洞区域;
- 由 COM 未使用区域默认值填充的字节。
因此,不能简单地认为"Signal Group 数组长度就是业务结构体大小"。实际长度应从 COM Signal Group 的 firstByte、length、I-PDU 映射以及 Transformer 链的缓冲预留共同确定。
5. API、缓冲区与数据布局
5.1 ComXf API
| API | 作用 | 规范返回值 |
|---|---|---|
ComXf_<transformerId> |
将结构化数据序列化为 uint8 数组 |
E_OK、E_SER_GENERIC_ERROR |
ComXf_Inv_<transformerId> |
将 uint8 数组反序列化为结构化数据 |
E_OK、E_NO_DATA、E_SER_GENERIC_ERROR |
ComXf_Init |
初始化 Transformer | 无返回值 |
ComXf_DeInit |
去初始化 Transformer | 无返回值 |
ComXf_GetVersionInfo |
读取版本信息 | 无返回值 |
典型原型:
c
uint8 ComXf_<transformerId>(
uint8 *buffer,
uint32 *bufferLength,
<paramtype> dataElement);
uint8 ComXf_Inv_<transformerId>(
const uint8 *buffer,
uint32 bufferLength,
<type> *dataElement);
所有 Transformer 实例函数是同步、可重入的;ComXf_Init 和 ComXf_DeInit 在规范中为同步且不可重入。
5.2 COM 数组 API 与工程实现
当前工程的 COM API 声明包括:
c
extern uint8 Com_SendSignalGroupArray(
Com_SignalGroupIdType idSignalGroup_u16,
const uint8 *signalGroupArrayPtr_pcu8);
extern uint8 Com_ReceiveSignalGroupArray(
Com_SignalGroupIdType idSignalGroup_u16,
uint8 *signalGroupArrayPtr_pu8);
实际代码中的重要条件:
| 条件 | 工程行为 |
|---|---|
| COM 未初始化 | 报告 COM_E_UNINIT,返回不可用 |
| 数组指针为空 | 报告 COM_E_PARAM_POINTER |
| Signal Group ID 非法 | 报告 COM_E_PARAM |
| ArrayAccess 未启用 | 不执行数组复制,返回不可用 |
| Tx 大数据传输进行中 | 发送数组可能返回 COM_BUSY |
| Rx I-PDU 已停止 | 接收 API 返回最后已知数据或初始化值 |
| Tx ArrayAccess 有效 | 按生成的 firstByteNo 和 length 复制到 I-PDU |
5.3 字节布局
COM Based Transformer 使用 COM 配置的布局,而不是自行创建一套独立布局。至少需要核对:
- Signal Group 起始字节;
- Signal Group 数组长度;
- 每个 GroupSignal 的位位置和位长度;
- Little Endian、Big Endian 或 Opaque 配置;
- I-PDU 未使用区域默认值;
- Transformer 头部和尾部的保留空间;
- COM I-PDU 的总长度;
- RTE 提供的实际 buffer 长度。
Signal Group 允许存在 gaps,但发送时 gaps 必须使用对应 Tx I-PDU 的 ComTxIPduUnusedAreasDefault 填充。接收侧对未知数据元素的兼容规则是:允许更大的数组表示,并忽略已知接口之后追加的数据元素。
5.4 缓冲区关系
#mermaid-svg-OpO5c1Px9nCsDMrU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OpO5c1Px9nCsDMrU .error-icon{fill:#552222;}#mermaid-svg-OpO5c1Px9nCsDMrU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OpO5c1Px9nCsDMrU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OpO5c1Px9nCsDMrU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OpO5c1Px9nCsDMrU .marker.cross{stroke:#333333;}#mermaid-svg-OpO5c1Px9nCsDMrU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OpO5c1Px9nCsDMrU p{margin:0;}#mermaid-svg-OpO5c1Px9nCsDMrU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster-label text{fill:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster-label span{color:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster-label span p{background-color:transparent;}#mermaid-svg-OpO5c1Px9nCsDMrU .label text,#mermaid-svg-OpO5c1Px9nCsDMrU span{fill:#333;color:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU .node rect,#mermaid-svg-OpO5c1Px9nCsDMrU .node circle,#mermaid-svg-OpO5c1Px9nCsDMrU .node ellipse,#mermaid-svg-OpO5c1Px9nCsDMrU .node polygon,#mermaid-svg-OpO5c1Px9nCsDMrU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OpO5c1Px9nCsDMrU .rough-node .label text,#mermaid-svg-OpO5c1Px9nCsDMrU .node .label text,#mermaid-svg-OpO5c1Px9nCsDMrU .image-shape .label,#mermaid-svg-OpO5c1Px9nCsDMrU .icon-shape .label{text-anchor:middle;}#mermaid-svg-OpO5c1Px9nCsDMrU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OpO5c1Px9nCsDMrU .rough-node .label,#mermaid-svg-OpO5c1Px9nCsDMrU .node .label,#mermaid-svg-OpO5c1Px9nCsDMrU .image-shape .label,#mermaid-svg-OpO5c1Px9nCsDMrU .icon-shape .label{text-align:center;}#mermaid-svg-OpO5c1Px9nCsDMrU .node.clickable{cursor:pointer;}#mermaid-svg-OpO5c1Px9nCsDMrU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OpO5c1Px9nCsDMrU .arrowheadPath{fill:#333333;}#mermaid-svg-OpO5c1Px9nCsDMrU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OpO5c1Px9nCsDMrU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OpO5c1Px9nCsDMrU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OpO5c1Px9nCsDMrU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OpO5c1Px9nCsDMrU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OpO5c1Px9nCsDMrU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster text{fill:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU .cluster span{color:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OpO5c1Px9nCsDMrU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OpO5c1Px9nCsDMrU rect.text{fill:none;stroke-width:0;}#mermaid-svg-OpO5c1Px9nCsDMrU .icon-shape,#mermaid-svg-OpO5c1Px9nCsDMrU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OpO5c1Px9nCsDMrU .icon-shape p,#mermaid-svg-OpO5c1Px9nCsDMrU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OpO5c1Px9nCsDMrU .icon-shape .label rect,#mermaid-svg-OpO5c1Px9nCsDMrU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OpO5c1Px9nCsDMrU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OpO5c1Px9nCsDMrU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OpO5c1Px9nCsDMrU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 预留
由后续 Transformer 使用
SWC 结构体
RTE 输入缓冲
ComXf 序列化区域
E2E / 其他 Transformer 区域
RTE 输出 uint8 缓冲
COM Signal Group Array
COM I-PDU Buffer
PduR / Lower Layer
headerLength
trailer / CRC / Counter
当 BufferProperties.inPlace = true 时,Transformer 可以使用输入缓冲作为输出缓冲;否则必须由 RTE 提供独立缓冲。工程中如果出现数据被覆盖或后续 Transformer 读取到错误数据,首先检查 inPlace、缓冲起始偏移和长度计算。
6. 状态、错误与配置约束
6.1 模块状态
#mermaid-svg-POzhiL39gCaxMzlm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-POzhiL39gCaxMzlm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-POzhiL39gCaxMzlm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-POzhiL39gCaxMzlm .error-icon{fill:#552222;}#mermaid-svg-POzhiL39gCaxMzlm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-POzhiL39gCaxMzlm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-POzhiL39gCaxMzlm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-POzhiL39gCaxMzlm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-POzhiL39gCaxMzlm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-POzhiL39gCaxMzlm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-POzhiL39gCaxMzlm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-POzhiL39gCaxMzlm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-POzhiL39gCaxMzlm .marker.cross{stroke:#333333;}#mermaid-svg-POzhiL39gCaxMzlm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-POzhiL39gCaxMzlm p{margin:0;}#mermaid-svg-POzhiL39gCaxMzlm defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-POzhiL39gCaxMzlm g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-POzhiL39gCaxMzlm g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-POzhiL39gCaxMzlm g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-POzhiL39gCaxMzlm g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-POzhiL39gCaxMzlm g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-POzhiL39gCaxMzlm .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-POzhiL39gCaxMzlm .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-POzhiL39gCaxMzlm .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-POzhiL39gCaxMzlm .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-POzhiL39gCaxMzlm .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-POzhiL39gCaxMzlm .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-POzhiL39gCaxMzlm .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-POzhiL39gCaxMzlm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-POzhiL39gCaxMzlm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-POzhiL39gCaxMzlm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-POzhiL39gCaxMzlm .edgeLabel .label text{fill:#333;}#mermaid-svg-POzhiL39gCaxMzlm .label div .edgeLabel{color:#333;}#mermaid-svg-POzhiL39gCaxMzlm .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-POzhiL39gCaxMzlm .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-POzhiL39gCaxMzlm .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-POzhiL39gCaxMzlm .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-POzhiL39gCaxMzlm .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-POzhiL39gCaxMzlm .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-POzhiL39gCaxMzlm .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-POzhiL39gCaxMzlm #statediagram-barbEnd{fill:#333333;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-POzhiL39gCaxMzlm .cluster-label,#mermaid-svg-POzhiL39gCaxMzlm .nodeLabel{color:#131300;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-POzhiL39gCaxMzlm .note-edge{stroke-dasharray:5;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-note text{fill:black;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram-note .nodeLabel{color:black;}#mermaid-svg-POzhiL39gCaxMzlm .statediagram .edgeLabel{color:red;}#mermaid-svg-POzhiL39gCaxMzlm #dependencyStart,#mermaid-svg-POzhiL39gCaxMzlm #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-POzhiL39gCaxMzlm .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-POzhiL39gCaxMzlm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ComXf_Init(config)
ComXf_ / ComXf_Inv_
ComXf_DeInit()
在未初始化状态调用转换 API
错误处理或重新初始化
UNINIT
INITIALIZED
ERROR
在未初始化或已去初始化状态调用转换 API,应报告开发错误 <MIP>_E_UNINIT。规范列出的开发错误还包括:
| 错误 | 值 | 典型原因 |
|---|---|---|
<MIP>_E_UNINIT |
0x01 |
Init 前或 DeInit 后调用业务 API |
<MIP>_E_INIT_FAILED |
0x02 |
选择了无效配置集 |
<MIP>_E_PARAM |
0x03 |
参数值非法 |
<MIP>_E_PARAM_POINTER |
0x04 |
指针为空或无效 |
COM Based Transformer 规范明确没有额外的 Runtime Error、Production Error 或 Extended Production Error。工程中的 Transformer 数据错误通常应通过返回值、RTE Transformer Error 或上层 E2E/诊断机制处理。
6.2 RTE 工程错误模型
当前工程的 Rte.h 定义了:
c
#define RTE_E_HARD_TRANSFORMER_ERROR ((Std_ReturnType)138u)
#define RTE_E_SOFT_TRANSFORMER_ERROR ((Std_ReturnType)140u)
#define RTE_TRANSFORMER_SERIALIZER ((Rte_TransformerClass)1u)
#define RTE_TRANSFORMER_SAFETY ((Rte_TransformerClass)2u)
#define RTE_TRANSFORMER_SECURITY ((Rte_TransformerClass)3u)
同时定义了:
c
typedef struct Rte_TransformerError {
Rte_TransformerErrorCode errorCode;
Rte_TransformerClass transformerClass;
} Rte_TransformerError;
这说明 RTE 能表达 Transformer 类别和硬/软 Transformer 错误,但当前工程扫描没有发现具体 ComXf_<transformerId> 实例。实际项目集成时,需要同时检查 RTE 生成接口和实现文件,而不能只看到通用类型定义就认定 ComXf 已启用。
6.3 配置限制总结
| 检查项 | 规范要求 |
|---|---|
| 通信类型 | Sender/Receiver,不支持 Client-Server |
| 数据类型 | 复合、固定长度、字节对齐 |
| Transformer 链位置 | 发送侧第一个,接收侧最后一个反序列化环节 |
| COM 配置 | 必须存在对应 Signal Group 和 I-PDU 配置 |
| 数组接口 | 必须启用 COM Signal Group Array Access |
| I-PDU 长度 | 覆盖 Signal Group 起始位置、长度和其他 Transformer 数据 |
| 空洞处理 | 使用 ComTxIPduUnusedAreasDefault |
| Post-Build | COM 对应配置为 Post-Build 时,ComXf 也必须为 Post-Build |
| 调度 | ComXf 本身没有周期性 MainFunction |
| 回调 | ComXf 本身没有 Callback notification |
7. 问题排查流程
7.1 总体排查流程
#mermaid-svg-ib5337lTqA1iBGrt{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ib5337lTqA1iBGrt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ib5337lTqA1iBGrt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ib5337lTqA1iBGrt .error-icon{fill:#552222;}#mermaid-svg-ib5337lTqA1iBGrt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ib5337lTqA1iBGrt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ib5337lTqA1iBGrt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ib5337lTqA1iBGrt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ib5337lTqA1iBGrt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ib5337lTqA1iBGrt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ib5337lTqA1iBGrt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ib5337lTqA1iBGrt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ib5337lTqA1iBGrt .marker.cross{stroke:#333333;}#mermaid-svg-ib5337lTqA1iBGrt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ib5337lTqA1iBGrt p{margin:0;}#mermaid-svg-ib5337lTqA1iBGrt .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ib5337lTqA1iBGrt .cluster-label text{fill:#333;}#mermaid-svg-ib5337lTqA1iBGrt .cluster-label span{color:#333;}#mermaid-svg-ib5337lTqA1iBGrt .cluster-label span p{background-color:transparent;}#mermaid-svg-ib5337lTqA1iBGrt .label text,#mermaid-svg-ib5337lTqA1iBGrt span{fill:#333;color:#333;}#mermaid-svg-ib5337lTqA1iBGrt .node rect,#mermaid-svg-ib5337lTqA1iBGrt .node circle,#mermaid-svg-ib5337lTqA1iBGrt .node ellipse,#mermaid-svg-ib5337lTqA1iBGrt .node polygon,#mermaid-svg-ib5337lTqA1iBGrt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ib5337lTqA1iBGrt .rough-node .label text,#mermaid-svg-ib5337lTqA1iBGrt .node .label text,#mermaid-svg-ib5337lTqA1iBGrt .image-shape .label,#mermaid-svg-ib5337lTqA1iBGrt .icon-shape .label{text-anchor:middle;}#mermaid-svg-ib5337lTqA1iBGrt .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ib5337lTqA1iBGrt .rough-node .label,#mermaid-svg-ib5337lTqA1iBGrt .node .label,#mermaid-svg-ib5337lTqA1iBGrt .image-shape .label,#mermaid-svg-ib5337lTqA1iBGrt .icon-shape .label{text-align:center;}#mermaid-svg-ib5337lTqA1iBGrt .node.clickable{cursor:pointer;}#mermaid-svg-ib5337lTqA1iBGrt .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ib5337lTqA1iBGrt .arrowheadPath{fill:#333333;}#mermaid-svg-ib5337lTqA1iBGrt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ib5337lTqA1iBGrt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ib5337lTqA1iBGrt .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ib5337lTqA1iBGrt .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ib5337lTqA1iBGrt .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ib5337lTqA1iBGrt .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ib5337lTqA1iBGrt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ib5337lTqA1iBGrt .cluster text{fill:#333;}#mermaid-svg-ib5337lTqA1iBGrt .cluster span{color:#333;}#mermaid-svg-ib5337lTqA1iBGrt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ib5337lTqA1iBGrt .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ib5337lTqA1iBGrt rect.text{fill:none;stroke-width:0;}#mermaid-svg-ib5337lTqA1iBGrt .icon-shape,#mermaid-svg-ib5337lTqA1iBGrt .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ib5337lTqA1iBGrt .icon-shape p,#mermaid-svg-ib5337lTqA1iBGrt .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ib5337lTqA1iBGrt .icon-shape .label rect,#mermaid-svg-ib5337lTqA1iBGrt .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ib5337lTqA1iBGrt .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ib5337lTqA1iBGrt .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ib5337lTqA1iBGrt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ib5337lTqA1iBGrt .start>*{fill:#e8f1ff!important;stroke:#4b78b8!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .start span{fill:#e8f1ff!important;stroke:#4b78b8!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .decision>*{fill:#fff7df!important;stroke:#c58a00!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .decision span{fill:#fff7df!important;stroke:#c58a00!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .action>*{fill:#f4f4f4!important;stroke:#777!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .action span{fill:#f4f4f4!important;stroke:#777!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .result>*{fill:#e8f7ed!important;stroke:#398557!important;stroke-width:1px!important;}#mermaid-svg-ib5337lTqA1iBGrt .result span{fill:#e8f7ed!important;stroke:#398557!important;stroke-width:1px!important;} 没有 ComXf 符号 / 链接失败
发送数据错误
接收数据错误
返回 E_NO_DATA
数据错位 / 长度异常
否
是
否
是
否
是
否
是
否
是
否
是
否
是
否
是
否
是
否
是
否
是
否
是
是
否
否
是
发现 Transformer 或 Signal Group 通信异常
异常表现?
检查 ComXf 生成文件、源文件、头文件和编译清单
确认 Rte_Write 是否触发发送 Transformer 链
确认 COM 是否收到并更新 I-PDU
检查反序列化 buffer 和 bufferLength
核对 Signal Group 和 I-PDU 布局
存在 ComXf_?
当前配置可能未启用 COM Based Transformer
ComXf.h 和实现是否加入构建?
修复生成输出、include 路径或工程源文件清单
ComXf_Init 是否执行?
检查启动顺序和 ComXf_Init 配置指针
重新执行链路测试
Transformer 链配置正确?
检查 DataTransformation.transformerChain 顺序
ComXf 序列化是否返回 E_OK?
检查输入类型、固定长度、字节对齐和 bufferLength
Com_SendSignalGroupArray 是否可用?
检查 COM_TX_SIGNALGROUP_ARRAY、ArrayAccess 和 SignalGroup ID
COM 是否把数组复制到 I-PDU?
检查 COM 初始化、I-PDU Group 状态、COM_BUSY 和 firstByte/length
PduR / 下层是否成功发送?
按 PDU ID 映射、路由组、CanIf/CanTp 返回值继续排查
发送 Transformer 链基本正常
PduR 到 COM 的 RxIndication 是否到达?
Com_ReceiveSignalGroupArray 是否可用?
数组长度和起始位置正确?
ComXf_Inv 是否返回 E_OK?
检查输入长度、字节序、结构体类型和逆向链顺序
接收 Transformer 链基本正常
buffer == NULL_PTR 且 length == 0?
按规范返回 E_NO_DATA 且不修改输出
核对 COM Signal Group Array 配置
核对 firstByte、length、startPosition、packingByteOrder
核对 I-PDU 长度、UnusedAreasDefault 和后续 Transformer 头尾
RTE buffer 是否足够?
修正 BufferProperties、headerLength 或 RTE 缓冲长度
核对系统描述、COM ECUC、Xfrm ECUC 和 RTE 生成输入
7.2 发送问题检查顺序
- 是否生成并链接了
ComXf_<transformerId>。 ComXf_Init是否在 RTE/COM 业务调用前执行。- Transformer 链中 COM Based Transformer 是否位于第一位。
- 输入结构体类型和生成函数参数类型是否一致。
bufferLength是否足够,是否包含后续 Transformer 的保留空间。- 序列化数组是否传给了正确的 Signal Group ID。
COM_TX_SIGNALGROUP_ARRAY和 Signal Group ArrayAccess 是否有效。- COM I-PDU Group 是否已启动,是否出现
COM_BUSY。 firstByteNo和数组length是否正确。- PduR、CanIf/CanTp 的 PDU ID 和路由路径是否正确。
7.3 接收问题检查顺序
- 下层是否到达 PduR 和 COM 的 RxIndication。
- COM 是否更新了对应 I-PDU 和 Signal Group Array 缓存。
COM_RX_SIGNALGROUP_ARRAY和 ArrayAccess 是否有效。- RTE 请求的 Signal Group ID 是否正确。
- 数组长度是否覆盖所有业务字段和 Transformer 头尾。
- 逆向 Transformer 顺序是否与发送链相反。
- 是否因长度不足、字节序或类型不匹配导致反序列化错误。
ComXf_Inv返回E_NO_DATA时,是否确实属于 NULL/0 长度无数据场景。- 最终 RTE 输出数据是否被正确写回 SWC。
7.4 当前工程优先检查点
结合当前工程,建议优先检查:
BSWL\_gen\BSW\Com\Com_Cfg.h中 Signal Group Array 相关宏的有效定义,而不是只看Com.h的 API 声明;COM_TX_SIGNALGROUP_ARRAY/COM_RX_SIGNALGROUP_ARRAY是否由其他生成头间接定义;- 构建依赖中是否存在
ComXf.h、ComXf 源文件和具体ComXf_<transformerId>符号; - RTE 生成代码是否有实际的 Transformer Chain 调用,而不是只有
Rte_TransformerError类型; - COM 生成数据中是否存在
Com_TxSigGrpArrayCfg_t/Com_RxSigGrpArrayCfg_t实例; firstByteNo_uo、length_uo与 I-PDU 长度是否满足边界;- COM ArrayAccess 对应 Signal Group 是否归属于正确的 I-PDU Group;
- 若链路经过 PduR,核对
PduR_ComTransmit使用的 Tx PDU ID 与 COM 配置映射。
8. 总结与工程检查清单
8.1 一句话模型
COM Based Transformer 负责把 RTE 侧固定长度的复合数据序列化为符合 COM Signal Group 布局的线性字节数组;COM 负责把数组放入或取出 I-PDU;PduR 负责继续路由,不负责理解 Transformer 的结构体语义。
8.2 规范与当前工程的差异
- 规范定义了完整的
ComXf_<transformerId>、ComXf_Inv_<transformerId>和 ComXf 生命周期 API。 - 当前工程中发现了 RTE 通用 Transformer 错误类型和 COM Signal Group Array API 实现。
- 当前工程扫描未发现具体 ComXf 生成函数或独立 ComXf 模块实现。
- 当前
Com_Cfg.h中 Signal Group 普通宏为注释状态,数组功能是否由其他生成头启用仍需结合最终编译预处理结果确认。 - 因此,当前不能仅凭 COM 数组 API 源文件断定 COM Based Transformer 已经在 ECU 配置中启用。
8.3 配置检查清单
- SWC Sender/Receiver 数据元素为复合类型。
- 数据元素已映射到
SystemSignalGroup。 -
ISignalGroup引用了 COM BasedDataTransformation。 -
TransformationTechnology.protocol = COM-Based。 -
TransformationTechnology.version = 1.0.0。 -
transformerClass = serializer。 - COM Based Transformer 位于发送 Transformer 链第一位。
- Signal Group 为固定长度并满足字节对齐。
- COM Signal Group ArrayAccess 已启用。
-
firstByte、length、startPosition和 I-PDU 长度一致。 - gaps 使用
ComTxIPduUnusedAreasDefault填充。 - 后续 Transformer 的 header/trailer 空间已预留。
- RTE buffer 长度和
bufferLength计算正确。 - COM 与 ComXf 的 Pre-Compile/Post-Build 变体一致。
-
ComXf_Init的配置指针和初始化顺序正确。 - PduR 的 COM Tx PDU ID 映射正确。
- 已检查
E_NO_DATA、E_SER_GENERIC_ERROR和 RTE Transformer Error 的处理。
8.4 规范章节对照
| 本文内容 | 原规范章节 |
|---|---|
| 模块定位和限制 | 第 1 章、第 4 章 |
| 依赖关系 | 第 5 章 |
| 核心序列化规则 | 第 7.1 章 |
| 错误分类 | 第 7.2 章 |
| API 定义 | 第 8 章 |
| Transformer 规范配置 | 第 10 章 |
| 关联元模型 | 附录 B |
规范版本 :AUTOSAR CP R25-11
模块:COM Based Transformer(ComXf)