AutoSar Com模块

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]);

它有两个作用,

  1. 将Canbus中的信号copy给transformationBuffer_0;
  2. 返回状态码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

  1. COM shall be configuration by using XML as configuration language as defined by ECU Configuration Template. COM接口的配置依赖于XML—> AXML —>ECUx文件。
  2. The configuration must not contain overlapping signals within one I-PDU.在配置的时候要由一组规则来即进行I-PDU的限制。
  3. 这里一直强调一个规则,AUTOSAR COM 和 LargeDataCOM之间的唯一下层接口是**PDU Router,什么意思呢?COM在给PDUR一个I-PDU后,函数Com_Rxindication被调用,通知Com有数据到来/发送。**发送的回调函数叫Com_TxConfirmation。
  4. 这个有点抽象啊,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

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值