什么是Signal Group,为什么要用Signal Group?

电子说

1.2w人已加入

描述

前言

最近在研究AUTOSAR通信协议栈的时候发现对Com模块的Signal Group很是疑惑,产生了以下几个问题:

(1)什么是Signal Group,为什么要用Signal Group?

(2)什么是Shadow buffer,Shadow buffer机制为什么能保证数据的一致性?

(3)一个信号又属于一个信号组,那么可以为这个信号和所在的信号组都配置Notificaition吗?

(4)信号组包括的信号可以跨不同IPDU吗?

(5)RTE在获取一个Signal时,如果这个Signal属于一个Signal Group,那么Signal的值冲Signal的buffer获取还是Shadow buffer获取?

本文先梳理一遍Com Signal报文的手法过程过程,然后回答这些问题。

AUTOSAR 通信服务-Com模块概念详解

正文

1.Signal Group概念介绍

为了支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供了信号组的解决方案。AUTOSAR COM模块一致地发送和接收信号组,为复杂数据类型提供必要的一致性。信号组支持静态配置。对于每个信号组,可以配置一个符号名。

AUTOSAR COM模块通过shadow buffer缓冲区机制实现信号组的一致性,即RTE访问shadow buffer缓冲区中的组信号。如果shadow缓冲区需要与I-PDU同步,RTE可以使用Com_SendSignalGroup或Com_ReceiveSignalGroup显式触发。同步是以原子方式执行的。

一个信号组一致性的替代方法是启用信号组数组API Com_SendSignalGroupArray和com_receivesignalgrouparray

1.1 Initialization

通过调用Com_Init, AUTOSAR COM模块将初始化发送端信号组的shadow缓冲区,一个结构良好的SWC在调用Com_ReceiveSignalGroup之前尝试读取组信号。

1.2 Transmission

如果Com_SendSignal或com_invalidatsignal被调用的信号属于一个信号组,那么AUTOSAR COM将只更新这个信号组的shadow缓冲区。除非I-PDU内容发生了变化,否则不需要像TMS评估那样进行进一步的I-PDU处理。

如果为信号组调用Com_SendSignalGroup, AUTOSAR COM模块将自动复制shadow缓冲区内容到I-PDU buffer。

Example with two group signals signal_a and signal_b, which belong to group_x:

/* copy a to shadow buffer */

Com_SendSignal (signal_a, &a);

/* copy b to shadow buffer */

Com_SendSignal (signal_b, &b);

/* copy shadow buffer to I-PDU */

Com_SendSignalGroup (group_x)

1.3 Reception

当信号组数据被Com_ReceiveSignalGroup复制到shadow buffer后,可以通过调用com_receivessignal函数从shadow缓冲区接收组信号。

如果为一个信号组调用Com_ReceiveSignalGroup, AUTOSAR COM模块将自动将数据从I-PDU缓冲区复制到shadow缓冲区。

Example with two group signals signal_a and signal_b, which belong to group_x:

/* copy I-PDU to shadow buffer */

Com_ReceiveSignalGroup (group_x);

/* copy a from shadow buffer */

Com_ReceiveSignal (signal_a, &a);

/* copy b from shadow buffer */

Com_ReceiveSignal (signal_b, &b)

1.4 Notifications

下表显示,所有的通知功能仅可为信号组配置,而不是为单个组的信号配置。

PDU

2.Signal Group的接收过程

PDU

1)如果是Defered IPDU,那么Com_RxIndication只完成IPDU数据拷贝到IPUD的buffer中去,下一个mainfunction中中再去解析IPDU中的Signal。

2)如果是Immediate IPDU,那么Com_RxIndication中完成IPDU数据拷贝到IPUD的buffer中去后还完成Signal和Signal Group数据的解析和拷贝到Buffer当中去,1和2中buffer是一个地方。

 

Rte_COMCbk_ISigGrp_Receive_Test_Signal_Group(void)
{
   Array_uint8_8 data;
   
   (void)Com_ReceiveSignalGroup(((VAR(Com_SignalGroupIdType, AUTOMATIC))0));


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))0), &data[0]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))1), &data[1]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))2), &data[2]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))3), &data[3]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))4), &data[4]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))5), &data[5]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))6), &data[6]);


   (void)Com_ReceiveShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))7), &data[7]);


   (void)Rte_Rx_000001(&data);
}

 

PDU

PDU

3)如果配置了一个Signal Group的Notification且所在的IPDU是Immediate IPDU,那么在Com_RxIndication中就会调用Notification,且这个Notification的名字为Rte_COMCbk_

PDU

4)Notification中会调用Com_ReceiveSignalGroup完成Signal Group数据从shadow buffer拷贝到Signal Group buffer中去,然后调用Com_ReceiveShadowSignal将Signal Group数据拷贝到外部buffer中去。

3. Signal Group的发送过程

PDU

 

Rte_ImplWrite_Transmit_Test_Signal_Group(P2CONST(uint8, AUTOMATIC, RTE_APPL_DATA) data) /* 1 */
{
   VAR(Std_ReturnType, AUTOMATIC) rtn = RTE_E_OK;


   Rte_memcpy(Rte_Ms_000001, data, sizeof(Array_uint8_8));


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))0), &data[0]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))1), &data[1]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))2), &data[2]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))3), &data[3]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))4), &data[4]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))5), &data[5]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))6), &data[6]);


   Com_UpdateShadowSignal(((VAR(Com_SignalIdType, AUTOMATIC))7), &data[7]);


   if ( ((VAR(StatusType, AUTOMATIC))E_OK) != Com_SendSignalGroup(((VAR(Com_SignalGroupIdType, AUTOMATIC))1)) )
   {
      rtn = ((VAR(Std_ReturnType, AUTOMATIC))RTE_E_COM_STOPPED);
   }


   /* Send complete */
   return rtn;
}

 

PDU

PDU

信号组是可以直接和SWC进行Pport-Rport连接的,也就是说SWC可以通过RTE读取或者发送Signal Group数据。在通过RTE发送Signal Group数据的时候,首先通过通过Com_UpdateShadowSignal函数将要发送的数据拷贝到Signal Group的shadow buffer中去,然后调用Com_SendSignalGroup将shadow buffer中的数据以原子操作的方式拷贝到IPDU的Buffer中去,并且触发IPDU的数据发送(调用PduR_Transmit)。

4.问题回答

问题1:什么是Signal Group,为什么要用Signal Group?

答:为了支持复杂数据类型的AUTOSAR概念,AUTOSAR COM提供了信号组的解决方案。AUTOSAR COM模块一致地发送和接收信号组,为复杂数据类型提供必要的一致性。通俗的来讲,Signal Group就是一个IPDU里面的几个Signal的集合,这几个Signal的操作需要保持一致性(也就是如果外部发送方有对这几个数据中一个或多个数据有改动,那么接收方也需要同时更新,比如车道线的一阶参数、二阶参数、三阶参数、常数项是4个不同的Signal,这4个Signal就需要保持一致性,不然到最后仪表上画出来的车道线就会偶发的和实际不一样)。

问题2:什么是Shadow buffer,Shadow buffer机制为什么能保证数据的一致性?

答:本来COM模块为每个Rx Signal和Rx Signal都设有一个Signal Buffer的,Signal数据的收发都通过这个Signal来实现。如果Signal Group,COM模块为每个Signal Group又额外设置了一片Signal Group Buffer,这片Buffer就是所谓的Shadow buffer。在发送Signal Group的时候,将Signal Group拷贝到IPDU Buffer的时候是原子操作(也就是拷贝前关闭全局中断,拷贝后打开全局中断,保证拷贝过程不被中断干扰)保证了Signal Group数据的一致性。

问题3:一个信号又属于一个信号组,那么可以为这个信号和所在的信号组都配置Notificaition吗?

答:AUTOSAR规范规定,一个Signal配置为一个Signal Group的Group Signal后只能有Signal Group的Notification。

问题4:信号组包括的信号可以跨不同IPDU吗?

答:这个问题在AUTOSAR规范当中没有找到。通过阅读源码发现Signal Group中的Signal应该都是同一帧IPDU中的Signal(这个有待进一步确认)。

问题5:RTE在获取一个Signal时,如果这个Signal属于一个Signal Group,那么Signal的值从Signal的buffer获取还是Shadow buffer获取?

答:从Shadow buffer中获取。






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分