1、概述
1.1、简介
在AUTOSAR架构里面COM位于RTE与PDUR之间,通俗点理解就是讲接收到的I-PDUs打包并提供给RTE,将RTE传下来的信号发给PDUR,经由PDUR路由出去。
从应用层传下来数据首先就进入这里,应用层无需关心收发的数据是通过什么总线传输的,应用只需要将它传输给COM即可。这些收发的数据是由用户的DBC文件或者ARXML文件已经定义好了的(这些文件一般OEM整车厂在整车设计的时候就做出来了,里面有总线的网络拓扑图,每个传输的数据应该走什么总线都有定义,所以应用层是无需关心的,只需要优雅的将数据和COM交换即可)。同样,COM上传的数据也是很单纯的数据,里面没有这个数据是什么总线上传的这样无意义的信息,应用层关心的是这个数据的实际意义和数据大小。所以COM主要就起了一个信号接口和网关的作用。
在整个AUTOSAR的位置如下图:
主要功能如下:
- 为RTE提供基于信号的数据接口
- 打包AUTOSAR的信号成I-PDUs传输
- 拆包接收到的I-PDUs成信号发送到RTE
- 将接收到的I-PDUs的信号路由到I-PDU中,以便发送
- 将接收到的I-PDUs中的信号组路由到I-PDU中以发送
- 通信传输控制,启动与关闭 I-PDU Group
- 发送请求的复制
- 保证在传输I-PDUs之间的最小距离
- 接收信号的监控(信号超时)
- 接收信号的滤波机制
- 不同的通知机制(接收后、发送前、超时等回调)
- 提供初始化值和更新指示
- 字节序转换
- 符号扩展
- 支持两种不同的传输模式
- 信号网关
- 支持大型与动态数据类型
- 支持I-PUD计数与I-PUD复制(复制还是重复发送?)
1.2、各模块依赖关系
COM模块位于RTE与PDUR之间,与其他模块交互较少,主要还是在数据的传递上才有所体现。
1.2.1、PDUR关系
AUTOSAR COM模块两种PDUR上层模块的API。用TP的上层模块的API和不使用TP的上层模块的API。这有必要区分,因为AUTOSAR COM模块通过简单的I-PDU传输与通过TP分段传输。
AUTOSAR COM模块对底层PDU路由器的功能需求如下:
- 标识输入的I-PDUs
- I-PDU的发送接口,包括I-PDU是否已经被通信控制器发送
- 触发接口,使PDU路由器能够从autosar COM模块传输传输
- TP通信的缓冲区处理
1.2.2、RTE
RTE使用AUTOSAR COM模块的功能来发送和接收信号。在AUTOSAR中,RTE位于AUTOSAR COM模块之上的较高层。
2、SPEC解读
2.1、通用功能
2.1.1、字节转换与符号扩展
AUTOSAR COM 支持以下数据类型: boolean , uint8 , uint16 ,uint32 , uint64 , sint8 , sint16 , sint32 , sint64 ,uint8[n] ,float32和float64 ,其中uint8[n] 对应于UINT8_N或UINT8_DYN。
AUTOSAR COM支持所有有符号和无符号整型数据类型的字节序转换,同时会将非整型数据类型视为对应匹配的整数数据类型,或者不解释它们的内容,即使ComSignalEndianness被配置为OPAQUE。
AUTOSAR COM模块应将不确定的数据解释为uint8[n],并将其映射到一个n字节大小的信号。
对于不透明的数据端序,转换必须配置为opaque(什么是不透明?个人理解上像是不确定的数据类型,但是数据类型都需要定义的,很奇怪的名词解释)
注:必须考虑签名数据的平台特定表示。 负值的签名数据将被正确映射。例如:
一个10位有符号信号被接收并被Com_ReceiveSignal复制到一个16位有符号整型变量。 如果接收到signal值为(-3)10进制,类型为sint16,则接收到的10位信号有取值为1111111101b。当将其复制到16位整型变量时,值将扩展到11111111111101b
除了字节顺序转换外, AUTOSAR COM模块不支持ComSignalType FLOAT32或FLOAT64的信号的进一步转换。也就是说,支持字节顺序转换,但不支持复杂转换或分数、指数、符号或偏差值的标准化。
2.1.2、信号值类别
初始值: AUTOSAR COM模块使用配置参数ComSignallnitValue的低N位初始化发送方和接收方的每个N位的信号类型,配置的ComSignallnitValues也用于I-PDU的初始化信号。一个信号的ComSignallnitValue可以与ComSignalDatalnvalidValue值相同。初始化阶段会清空所有update-bits值。默认情况下,所有I-PDU组应在停止状态,不得由Com_Init()调用启动。
数据无效值:通过调用Com_InvalidateSignal, AUTOSAR COM模块将在内部执行带有配置ComSignalDatalnvalidValue的Com-SendSignal, ComTransferProperty和传输模式决定了ComSignalDatalnvalidValue在总线上的传输。内部执行的带有数据无效l值的Com_SendSignal ,会决定被用作过滤器的数据无效值和TMS当前值。VFB仅为复杂数据类型定义一个属性。因此,一个失效的复杂数据类型到一个失效的信号簇的最佳映射是使一个信号簇的所有信号失效。因此,RTE还可以通过调用Com_InvalidateSignalGroup来请求使整个信号簇无效。
正常值:初始化阶段之后的有效值,包括COM部分收发的信号值。
2.1.3、滤波
AUTOSAR COM模块将计算每个过滤条件为真或假。
AUTOSAR COM模块只在接收端过滤掉信号。
AUTOSAR COM模块应在发送方使用传输模式条件(TMC)过滤机制,但不应过滤掉发送方的信号。
滤波方式有8种
对于ComSignalType为UINT8_N或UINT8_DYN的信号,AUTOSAR COM模块只支持配置为ALWAYS或NEVER的ComFilterAlgorithm。(此处提醒,不同的情况下可能支持不同的滤波方式,需要查看规范里面都是什么的同时配置工具理应有提醒)。
如果AUTOSAR COM模块在接收端滤波掉一组信号,即滤波条件为false,则AUTOSAR COM模块丢弃整个信号组,不进行处理。
如果AUTOSAR COM模块计算信号的滤波器为true,(值未被过滤掉)则AUTOSAR COM模块将该信号的值放入old_value中当一个值被过滤时,如果过滤器不允许该值通过(即过滤器的计算结果为false),那么AUTOSAR COM模块将不将该值放入old_value。
ALWAYS: 总是通过,若一个信号的过滤算法配置为ALWAYS,那么这个信号的TMC永远为True
NEVER:总是不通过,若一个信号的过滤算法配置为NEVER,那么这个信号的TMC永远为False ;
MASKED_NEW_EQUALS_X:若一个信号的过滤算法配置为MASKED_NEW_EQUALS_X时,只有当新值与掩码按位与后等于设定的某一值时,这个信号的TMC才等于True ;
MASKED_NEW_DIFFERS_X:若一个信号的过滤算法配置为MASKED_NEW_DIFFERS_X时,只有当新值与掩码按位与之后不等于设定的某一值时,这个信号的TMC才为True;
MASKED_NEW_DIFFERS_MASKED_OLD:若一个信号的过滤算法配置为MASKED_NEW_DIFFERS_MASKED_OLD时,只有当新值与掩码按位与之后的值不等于旧值与掩码按位与之后的值时,这个信号的TMC才为True ;
NEW_IS_WITHIN:若一个信号的过滤算法配置为NEW_IS_WITHIN时,只有当新值在某一设定的范围内时,这个信号的TMC才为True;
NEW_IS_OUTSIDE:若一个信号过滤算法配置为NEW_IS_OUTSIDE时,只有当新值不在某一设定的范围内时,这个信号的TMC才为True;
ONE_EVERY_N:若一个信号的过滤算法配置为ONE_EVERY_N时,该信号值每更新N次,这个信号的TMC值为True;
过滤处理:
如果AUTOSAR COM模块在接收端过滤掉一个信号(信号簇 ),即filter condition的结果为false,则AUTOSAR COM模块应丢弃该信号(信号簇) ,不进行处理,及不会将该信号的值放入old_value中;
如果AUTOSAR COM模块将一个信号的过滤器计算为true(值没有被过滤掉),那么AUTOSAR COM模块应将该信号的值放入old_value中;
如果在send-API编写相应的信号之前对过滤器进行了计算,则需要有一种方法来确定该信号的过滤器状态。一些筛选器需要new_value来计算筛选器。然而,这只有在使用send-API更新信号之后才可用。 因此,有必要在第一次发送之前为new_value定义过滤器使用的值。
对于配置的接收滤波器MASKED_NEW_DIFFERS_MASKED_OLD的信号, AUTOSAR COM模块将处理该信号在接收截止日期监测超时后收到的第一个值,就像该值已经通过了过滤条件一样;
在相关的I-PDU的RX截止超时后AUTOSAR COM模块会让过滤器MASKED_NEW_DIFFERS_MASKED_OLD传递任何值。
2.1.4、网关
AUTOSAR COM模块提供一个集成的信号网关,以1:n的方式转发信号和信号组。
信号网关接收到用于路由的信号或信号组后,立即分别作为这些信号或信号组的发送者。如果集成信号网关转发信号/信号组或软件组件发送信号,则信号处理没有区别。
由于网关关系是静态配置的,因此优化的信号网关可能会跳过一些处理阶段以进行具体配置。例如,在某些情况下,不需要进行端序转换。当然,这种优化不应该导致任何不同的逻辑行为或目标总线上的不同表示。优化只能用于提高信号网关的性能。
2.2、通信模式
2.2.1、信号传输模式
直接/N次传输模式(Direct/n-times模式):包含于该I-PDU的任何具备Triggered属性的信号及信号组的更新都会触发I-PDU的立即发送,当上层面模块调用Com_SendSignal( )/Com_SendSignalGroup( )更新信号或者信号组时, Com层根据配置需求发送n次该lPDU.
周期传输模式( Periodic模式) :用户配置发送周期,只有该I-PDU的周期到来时才会触发该I-PDU的发送,上层模块调用Com_SendSignal()/Com_SendSignalGroup()只更新信号及信号组的内容。
混合传输模式: Direct/n-times和Periodic的混合模式,当上层模块调用Com_SendSignal( )/Com_SendSignalGroup( )请求该l-PDU包含的信号/信号组的发送时,将会触发该I-PDU的直接n次发送,同时,用户配置的周期到来也会触发该I-PDU的发送。
None传输模式:无论何时COM层不能够触发拥有该发送模式的I-PDU的发送,只有PduR模块调用Com_TriggerTransmit()服务才能够触发该I-PDU的发送。
在AUTOSAR COM规范中允许为每个I-PDU静态配置两种不同的传输模式, ComTxModeTrue和ComTxModeFalse,在AUTOSAR COM规范中通过传输模式切换,来选择I-PDU中的其中一种传输模式进行传输。
先使用过滤机制判断I-PDU中各信号的发送模式条件,同时更新I-PDU中的信号。
通过各信号的判断结果来计算该I-PDU的TMS ( transmission mode selector )。若至少有一个C(与I-PDUs中的信号相关)为True则TMS为True ,对应I-PDU以用户配置的ComTxModeTrue的发送模式发送;若所有C(信号,IPDUs)都为False,则TMS为False,对应I-PDU以用户配置的ComTxModeFalse的发送模式发送。
2.2.2、通信传输模式
发送模式条件TMC+发送模式选择TMS
发送端信号的TMC (发送模式条件)的计算与接收端的信号过滤机制相同,但是,在发送端信号过滤并不会丢弃任何的信号,而只是用于计算信号TMC的值。
发送端的TMS, 一个I-PDU的TMS的值是根据其所有下属的信号的TMC结果决定的,若一个I-PDU下属的信号中至少有一个信号的TMC计算为True,那么这个I-PDU的TMS为True,只有该I-PD下属的所有的信号的TMC都计算为False时,该I-PDU的TMS才为False。
每个I-PDU配置两种发送模式,在程序运行过程中,某I-PDU的发送模式是由TMS来决定,若一个I-PDU的TMS根据算法计算为True ,那么该I-PDU将以配置的True状态下的发送模式进行发送。当一个I-PDU下属的某个信号的过滤算法配置为ALWAYS ,那么这个lPDU将一直以用户配置的TM为True状态下发送模式进行发送。
如果I-PDU的传输因任何原因被触发,则发送与该I-PDU关联的挂起信号。例如,在同一个I-PDU中发送了ComTransferProperty触发器信号,或者由于ComTxModeMode PERIODIC或MIXED而调度了I-PDU发送。
i - pdu的总线时序可以由RTE的发送请求结合传输模式和传输属性来控制。此外,PDU路由器,特别是在FlexRay和LIN的情况下,可以通过Com_TriggerTransmit服务来控制它。在后一种情况下,PDU路由器请求从AUTOSAR COM模块发送i -PDU。
Com_TriggerTransmit函数可以对任何l-PDU调用,而不管它的传输模式是什么。这使得LIN和FlexRay可以使用所有可用的传输模式,特别是对于零星的通信。NM也使用这种机制发送用户数据。
在AUTOSAR COM中,信号组和组信号也可以具有传输属性,结合传输模式来定义,如果在信号组或组信号更新时分别发送I-PDU。
AUTOSAR COM模块允许为每个I-PDU静态配置两种不同的传输模式。仅根据映射到该I-PDU上的信号的值来选择该I-PDU在特定时间点有效的传输模式。
用于选择两种传输方式之一的一个I-PDU的信号以及用于选择传输方式的条件都是静态配置的。
对于传输方式的选择,AUTOSAR COM模块将信号组视为正常信号。
如果将ComIPduDirection配置为SEND的I-PDU的信号包含了配置容器ComFilter,则该信号被命名为贡献该I-PDU的TMS。如果该信号的配置容器没有分配配置容器ComFilter,那么它不会对TMS做出贡献。
映射到一个I-PDU的两个信号逻辑信号流如下
如果ComRetryFailedTransmitRequests被设置为TRUE,将计算PduR_ComTransmit的返回值。]如果PduR_ComTransmit的返回值不等于E_OK, AUTOSAR COM模块将在下一个Com_MainFunctionTx内对未发送的I-PDU再次调用PduR_ComTransmit。
2.3、I-PDUS的处理
对于I-PDU组,遵循以下规则:
1. 一个I-PDU可以属于任意一个I-PDU组。
2.当且仅当至少有一个I-PDU组是活动的(启动的),则该I-PDU是活动的(启动的)。
3.I-PDU组的最大数量是可预编译配置的。
如果包含该I-PDU的任何l-PDU组被激活/启动,则该I-PDU被命名为activatedl started。未启动的I-PDU被调用停止或去激活。一个I-PDU必须至少属于一个I-PDU组才能启动。
例如,如果I-PDU“BUS1 RX Function1”属于I-PDU组“BUS1 RX”,而I-PDU组“BUS1 RX”属于I-PDU组“BUS1”,则I-PDU“BUS1 RX Function1”也必须属于I-PDU组“BUS1”。这些依赖关系需要在配置时解决。
开启与停止I-PDU通过API: Com_IpduGroupControl
停止 I-PDUs的动作
开启 I-PDUs的动作
如果I-PDU的ComIPduSignalProcessing配置为IMMEDIATE,则AUTOSAR COM模块将分别为Com_RxIndication或Com_TpRxIndication函数中包含的信号和信号组调用配置好的ComNotifications。
如果将I-PDU的ComIPduSignalProcessing配置为DEFERRED,则AUTOSAR COM模块首先将I-PDU的Com_RxIndication函数或相关TP接收函数中的数据分别从PduR复制到COM中。]然后AUTOSAR COM模块将在下次调用Com_MainFunctionRx时异步调用已配置的ComNotifications,用于包含的信号和信号组。
在拆分I-PDU时,AUTOSAR COM模块应检查接收到的数据长度(dulnfoptr -> sdullength),如果信号组仅部分接收到,则该信号组和所有包含的组信号不应拆封或通过ComNotification通知。上述要求可以防止接收到不一致的信号组,从而防止接收到不一致的复杂数据类型。如果接收到的数据长度大于预期,AUTOSAR COM模块不会复制或处理未配置信号的额外接收数据。
在解包I-PDU时,AUTOSAR COM模块检查接收到的数据长度(PdulnfoPtr-> sdullength),然后通过ComNotification解包并通知完全接收到的信号。如果接收到小于预期的l-PDU,导致接收到没有配置更新位的信号,则AUToSAR COM模块将该信号视为其更新位已设置,并将该信号解释为已更新。如果接收到的I-PDU长度小于配置/期望的I-PDU长度,需要防止部分更新信号。另一方面,所有完全接收到的信号都应该被接收并通知给上层。
如果一个I-PDU的最小延迟定时器被重置,因为传输截止监视定时器过期,并且存在对该I-PDU的延迟请求,则AUTOSAR COM模块应立即发送该I-PDU。
2.4、期限监控
在信号组的截止日期监视上下文中,它被当作信号来处理。截止时间监控参数ComFirstTimeout和ComTimeout可以在配置容器ComSignal或ComSignalGroup中定义。相应的超时通知回调函数可以在配置容器ComSignal或ComSignalGroup的ComTimeoutNotification参数中定义。
如果信号或信号组的配置参数ComTimeout被省略或配置为0,则AUTOSAR COM模块不监控该信号或信号组。也会忽略ComFirstTimeout.
当且仅当该I-PDU包含在使能接收截止日期监控的I-PDU组中,该I-PDU的接收截止日期监控才使能。否则,关闭对I-PDU的接收时限监控。
AUTOSAR COM模块应在没有更新的情况下执行I-PDU的接收期限监视信号。
如果配置了接收截止日期监控的I-PDU中的所有信号都配置了更新位,则无需在l-PDU基上进行接收截止日期监控。
在rx超时的情况下,ComRxDataTimeoutAction参数决定AUTOSAR COM模块是用初始值替换信号/信号组值还是保持最后接收到的值。
当I-PDU的接收截止时间监控被禁用并且定时器过期时,不会给RTE任何错误指示。关闭接收截止时间监控不会停止接收l-PDU。
AUTOSAR COM模块在传输截止日期监测方面不区分ComTransferProperty PENDING或TRIGGERED信号。
2.5、信号组
AUTOSAR COM模块通过阴影缓冲机制实现信号组的一致性,即RTE在阴影缓冲中访问组信号。如果阴影缓冲区需要与I-PDU同步,RTE可以通过Com_SendSignalGroup或Com_ReceiveSignalGroup显式触发。同步是自动执行的。
信号组一致性的另一种方法是启用信号组数组Com_ReceiveSignalGroupArray与Com_SendSignalGroupArray
在Com_ReceiveSignalGroup将信号组数据复制到影子缓冲区后,可以通过调用Com_ReceiveSignal函数从影子缓冲区接收组信号。
2.6、更新位
为了使信号/信号组的接收方能够识别发送方在发送之前是否更新了该信号/信号组中的数据,AUTOSAR COM模块支持更新位。
更新位表示在包含该信号的I-PDU发送到PDU路由器之前,发送端的RTE是否更新了信号值。
如果传输模式DIRECT使用ComTxModeNumberOfRepetitions大于或等于1,则不允许更新位。
通过在发送端和接收端进行配置,可以分别为每个信号和/或分别为每个信号组添加最多一个更新位。更新位的位置可以通过配置参数ComUpdateBitPosition来配置。ComUpdateBitPosition包含在配置容器ComSignal中。因此,可以确保信号/信号组和相应的更新位始终是同一个I-PDU的一部分。
AUTOSAR COM模块只内部处理更新位。而不是作为信号或信号组的一部分。
AUTOSAR软件组件不能直接看到或访问更新位。
2.7、COM模块的内部交互
传输交互
接收交互
网关交互
集成的信号网关充当接收器,用于所有被配置为网关信号源的信号或信号簇。信号网关在接收到用于路由的信号或信号簇后,立即充当这些信号或信号簇的发送器。
为了向TMS提供正确的数据格式,需要在接收端进行端序转换和符号扩展。只有当rx总线的端序与CPU的端序不同时,才需要进行这种端序转换。只有当rx总线的端序与tx总线的端序不同时,发送端才需要进行端序转换。
2.8、时序图
2.8.1、COM与PDUR的接口传递
COM与PDUR的传递仅仅体现在发送与接收上面,注意下图是走If层的数据传递。