电子说
前言
最近在研究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
下表显示,所有的通知功能仅可为信号组配置,而不是为单个组的信号配置。
2.Signal Group的接收过程
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); }
3)如果配置了一个Signal Group的Notification且所在的IPDU是Immediate IPDU,那么在Com_RxIndication中就会调用Notification,且这个Notification的名字为Rte_COMCbk_
4)Notification中会调用Com_ReceiveSignalGroup完成Signal Group数据从shadow buffer拷贝到Signal Group buffer中去,然后调用Com_ReceiveShadowSignal将Signal Group数据拷贝到外部buffer中去。
3. Signal Group的发送过程
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; }
信号组是可以直接和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中获取。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !