Com模块
Communication Transformation(Comxf)
- 信号解析:将接收到的数据帧中的信号提取出来并转换为应用层的数据结构。
- 数据打包:将应用层的数据打包成适合传输的数据帧格式,以便通过通信总线发送。
- 字节序转换:在大端和小端格式之间进行转换,以确保不同系统之间的数据兼容性
Rte_Read_rpIPB_State1_191_SG_E2EPW_191函数传入canin_msg_191,这个结构体实例化的变量来读取Canbus传来的信息。
定位到Rte_Read_CanIn_SWC_rpIPB_State1_191_SG_E2EPW_191,这里都是关于191报文的。现在来看这个函数,使用Com_ReceiveSignalGroupArray()来读取Canbus传入的信息,
Std_ReturnType ret = RTE_E_OK;
Std_ReturnType retTransformer;
uint32 lengthBuffer;
uint8 transformationBuffer_0[32U];
ret |= Com_ReceiveSignalGroupArray(ComConf_ComSignalGroup_SG_E2EPW_191_oIPB_State1_191_oJL954F3F3AVIU0_RNDTMatrixV200_20_b83b0e5f_Rx,
&transformationBuffer_0[0]);
它有两个作用,
- 将Canbus中的信号copy给transformationBuffer_0;
- 返回状态码ret;
Std_ReturnType retTransformer;
retTransformer = E2EXf_Inv_CanIn_SWC_rpIPB_State1_191_SG_E2EPW_191(&(transformationBuffer_0[0]),
&lengthBuffer, lengthBuffer);
转换后的结果赋值给retTransformer,同时修改了buffer中的值,将Com接受到的数据转换为应用层可以接受的格式。且retTransformer应该是一个uint类型的值,用它来判断是否发生Com错误,进而返回ret是否有错误,从而置DTC。
if (Rte_IsHardTransformerError(retTransformer))
{
ret = RTE_E_HARD_TRANSFORMER_ERROR;
}
如果没有发生上述错误,那么将我们的canin_msg_191结构体变量赋值,如下,
if (!Rte_IsHardTransformerError(retTransformer))
{
retTransformer |= ComXf_Inv_CanIn_SWC_rpIPB_State1_191_SG_E2EPW_191(&(transformationBuffer_0[0]),
lengthBuffer, data); /* PRQA S 2983 */ /* MD_Rte_2983 */
}
ComXf同样将数据转换为data可以接受的格式,ComXf函涉及到了data数组的结构体中元素的一一替换,如下,
/* process signal IPB_ABSActive_oIPB_State1_191_oJL954F3F3AVIU0_RNDTMatrixV200_20_5e546e70_Rx */
applDataPtr = (P2VAR(uint8, AUTOMATIC, COMXF_APPL_VAR))&(*(dataElement)).IPB_ABSActive; /* PRQA S 0314 */ /* MD_ComXf_0314 */
applDataPtr[0] = (buffer[13] >> 2) & 0x01U;
接着,即使将buffer(Can中信息)赋值给了applDataPtr,实际上赋值给了IPB_ABSActive,它等效于,
(*dataElement).IPB_ABSActive = (buffer[13] >> 2) & 0x01U;
最终将buffer中的值赋值给了IPB_ABSActive中,同样的,191报文中其余结构体元素都这样将buffer中的值赋值给了结构体各个元素。
回到Rte_Read函数,现在,retTransformer异或了0x00(ComXf中ret一直没变,维持初始值0x00),所以还是保留从E2EXf得到的结果一样。
接着,经过多个判断来得到ret是否有错误信息,返回到CanIn_SWC.c函数中。
总结:Comxf实现了canin_msg_191结构体的填充(来自于Canbus),E2EXf实现 了端到端数据格式的转换,同时,从Com_ReceiveSignalGroupArray得到的ret可以得到超时或E2E error,且该函数是首个从Canbus接受信号的函数,后续的两个Xf是对接受到数据的处理(将数据放到buffer处理)。
标准
I-PDU,Interaction layer Protocol Data Unit.在AUTOSAR COM层流动;
L-PDU, Data Link Layer Protocol Data Unit,在Hardware Abstraction layer流动
Com是位于RTE和PDU-R之间的一个模块,它为I-PDUs进行解包和组包,以让I-PDUs进行信号的传输。这里反复提及了每个IPDU只支持一个信号。
Configuration
- COM shall be configuration by using XML as configuration language as defined by ECU Configuration Template. COM接口的配置依赖于XML—> AXML —>ECUx文件。
- The configuration must not contain overlapping signals within one I-PDU.在配置的时候要由一组规则来即进行I-PDU的限制。
- 这里一直强调一个规则,AUTOSAR COM 和 LargeDataCOM之间的唯一下层接口是**PDU Router,什么意思呢?
COM在给PDUR一个I-PDU后,函数Com_Rxindication被调用,通知Com有数据到来/发送。**发送的回调函数叫Com_TxConfirmation。 - 这个有点抽象啊,COM shall be provide a function to request the transmit buffer data for lower layer triggered transmission.具体点,COM提供一个函数Trigger函数,PDUR将使用这个函数,将IPDU从传输缓冲区复制到L-PDU缓存区(HardWare中的PDU),函数名为Com_TriggerTransmit