AUTOSAR CP COM 模块官方文档的翻译 + 自我理解 + 偶尔评论。原文链接。
版本:2021-11-25 R21-11
推荐使用方法:需要使用哪个功能,打开本文档找到相关功能,对比翻译和原文一起理解。或者直接看这篇文章,【AUTOSAR-CP-CAN-3】COM 模块详解,然后不懂的地方在这里 ctrl + F。
翻译方法:逐句 google 机翻 + 每句人为理解修改(甚至可能完全用自己的翻译)。
校正与纠错:由于存在错误,可能会不定时更新,如果阅读发现错误,欢迎评论区留言指正;开源架构、开源精神、无任何限制随意阅读,不要 VIP,不需要关注作者阅读,不要付费订阅专栏,欢迎随时讨论。
声明:已经著名出处,仅供学习交流。
COM 的业务逻辑是为 RTE 提供收发信号的相关逻辑。处于 BSW 中 CAN 协议栈的顶层。 向下直接交互 PduR,COM 组包信号为 I-PDU, 向下交给 PduR 进行路由,可能会路由到其他模块,但是主要是路由给 CanTp 或者 CanIf,由 CanTp 或者 CanIf 向下进行物理层的发包工作,收包的路线是相反的,底层提供中断,Controller 引起中断,进入中断处理程序调用相应的中断处理函数,进行收包,传 PduR,PduR 会把包路由给 COM 由 COM 解包,做一些逻辑处理。
SWS:SoftWare Specification
上述文档引用为 ISO COM Specification,在官方文档中其引用符号为 [17] 。
ISO COM Specification 中定义了 ComFilterAlgorithms 取值有:ALWAYS、NEVER、MASKED_NEW_EQUALS_X、MASKED_NEW_DIFFERS_X、MASKED_NEW_DIFFERS_MASKED_OLD、NEW_IS_WITHIN、NEW_IS_OUTSIDE、ONE_EVERY_N。为了降低复杂度,AUTOSAR COM 模块不支持所有定义的过滤器。不支持的过滤器要么是过时了要么是其他过滤器的特殊情况。例如 NEW_IS_DIFFERENT 是 MASKED_NEW_DIFFERS_MASKED_OLD 掩码全置为 1 的特殊情况。
如果在发送 API 写入相应信号之前评估过滤器,则需要有一种方法来确定该信号的过滤器状态。 一些过滤器需要一个 new_value 来评估过滤器。 但是,这仅在使用发送 API 更新信号后可用。 因此,有必要在第一次发送发生之前为 new_value 定义过滤器使用的值。(我的理解:在发送之前评估过滤器,有些评估算法需要 new_value ,new_value 只有使用发送 API 后才有值,因此需要设定一个初始值)
为信号配置 ComFilterAlgorithm=ONE_EVERY_N 有如下效果:每 PERIOD 次过滤器的调用,信号会由过滤器传出一次(即,过滤器返回 true)。如果 OFFSET 为 0,第一次使用过滤器信号被允许通过。如果 OFFSET 大于 0,必须超过一个信号通过过滤器,才能返回 true。
参数初始化设置为 true 的 Com_IpduGroupStart 启动的 I-PDU,OCCURENCE 也会被设置为 0。
ONE_EVERY_N 的定义的阐述在 ISO COM Specification 中。
相关的配置项可以在 Configuration Specification 中找到。
[SWS_Com_00793] 对于一个配置的接收过滤器为 MASKED_NEW_DIFFERS_MASKED_OLD 的信号,在该信号的接收超时监控超时发生之后,第一个接收的这个信号的值当作通过过滤器标准的值一样处理。
因此 AUTOSAR COM 模块在接收 I-PDU 超时后,会让任何值通过滤器 MAKES_NEW_DIFFERS_MASKED_OLD 。
AUTOSAR COM 模块应该提供一个集中的信号网关用来信号和组信号的 1:n 转发。
路由关系应该被静态配置,通过 ComGwMapping 配置容器。
如 Figure4 Figure5 所示,对于信号和组信号配置为网关信号源的,集成信号网关充当所有这些信号或组信号的接收器。
在信号网关接收到用来路由的信号或者组信号之后,对于这些信号和组信号,网关会马上分别作为其发送者。如 Figure3 和 Figure5 所示。无论是信号网关转发信号、组信号或者是软件组件发送,信号处理没有区别。
从网关关系静态配置,一个优化的信号网关可能跳过一些具体配置的处理阶段。例如,字节序转换在某些情况是不必要的。当然,这样的优化不应该造成在目标总线上任何不同的逻辑行为或者不同的表示。只能引入优化以提高信号网关的性能。
如 Figure4 所示,一个接收信号或者组信号可能在本地 ECU 被接收,并且同时作为网关的源。
Figure3 Figure4 展示了只对RTE接收的组信号可用的阴影缓冲区 shadow buffer。信号网关需要确保一致地处理组信号(consistently,我的理解是一致的意思,结合上下文,因为一个信号可能同时发给上层和信号网关,所以应该这里有数据一致性问题),但是没有提前确定的方式来实现这一点。(不理解预先确定的方式实现是什么意思?)
[SWS_Com_00370] AUTOSAR COM 模块的信号网关应该应该缩减到没有大小,如果信号路由功能不需要
这里描述了在 Com_Init 期间应该执行的行为。
[SWS_Com_00217] 在 Com_Init (SWS_Com_00432)执行期间,AUTOSAR COM 模块应该初始化每个 I-PDU 。首先使用ComTxIPduUnusedAreasDefault 的值逐字节地初始化 ,然后根据包含的信号(ComSignalInitValue) 和updates-bits(参见 SWS_Com_00117)的初始值逐位初始化。 (bit wise according to initial values (ComSignalInitValue) of the contained signals and the update-bits,应该是包含的信号和 updates-bits 的初始值?)
C 初始化代码,或者也叫 start-up 代码,用初始值初始化全局变量、静态变量。必须在任何 AUTOSAR COM 模块服务的调用之前执行。
[SWS_Com_00128] AUTOSAR COM 模块的初始化函数 Com_Init 应该初始化所有的 start-up 代码没有初始化的内部数据。例如 C 结构体。
[SWS_Com_00328] AUTOSAR COM 模块的初始化函数 Com_Init (SWS_Com_00432) 不应启用 ECU 间通信。
这里的初始化并不完整。关于一些 AUTOSAR COM 模块的功能的初始化的细节在不同的功能章节描述。
Initialization of Not Used Areas of an I-PDU
[SWS_Com_00015] AUTOSAR COM 模块应该使用配置参数 ComTxIPduUnusedAreasDefault
确定的值来填充 I-PDU 内部没有使用的区域。
[SWS_Com_00098] AUTOSAR COM 模块应该使用其配置的参数 ComSignalInitValue 的低 n 位,在发送端和接收端初始化每个 n 位大小的信号类型的信号。(SRS_BSW_00101)
所配置的 ComSignalInitValue (ECUC_Com_00170)也用于相关I-PDU中的信号的初始化;请参见SWS_Com_00217。
一个信号的 ComSignalInitValue 可以和他的 ComSignalDataInvalidValue 相等。对于不同的信号可以不同。(These can be different for each signal 理解为对于不同的信号可以不同,指的是有的信号可以相等,有的信号可以不相等)
[SWS_Com_00117] AUTOSAR COM 在初始化时清空所有的 update-bits,另见SWS_Com_00059。(SRS_BSW_00101、SRS_Com_02030、SRS_Com_02058)
[SWS_Com_00444] 默认的,所有的 I-PDU 组应该处于停止状态,并且他们不应该被 Com_Init (SWS_Com_00432) 自动启动。(SRS_Com_00218)
【问题】去初始化?还是反初始化?
AUTOSAR COM 模块提供了 API 函数 Com_DeInit 来 de-initialization COM。这意味着,在 de-initialization COM 之后,通过 AUTOSAR COM 的通信是不可能的,并且所有已启动的 I-PDU 都会停止。
这里定义了 AUTOSAR COM 的信号流。更进一步定义了AUTOSAR COM 提供的不同传输模式。还定义了一个 I-PDU 在两种传输模式之间切换的机制,以及信号的复制(replication)。
(Exemplary communication use cases that the AUTOSAR COM module can deal with are shown in Chapter 12.)
AUTOSAR COM 模块应该支持信号的多个传输属性并且I-PDU的多个传输模式。这里的定义是基于,也将被完成,通过 ISO COM Specification 中的定义。
传输属性 Triggered_ON_CHANCE 和 Triggered_ON_CHANCE_WITHOUT_REPETITION 不仅限于某种信号类型。因此,他们支持所有可能的信号类型,甚至包括字节数组类型,例如,UINT8_N。
传输复制机制在 7.3.3.4(本文 3.2.3.4) 中指明。
[SWS_Com_00135] AUTOSAR COM 模块不应该发起 NONE 传输模式的 I-PDUs 的传输。
可以通过 Com_TriggerTransmit 请求带有 NONE 传输模式的 I-PDUs。
一个与 I-PDU关联的 pending 信号,当 I-PDU 由于某种原因触发传输时,这个信号会被传输。例如,一个在同一个 I-PDU 的带有 Triggered 传输属性的信号被发送,或者因为周期或者混合传输模式 I-PDU 发送被调度。
I-PDUs 的总线时序(bus-timing)可以通过 RTE 的发送请求与上面描述的发送模式和发送属性相结合来控制。另外,PDU Router 特别是在 LIN 和 FlexRay 的情况下,可以用 Com_TriggerTransmit 服务来控制。这时,PDU Router 请求从 AUTOSAR COM 发送 I-PDUs。
Com_TriggerTransmit 可以被调用来给任何 I-PDU 而无关其传输模式。这允许 LIN 和 FlexRay 使用所有的可用发送模式,特别是零星的通信。NM 也会使用这个机制发送用户数据。
如果 I-PDU 在一个组信号或者信号组的一个更新的情况下被发出,AUTOSAR COM 信号组和组信号可能都有传输属性,和传输模式相结合而定义。
[SWS_Com_00741] 带有 ComTransferProperty TRIGGERED 属性的信号组,该信号组任何发送请求分配给直接传输模式或者混合传输模式的I-PDU时,COM 会立即(最迟在下一次 mainfunction)启动 ComTxModeNumberOfRepetitions 加 1 次该I-PDU的传输。(SRS_Com_02083)
[SWS_Com_00769] 带有 Triggered_without_reoetition 属性的信号组,该信号组任何发送请求分配给直接传输模式或者混合传输模式的I-PDU时,COM 会立即(最迟在下一次 mainfunction)启动一次被该I-PDU的传输。
[SWS_Com_00742] Triggered_On_Chance 属性的,不包含任何有传输属性的信号的,这样的信号组。该信号组任何发送请求赋值给直接或者混合传输模式的I-PDU时,如果至少有一个新发送的组信号和本地存储的长度或者值不同(上次发送的,或者初始化的),COM应该立即(最迟在下一次 mainfunction)启动 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
[SWS_Com_00743] Triggered_On_Chance 属性的,包含任意一个自己配有传输属性的信号,这样的信号组。该信号组的任何发送请求赋值给直接或者混合传输模式的I-PDU时,如果至少有一个新发送的配置有 Triggered_On_Chance 的组信号和本地存储的长度或者值不同(上次发送的,或者初始化的),COM应该立即(最迟在下一次 mainfunction)启动 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
[SWS_Com_00770] 带有 Triggered_On_Chance_Without_Repetition 属性的信号组,该信号组任何发送请求赋值给直接或者混合传输模式的I-PDU时,如果至少有一个新发送的组信号和本地存储的长度或者值不同(上次发送的,或者初始化的),COM应该立即(最迟在下一次 mainfunction)启动 ComTxModeNumberOfRepetitions 加 1 次被赋值的I-PDU的传输。
I-PDU 携带信号。因为 I-PDU 可以包含多个信号,在下面定义了一个方法,这个方法从从特定I-PDU包含的信号的属性状态,得到I-PDU的传输模式。
COM 应该允许给每个I-PDU静态地配置两种不同的传输模式(SWS_Com_00032)。仅使用映射到该 I-PDU 的信号值来选择在特定时间点有效的 I-PDU 的传输模式。
用于选择传输模式的 I-PDU 的信号以及用于选择传输模式的条件是静态配置的 (SWS_Com_00676)。
对于选择传输模式,COM 把组信号视作普通信号。
[SWS_Com_00676] 对于 TMS 的选择,COM 模块应考虑所有有配置的 ComFilter 容器的(组)信号。 参考 ComSignal 和 ComGroupSignal 包含的容器。 (SRS_Com_02041)。
发送方向的I-PDU的一个信号有配置的 ComFilter 容器,这个信号被称作用于选择这个I-PDU的传输模式。如果该信号的配置容器没有分配的配置容器 ComFilter,这个信号不会用于选择这个I-PDU的传输模式。
[SWS_Com_00677] 如果I-PDU内没有信号可以用于传输模式的选择,COM模块会评估这个I-PDU的发送模式选择器(TMS)为真。
[SWS_Com_00678] COM 评估一个用于发送模式选择的信号的 TMC(发送模式条件)为真,则COM应该评估 TMS 为真。
[SWS_Com_00679] COM 评估用于发送模式选择的信号的 TMC(发送模式条件)全为假,则COM应该评估 TMS 为 false。
[SWS_Com_00605] COM 应该为每一个 I-PDU 定义一个发送模式选择器(TMS)。参见上面 TMS 的定义。 ( SRS_Com_02084)
[SWS_Com_00245] 在包含的一个信号通过调用 Com_SendSignal 或者 Com_SendSignalGroup 更新后,COM 应该重新计算这个 I-PDU 的 TMS。
[SWS_Com_00763] 对于 MASKED_NEW_DIFFERS_MASKED_OLD 配置条件的传输模式的计算,COM 应该只使用最低有效的 ComBitSize 位。
[SWS_Com_00813] 对于 MASKED_NEW_DIFFERS_X, MASKED_NEW_EQUALS_X, NEW_IS_- OUTSIDE, NEW_IS_WITHIN 配置条件的传输模式的计算,COM 模块应使用配置的 ComSignalType 的所有位。
信号过滤算法被配置为 ALWAYS,将始终将相应 I-PDU 的 TMS 设置为 true。因此定义这些用于选择 TMS 的信号时必须注意。
[SWS_Com_00032] 如果 TMS 被评估为 true,COM 应该为这个I-PDU使用定义在配置容器 ComTxModeTrue 的ComTxModeMode。
[SWS_Com_00799] 如果 TMS 被评估为 false,COM 应该为这个I-PDU使用定义在配置容器 ComTxModeFalse 的ComTxModeMode。
[SWS_Com_00238] 在两种 TMS 状态中,ISO COM 中定义的规则,在信号传输属性和 I-PDU 传输模式的组合规则应适用。
[SWS_Com_00239] 当 I-PDU 的 TMS 状态改变时,COM 模块应立即使用现在有效的传输模式(最迟在下一个 mainfunction)。
这意味着,首先 AUTOSAR COM 模块应执行模式更改,然后,COM 模块应执行所以由模式更改引起的对 PduR_ComTransmit 的调用。
[SWS_Com_00244] 如果 TMS 的变化导致 I-PDU 的传输模式发生变化,则 COM 模块将重新启动传输模式 PERIODIC 和 MIXED 的循环时间的计时器。
[SWS_Com_00495] 当对 Com_SendSignal 或 Com_SendSignalGroup 的调用导致已启动的 I-PDU 的传输模式更改为传输模式 PERIODIC 或 MIXED 时,AUTOSAR COM 模块将最迟通过在下一个 mainfunction 中调用 PduR_ComTransmit 来开始新的传输周期。 无论引起传输模式切换的信号或信号组的传输特性如何,都应启动传输。仍应遵守最小延迟时间。 参考图 5( The AUTOSAR COM module’s interaction model for reception )。
不遵守 ComTxModeTimeOffset。 仅显式 I-PDU 传输模式切换时会遵守,例如 Com_IpduGroupStart 或 Com_SwitchIpduTxMode。
[SWS_Com_00582] 如果 TMS 的变化导致传输模式 DIRECT 的变化,则应立即启动(最迟在下一个mainfunction ,除非由于 MDT 移位)直接 n 次到底层的传输。
上述要求阐明了由 ComTransferProperty PENDING 信号触发的 TMS 切换到 ComTxModeMode DIRECT 情况下的行为。
如果 I-PDU 的 ComTxModeMode 配置为 NONE,则 AUTOSAR COM 不会启动传输。 这可用于阻止传输 I-PDU,例如在 TMS 评估为假的情况下。
[SWS_Com_00478] AUTOSAR COM 模块应在 Com_MainFunctionTx 的一次调用中最多发送一次 I-PDU。
在 RTE 发出特定信号的发送请求后,该信号被写入配置定义的相应 I-PDU 缓冲区,并根据第 3.2.3.2 章选择 I-PDU 的传输模式。
RTE 发送请求的 ComTxModeMode DIRECT 或 MIXED 中传输请求的重复次数由配置参数 ComTxModeNumberOfRepetitions (ECUC_Com_00281) 定义。
[SWS_Com_00467] 如果 ComRetryFailedTransmitRequests 未设置为 TRUE 并且传输属性 ComTxModeMode DIRECT 或 MIXED 且 ComTxModeNumberOfRepetitions 设置为 0 的 I-PDU 被触发发送,AUTOSAR COM 模块应为该 I-PDU 调用 PduR_ComTransmit 一次,与确认结果无关。
将 ComTxModeNumberOfRepetitions 配置为 0 模仿 ISO COM Specification 传统的直接传输模式。
[SWS_Com_00279] 如果属于一起的 n 个传输时从 RTE 接收到了新的发送请求(例如,在 5 次重复中的第 3 次之后,参考 SWS_Com_00305),则 AUTOSAR COM 模块应取消未完成的传输重复并最迟在下一个 mainfunction 中开始处理新请求,请参见附录 A 用例 4。
[SWS_Com_00305] 如果发送 ComTxModeMode DIRECT 或 MIXED 且 ComTxModeNumberOfRepetitions 大于 0 的 I-PDU,AUTOSAR COM 模块应定期调用 PduR_ComTransmit,周期为 ComTxModeRepetitionPeriod,直到收到 ComTxModeNumberOfRepetitions +1 次成功确认此发送请求。
SWS_Com_00305 假设 CAN 没有这些 I-PDU 的队列。CAN 驱动程序、接口和硬件之间的交互存在竞争条件,这可能导致在某些不太可能发生的情况下发生额外的传输。
如果底层在 N 次传输过程中返回 E_NOT_OK,则此错误通知将被忽略,除非 ComRetryFailedTransmitRequests 设置为 true(参考 SWS_Com_00773)。 正如 SWS_Com_00305 所指定的,N 次传输只计算确认的传输,可以安全地忽略错误的发送请求。
如果在 MIXED 传输模式的循环传输确认处于 pending 状态之后以传输模式 MIXED 请求 N 次传输,则循环传输的确认将分配给 N 次传输。 在这种情况下,仅观察到 N 次请求的新值的 n-1 次传输。 传输期限监控计时器最早将在 N 次请求完成后重置。 在结合 MIXED 传输模式和 N-Times 传输配置传输期限监视计时器时,必须遵守。
[SWS_Com_00494] 如果在 MIXED 传输模式下,N 次传输请求与混合传输的循环部分重叠,则循环传输应计为 N 次传输请求的相应传输。
[SWS_Com_00392] 如果在 N 次传输完成之前发生传输期限监视超时,则 AUTOSAR COM 模块不应为该 N 次传输启动进一步的传输。
如 ISO COM Specification 第 2.3.4 章中定义的,将始终考虑最小延迟时间。
为了避免启动中的大量I-PDU发送爆发,可以为每个 I-PDU 配置时间偏移。参考 ECUC_Com_00180。
两次重复之间的时间由配置参数 ComTxModeRepetitionPeriod (ECUC_Com_00282) 配置。
如果传输模式改变,通过发送 Triggered 信号导致 MIXED 传输模式的开始,并且 ComTxModeNumberOfRepetitions 配置大于或等于 1,那么在传输开始时至少会有 ComTxModeNumberOfRepetitions 加一个传输请求到 PDU Router 混合传输模式。 参考SWS_Com_00305。
[SWS_Com_00773] 如果 ComRetryFailedTransmitRequests 设置为 TRUE,则应评估 PduR_ComTransmit 的返回值。 如果 PduR_ComTransmit 的返回值不等于 E_OK,AUTOSAR COM 模块应在下一个 Com_MainFunctionTx 内再次为未发送的 I-PDU 调用 PduR_ComTransmit。
如果 I-PDU 在两者之间更新(ComTransmit、Com_MainFunctionTx),则将发送新数据。
SWS_Com_00773 可能会导致对同一失败的传输请求进行多次重试。
SWS_Com_00773 不受传输模式更改的影响。
SWS_Com_00773 对潜在的重复周期没有影响。 任何重复都会发生,就好像没有重试发生过一样。
[SWS_Com_00774] AUTOSAR COM 模块应独立于可能的重试启动传输期限监控。 随后的重试不应影响传输期限监控。
[SWS_Com_00775] 如果 ComRetryFailedTransmitRequests 设置为 True,并且 I-PDU 发生传输期限监视超时,则 AUTOSAR COM 模块应使该 I-PDU 的任何 pending 的传输请求到期。
[SWS_Com_00776] 循环传输的循环计时器应始终从第一次传输尝试开始。
AUTOSAR COM 模块为发送方提供了指示其无法为相应信号提供有效值的可能性,例如在传感器出现故障的情况下。 AUTOSAR COM 模块允许在配置期间定义 ComSignalDataInvalidValue (ECUC_Com_00391)。
[SWS_Com_00099] 通过调用 Com_InvalidateSignal,AUTOSAR COM 模块应在内部使用配置的 ComSignalDataInvalidValue (ECUC_Com_00391) 执行 Com_SendSignal。
ComTransferProperty 和传输模式决定了 ComSignalDataInvalidValue 在总线上的传输。 内部执行的带有数据无效值的 Com_SendSignal 导致数据无效值用作过滤器和 TMS 的当前值。
数据无效值是按组信号配置的,参考 ECUC_Com_00520。
VFB( Virtual Functional Bus ) 只为复杂数据类型定义了一个属性。 因此,无效复杂数据类型到无效信号组的最佳映射是使一个信号组的所有组信号无效。 因此,RTE 也可以通过调用 Com_InvalidateSignalGroup 来请求使整个信号组失效
[SWS_Com_00680] 如果为一个信号接收到配置的 ComSignalDataInvalidValue (ECUC_Com_00391) 并且 ComDataInvalidAction (ECUC_Com_00314) 配置为通知该信号,则 AUTOSAR COM 模块应通过配置的 ComInvalidNotification 功能 (ECUC_Com_00315) 通知 RTE。 在这种情况下,不应进行其他信号处理,如过滤或正常信号通知。
如果接收到无效的信号或信号组,接收期限监视计时器也会重新启动,请参阅 SWS_Com_00738。
[SWS_Com_00681] 如果为信号接收到配置的 ComSignalDataInvalidValue (ECUC_Com_00391) 并且 ComDataInvalidAction (ECUC_Com_00314) 配置为 REPLACE (替换)此信号,则 AUTOSAR COM 模块应将信号的值替换为其配置的 ComSignalInitValue (ECUC_Com_00170)。 替换后,正常的信号处理,如过滤和通知,就好像收到了 ComSignalInitValue 而不是 ComSignalDataInvalidValue。
[SWS_Com_00682] 如果为一个信号组的至少一个组信号接收到配置的 ComSignalDataInvalidValue (ECUC_Com_00391) 并且 ComDataInvalidAction (ECUC_Com_00314) 配置为 NOTIFY 通知该信号组,则 AUTOSAR COM 模块应通过配置的 ComInvalidNotification 功能 (ECUC_Com_00315) 通知 RTE . 在这种情况下,不会发生像正常指示那样的其他信号组/组信号处理。
[SWS_Com_00683] 如果为一个信号组的至少一个组信号接收到配置的 ComSignalDataInvalidValue (ECUC_Com_00391) 并且 ComDataInvalidAction (ECUC_Com_00314) 被配置为 REPLACE 替换该信号组,则 AUTOSAR COM 模块应将该信号组的所有组信号替换为它们的 配置 ComSignalInitValue 值。 更换后,接收通知等正常信号组/组信号处理就好像所有组信号都已收到 ComSignalInitValue 一样。
[SWS_Com_00717] 如果接收到配置的 ComSignalDataInvalidValue 信号且其 ComDataInvalidAction 配置为 NOTIFY,AUTOSAR COM 模块不应将接收到的 ComSignalDataInvalidValue 存储到信号对象中。
对 Com_ReceiveSignal 的下一次调用将分别返回最后一个有效接收信号或 ComSignalInitValue,以防尚未接收到信号。
[SWS_Com_00718] 如果为一个信号组的至少一个组信号接收到配置的 ComSignalDataInvalidValue,并且其 ComDataInvalidAction 配置为 NOTIFY,则 AUTOSAR COM 模块不应将任何接收到的组信号存储到信号对象中。
对 Com_ReceiveSignalGroup 的下一次调用将复制最后有效接收的组信号或 ComSignalInitValues,以防信号组尚未对应接收到 shadow 缓冲区。
对于 I-PDU 组,遵从以下规则:
COM 配置支持规则 1 和 3。 可通过 ComSupportedIpduGroups 配置支持的 I-PDU 组的最大数量。
[SWS_Com_00771] 如果所属的 I-PDU 组至少一个 I-PDU 组是 active(started 启动),则 I-PDU 是活动(开始)。
对于 AUTOSAR COM 模块,I-PDU 组的嵌套纯粹是概念性的,必须通过适当的配置和/或(and/or) AUTOSAR COM 模块的使用来解决。
例如,如果一个 I-PDU“BUS1 RX Function1”属于 I-PDU 组“BUS1 RX”并且 I-PDU 组“BUS1 RX”包含在 I-PDU 组“BUS1”中,则 I-PDU“BUS1 RX Function1” ”也必须包含在 I-PDU 组“BUS1”中。 这种依赖关系需要在配置时解决。
强调,COM 模块不知道也不处理任何 I-PDU 分组。 任何 I-PDU 分组都必须通过配置或调用模块处理。
此外,预计 I-PDU 组的完整状态处理在 AUTOSAR COM 模块之外完成,例如 在 BSW Mode Manager 中。 在状态改变的情况下,管理 I-PDU 组状态的模块通过 Com_IpduGroupStart 和 Com_IpduGroupStop 一致地启动或停止 I-PDU 组。
未分配给任何 I-PDU 组的 I-PDU 的状态无法更改,因此它们是隐式启动的:
[SWS_Com_00840] 如果一个 I-PDU 没有分配给任何 I-PDU 组,AUTOSAR COM 将在 Com_Init 内启动这个 I-PDU,就好像它将由 Com_IpduGroupStart 启动,参数 Initialize 设置为真(参考3.2.5.2)
默认情况下,所有 I-PDU 组都已停止,请参阅 SWS_Com_00444。 对 Com_IpduGroupStart 的调用会启动一个 I-PDU 组,如果这个 I-PDU 组之前停止了。
[SWS_Com_00114] 如果一个 I-PDU 由 Com_IpduGroupStart 启动,则 AUTOSAR COM 模块应允许发送/接收其信号和信号组,另见表 4。 (SRS_Com_00218)
[SWS_Com_00787] 如果 I-PDU 由 Com_IpduGroupStart 启动,AUTOSAR COM 模块应始终初始化此 I-PDU 的以下属性:
[SWS_Com_00222] 如果 I-PDU 由 Com_IpduGroupStart 启动且参数 Initialize 设置为 true,则 AUTOSAR COM 模块应在 SWS_Com_00787 之外初始化此 I-PDU 的以下属性:
[SWS_Com_00223] 如果一个 I-PDU 由 Com_IpduGroupStart 启动,AUTOSAR COM 模块应根据其当前数据内容确定其传输模式。 (SRS_Com_00218)
[SWS_Com_00228] 在某些情况下,I-PDU 在其包含的所有信号都被写入之前由 Com_IpduGroupStart 启动。 在这种情况下,AUTOSAR COM 模块应将 ComSignalInitValue 用于丢失的信号数据。(SRS_Com_00218)
[SWS_Com_00229] 当一个 I-PDU 启动并且该 I-PDU 中的一个或多个信号已经由上层通过其中一个发送 API 写入时,AUTOSAR COM 模块应使用最近获得的值来确定 I-PDU 的 TMS 。(SRS_Com_00218)
[SWS_Com_00733] 如果 I-PDU 由 Com_IpduGroupStart 启动,并且 I-PDU 包含配置了 DM 的信号(ECUC_Com_00183,ECUC_Com_00263),则 AUTOSAR COM 模块应独立于初始化参数的值,来启动这些信号的 DM。 (SRS_Com_00218)
注意,如果 I-PDU 由 Com_IpduGroupStart 启动并且参数 initialize 设置为 false,则内部缓冲区 internal buffers 不会更改,并且 I-PDU 包含最后一个最后设置的或初始化的值。 特别的,如果第一次启动 I-PDU 并且 initilaize 设置为 false,则 COM 对 Com_Init 设置的 init-values 进行操作。
[SWS_Com_00877] 如果一个 I-PDU 不属于任何 I-PDU 组,它会在 COM 初始化期间启动。 其起始传输模式应根据用于计算 TMS 的信号的 ComSignalInitValue 进行评估。(SRS_Com_00218)
对于这种情况,可以在配置时进行评估,因为在 COM 初始化之前无法写入信号。
对 Com_IpduGroupStop 的调用会停止一个 I-PDU 组,如果它之前已启动。
为了禁用 I-PDU 的传输,需要停止包含该 I-PDU 的所有 I-PDU 组。 因此,为了实现只听模式,需要停止所有包含传输 I-PDU 的 I-PDU 组。 接收 I-PDU 也可能停止。
[SWS_Com_00334] 通过调用函数:Com_SendSignal、Com_SendSignalGroup 或 Com_InvalidateSignal,AUTOSAR COM 模块应更新其内部缓冲区的值,即使对于停止的 I-PDU。 见表 3。(SRS_Com_00218)
如果写入停止的 I-PDU 的信号在未停止的情况下会触发该 I-PDU 的传输,则不存储该触发。 在重新启动相应的 I-PDU 组之后,这样的旧触发不会导致立即传输 I-PDU。
[SWS_Com_00777] 如果一个 I-PDU 被 Com_IpduGroupStop 停止,则 AUTOSAR COM 模块将取消该 I-PDU 的任何未完成的传输请求。 这包括取消与 ComRetryFailedTransmitRequests 相关的任何潜在重试。(SRS_Com_00218)
[SWS_Com_00115] 如果一个 I-PDU 被 Com_IpduGroupStop 停止,AUTOSAR COM 模块将取消所有 pending 确认的 DM。(SRS_Com_00218)
[SWS_Com_00800] COM 模块应忽略停止的 I-PDU 的任何发送确认。(SRS_Com_00218)
AUTOSAR COM 模块不能禁止调用 Com_TriggerTransmit 函数。 然而,在 I-PDU 停止的情况下,函数 Com_TriggerTransmit 返回 E_NOT_OK。 参考 SWS_Com_00884。
[SWS_Com_00684] 如果 I-PDU 被 Com_IpduGroupStop 停止,则 AUTOSAR COM 模块应禁用其接收处理。 (SRS_Com_00218)
[SWS_Com_00713] 如果一个大的 I-PDU 被 Com_IpduGroupStop 停止,AUTOSAR COM 模块将停止接收过程并忽略部分接收的 I-PDU。 (SRS_Com_00218)
[SWS_Com_00685] 如果 I-PDU 被 Com_IpduGroupStop 停止,则 AUTOSAR COM 模块应取消其DM。 (SRS_Com_00218)
[SWS_Com_00479] 如果 I-PDU 被 Com_IpduGroupStop 停止,则 AUTOSAR COM 模块应立即调用配置的 ComErrorNotification (ECUC_Com_00499),用于停止的 I-PDU 的未确认的传输信号/信号组。 (SRS_Com_00218)
[SWS_Com_00714] 如果一个大型 I-PDU 在其传输过程中被停止,AUTOSAR COM 模块应立即停止传输过程。 (SRS_Com_00218)
Table 3 给出停止 I-PDU 的行为总览:
Table 4 给出启动的 I-PDU 的行为总览:
为了同时支持中断驱动和轮询系统,它可以在信号指示发生时进行配置。 有两种可配置的信号指示模式 IMMEDIATE 和 DEFERRED 可通过 ComIPduSignalProcessing 进行配置。 参考ECUC_Com_00119。
[SWS_Com_00300] 如果 I-PDU 的 ComIPduSignalProcessing 配置为 IMMEDIATE,则 AUTOSAR COM 模块应分别为 Com_RxIndication 或 Com_TpRxIndication 函数中包含的信号和信号组调用配置的 ComNotifications。(SRS_Com_02046)
[SWS_Com_00301] 如果 I-PDU 的 ComIPduSignalProcessing 配置为 DEFERRED,则 AUTOSAR COM 模块应首先将 Com_RxIndication 函数或相关 TP 接收函数中的 I-PDU 数据分别从 PduR 复制到 COM。 然后 AUTOSAR COM 模块应在下次调用 Com_MainFunctionRx 期间异步调用所包含的信号和信号组配置的 ComNotifications。(SRS_Com_02046)
如果在 DEFERRED 模式下,在延迟解包发生之前调用 Com_ReceiveSignal,则返回之前未更新的值。
在第 9.3 章(AUTOSAR COM Specification of Communicate的第9.3,本文档的第 5.3,之后的类似,不再详细解释 )中可以找到具有两种指示选项的时序图。 这些模式的配置在ECUC_Com_00119 中定义。
[SWS_Com_00574] 解包 I-PDU 时,AUTOSAR COM 模块应检查接收到的数据长度(PduInfoPtr->SduLength), 仅解包并通过 ComNotification 通知完全接收到的信号。(SRS_Com_02046)
[SWS_Com_00870] 在接收比通过参数 ComPduIdRef 导出的长度更小的 I-PDU 的情况下,当且仅当其配置的位置小于或等于部分接收的 I-PDU 的接收大小时,才应接收大小为 0 的信号。 (SRS_Com_02046)
[SWS_Com_00794] 如果接收到比预期更小的 I-PDU 导致接收到没有配置更新位的信号,AUTOSAR COM 模块应将此信号视为其更新位已设置,并将此类信号解释为已更新。 (SRS_Com_02046)
如果接收到的 I-PDU 长度小于配置/预期的 I-PDU 长度,则需要防止信号被部分更新。 另一方面,所有完全接收到的信号都应该被接收并通知给上层。
[SWS_Com_00575] 解包 I-PDU 时,AUTOSAR COM 模块应检查接收到的数据长度(PduInfoPtr->SduLength),如果仅部分接收到信号组,则不应解包或通过ComNotification通知该信号组和所有包含的组信号。
上述要求可防止收到不一致的信号组,从而防止收到不一致的复杂数据类型。
AUTOSAR COM 模块不会复制或处理未配置信号的额外接收数据,以防接收到的数据长度大于预期。
AUTOSAR COM 模块继承了 ISO COM Specification 定义的最小延迟计时器机制。
当一个 I-PDU 启动时,MDT 被重新初始化。 因此,快速停止和启动 I-PDU 可能违反 MDT。
DM 的行为不受 MDT 监视引起的任何传输延迟的影响。
[SWS_Com_00471] 如果 ComMinimumDelayTime 被省略或配置为 0,则不会发生最小延迟时间监控。(SRS_Com_02037)
[SWS_Com_00789] 如果 ComEnableMDTForCyclicTransmission (ECUC_Com_- 00788) 配置为 false,则在以下情况下不得(重新)启动最小延迟计时器:
运行的最小延迟计时器在接收到该 I-PDU 的成功发送确认时重新加载,除非在接收到确认时传输已经延迟超过 ComMinimumDelayTime。 在正常情况下,AUTOSAR COM 模块不会进一步传输该 I-PDU,除非加载和启动的最小延迟已过期。 另见 ISO COM Specification 中的图 2-4、2-5 和 2-7。 但是,存在一些例外:根据 SWS_Com_00475 Com_-TriggerTransmit 不会干扰最小延迟计时器。 进一步地,如果 DM 超时,则复位最小延时定时器。 见 ISO COM Specification 中的第 2.3.4 章。 此外,启动一个 I-PDU 组会重置包含的 I-PDU 的最小延迟时间计时器
[SWS_Com_00812] 如果一个 I-PDU 的最小延迟计时器因为 DM 到期而重置,并且存在对该 I-PDU 的延迟请求,则 AUTOSAR COM 模块应立即传输该 I-PDU。(SRS_Com_02037)
在 ISO COM Specification 中定义了对信号的 DM。
在对信号组进行最后期限监视的上下文中,它像信号一样处理。截止日期监视参数 ComFirstTimeout 和 ComTimeout 可以在配置容器 ComSignal 或 ComSignalGroup 中定义。
相应的超时通知回调函数可以在配置容器 ComSignal 或 ComSignalGroup 的参数 ComTimeoutNotification 中定义。
[SWS_Com_00333] 如果一个信号或信号组的配置参数 ComTimeout 被省略或配置为 0,则 AUTOSAR COM 模块不应监视该信号或信号组。 它还应忽略 ComFirstTimeout。(SRS_Com_02089)
接收 DM 可以通过类似于第 3.2.5.1 章的 I-PDU 组的控制来启用和禁用。
[SWS_Com_00772] 当且仅当 I-PDU 包含在启用了接收 DM 的 I-PDU 组中时,才启用 I-PDU 的接收DM。 否则,禁用 I-PDU 的接收DM。(SRS_Com_00192)
[SWS_Com_00292] 在为具有更新位的信号配置接收DM的情况下,AUTOSAR COM 模块应对每个具有更新位的信号/信号组执行单独的接收DM。 有关 ComTimeout 的配置,请参见 ECUC_Com_00263。 (SRS_Com_02089,SRS_Com_02058)
[SWS_Com_00290] AUTOSAR COM 模块应对没有更新位的信号执行基于 I-PDU 的接收DM。 (SRS_Com_02089,SRS_Com_02058)
[SWS_Com_00291] 对于同一 I-PDU 中没有更新位的所有信号和信号组,AUTOSAR COM 模块应使用所有这些未配置更新位的信号组\信号的配置的最小非零超时参数(ComFirstTimeout,ComTimeout)来执行 I-PDU 的接收DM。 (SRS_Com_02089, SRS_Com_02058)
如果配置了接收DM的 I-PDU 中的所有信号也配置了更新位,则不需要执行基于 I-PDU 的接收DM。
在接收超时的情况下,ComRxDataTimeoutAction 参数确定 AUTOSAR COM 模块是用初始值或替代值替换信号/信号组值还是保持上次接收的值。 请参见 ECUC_Com_00412。
[SWS_Com_00470] 如果 ComRxDataTimeoutAction 设置为 REPLACE(参见ECUC_Com_00412),则 AUTOSAR COM 模块应在信号的接收DM到期时将信号的值替换为其 ComSignalInitValue(参见 ECUC_Com_00170)。(SRS_Com_02087,SRS_Com_02088)
如果 ComSignalInitValue 替换了最后接收到的值,最后接收到的值将被覆盖并丢失。 因此,AUTOSAR COM 模块返回该信号的 ComSignalInitValue,直到接收到新值。
[SWS_Com_00875] 如果 ComRxDataTimeoutAction 设置为 SUBSTITUTE(参见 ECUC_Com_00412),则当信号的接收期限监视计时器到期时,AUTOSAR COM 模块应将信号的值替换为其 ComTimeoutSubstitutionValue(参见 ECUC_Com_10006)。 (SRS_Com_02088)
[SWS_Com_00500] 如果一个信号或信号组的接收DM超时,并且该信号或信号组的配置参数 ComRxDataTimeoutAction 被省略或配置为 NONE,则 AUTOSAR COM 模块不应替换该信号或分别替换信号组的信号。 (SRS_Com_02087)
[SWS_Com_00513] 如果 ComRxDataTimeoutAction 设置为 REPLACE(ECUC_Com_00412),则当信号组的接收期限监视计时器到期时,AUTOSAR COM 模块应将所有包含的组信号的值替换为其 ComSignalInitValues(参见 ECUC_Com_00170)。(SRS_Com_02041)
Rx-timeout-indication 可以与ECUC_Com_00412 分开组合和配置。
[SWS_Com_00876] 如果ComRxDataTimeoutAction设置为SUBSTITUTE(ECUC_Com_00412),则当信号组的接收期限监视计时器到期时,AUTOSAR COM 模块应将所有包含的组信号的值替换为其 ComTimeoutSubstitutionValue(参见 ECUC_Com_10006)。 (SRS_Com_02088)
[SWS_Com_00715] 当成功接收到一个(大)I-PDU 配置了接收期限监控时,AUTOSAR COM 模块应在调用函数 Com_RxIndication 或 Com_TpRxIndication 时分别重置该(大)I-PDU 的接收期限监控计时器。(SRS_Com_02058)
[SWS_Com_00716] 如果一个信号或信号组的配置参数 ComFirstTimeout 被省略或配置为 0,则 AUTOSAR COM 模块从相应的 I-PDU 开始直到第一次接收,都不应监控该信号或分别监控信号组的接收。 (SRS_Com_02058)
[SWS_Com_00738] 基于 I-PDU 的接收期限监控机制不应考虑信号的值。 (SRS_Com_02089)(【意思是不过滤吗?】)
当 I-PDU 的接收期限监控被禁用并且定时器到期时,不会向 RTE 提供错误指示。
禁用接收期限监控不会停止接收 I-PDU。
[SWS_Com_00224] 如果 I-PDU 的接收期限监控由 Com_EnableReceptionDM 启用,则 AUTOSAR COM 模块应将包含的信号和信号组的接收期限监控定时器设置为配置的 ComFirstTimeout 值。
[SWS_Com_00486] AUTOSAR COM 模块应静默忽略将 I-PDU 的接收期限监控设置为由 Com_EnableReceptionDM 启用,以防该 I-PDU 已启用接收期限监控。(SRS_Com_00192)
启用接收期限监控意味着期限监控到期的超时通知被通知给 RTE,用于使用配置了 ComTimeoutNotification (ECUC_Com_00552) 的信号或信号组。
[SWS_Com_00534] 如果在包含Tx-I-PDU的I-PDU组上调用Com_EnableReceptionDM或Com_DisableReceptionDM,则AUTOSAR COM模块应默认忽略此请求。(SRS_Com_00192)
[SWS_Com_00225] AUTOSAR COM 模块应默认忽略将 I-PDU 的接收期限监控设置为由 Com_DisableReceptionDM 禁用,以防该 I-PDU 的接收期限监控已被禁用。
AUTOSAR COM 传输期限监控的总体思路是监控底层和总线,而不是 COM 模块本身。 因此,传输监控定时器一般在COM模块向下层发送I-PDU时启动。 这与传输模式、传输属性或更新位无关。 通常,如果传输监控计时器当前正在运行,则不会重新启动或重置传输监控计时器。
[SWS_Com_00481] AUTOSAR COM 模块应独立于传输属性和独立于信号/信号组所属的 I-PDU 的传输模式对所有信号和信号组执行传输期限监视(如果已配置)。(SRS_Com_02037)
AUTOSAR COM 模块在传输期限监控方面不区分具有 ComTransferProperty PENDING 或 TRIGGERED 的信号。
[SWS_Com_00445] 如果一个 I-PDU 的相关信号/信号组的 ComTimeout 参数配置不同,AUTOSAR COM 模块应使用最小值作为超时参数该 I-PDU 的超时参数。(SRS_Com_02037)
传输期限监控只能在支持生成传输确认的总线的 AUTOSAR COM 模块中配置。 否则,传输期限监控将总是通知传输错误。
[SWS_Com_00878] 如果信号(在一个 I-PDU 内)被发送到低层,AUTOSAR COM 将启动一个已配置的信号(组)传输期限监视定时器,除非该定时器已经在运行。
SWS_Com_00878 不考虑潜在的返回码,因此即使发送的请求立即失败,也会启动计时器。
如果计时器已经在运行,则新的发送请求不会重置或重新启动正在运行的计时器,但会进一步监控当前未完成的发送请求。 除非另有说明,否则无论导致潜在 I-PDU 发送请求的原因是什么,都会启动计时器。 这样的触发原因例如是信号的周期发送请求、传输模式切换或通过 Com_TriggerIPduSend 发送的显式 I-PDU 请求。
[SWS_Com_00879] 如果该 I-PDU 的传输期限监控服务(重新)启动后第一次启动,则传输期限监控定时器应以配置的 ComFirstTimeout 值启动,否则该定时器应以 ComTimeout 值启动。(SRS_Com_02037)
[SWS_Com_00880] 当 AUTOSAR COM 接收到一个 I-PDU 的传输确认时,它将取消所有正在运行的所有包含的信号和信号组的传输期限监视计时器。(SRS_Com_02037)
[SWS_Com_00696] 如果传输模式仅为 NONE 的 I-PDU 配置了传输期限监控,AUTOSAR COM 模块应在 I-PDU 所属的 I-PDU 组开始时启动该 I-PDU 的传输期限监控计时器。(SRS_Com_02037)
[SWS_Com_00835] 如果为具有传输模式 NONE 和其他传输模式的 I-PDU 配置传输期限监控,则只要传输模式 NONE 处于活动状态,就应禁用传输期限监控。(SRS_Com_02037)
[SWS_Com_00697] 如果传输模式仅为 NONE 的 I-PDU 配置了传输期限监视,则 AUTOSAR COM 模块应在收到成功的传输确认时重置此 I-PDU 的传输期限监视计时器。(SRS_Com_02037)
在信号组的情况下,只能为整个信号组配置传输期限监控,而不能为组信号配置,请参见 ECUC_Com_00345 和 ECUC_Com_00520。
[SWS_Com_00708] 如果 ComIPduCancellationSupport 配置为 TRUE 的 I-PDU 的传输期限监视计时器到期,则 AUTOSAR COM 模块应为该 I-PDU 调用 PduR_ComCancelTransmit。(SRS_Com_02107)
PduR_ComCancelTransmit 的调用是在 Com 的正常超时处理之外完成的,如果 PduR_ComCancelTransmit 已配置,它会通知 SW-C。
AUTOSAR COM 忽略 PduR_ComCancelTransmit 的返回码。
[SWS_Com_00304] 当传输截止时间监控计时器过去时,即对于I-PDU没有及时成功的传输确认,AUTOSAR COM模块应为包含的信号和信号组,通过调用所有已配置的ComTimeoutNotifications来通知RTE,参见ECUC_Com_00552。(SRS_Com_02037)
如果传输期限监控定时器用完,不管什么原因都会有超时通知。 例如,如果传输被 I-PDU Callout 过滤掉,通知都会发生。
如 ISO COM Specification 中定义的,如果分别为相应的信号或信号组配置了传输期限监控,则必须在完成对 Com_SendSignal 或 Com_SendSignalGroup 的调用时分别启动监控计时器。
对于 DIRECT 和 MIXED 传输模式,应确保所有 ComTxModeNumberOfRepetitions 这么多次请求都可以在配置的周期内发出(参见第 7.3.3.4 章,本文3.2.3.4)。
如 ISO COM Specification 中定义的,如果监视计时器到期,则使用配置的通知机制向 RTE 通知有关这个失败。
[SWS_Com_00308] 对于 ComTxModeMode DIRECT 并且 ComTxModeNumberOfRepetitions > 0 的 I-PDU,AUTOSAR COM 模块应在 ComTxModeNumberOfRepetitions 加一个成功接收的传输确认后取消传输期限监视计时器。
如果在 ComTxModeNumberOfRepetitions + 1 个确认后取消定时器,则传输成功,然后将传输确认发送给 RTE。 另请参见 SWS_Com_00305
[SWS_Com_00739] 对于 ComTxModeMode DIRECT 和 ComTxModeNumberOfRepetitions > 0 的 I-PDU,如果发起对该 I-PDU 的另一个发送请求,AUTOSAR COM 模块应重置已经运行的传输截止时间监视计时器。(SRS_Com_02083)
AUTOSAR COM 继承了 [17] 的通知类 1、2、3、 4。 通知可通过 ComNotification 进行配置,回调的定义在第 8.6.3.1 章(本文4.6.3.1)中给出。
[SWS_Com_00883] 如果为信号或信号组配置了 ComNotification,则 AUTOSAR COM 应通过配置的 ComNotification 指示每次成功传输。(SRS_Com_02046)
例如,对于周期性传输,通知每个成功的周期性传输。 注意,对于 n 次传输,总线上需要多次传输才能被视为成功,另请参见 SWS_Com_00305。
为了支持复杂数据类型的 AUTOSAR 概念,AUTOSAR COM 模块提供了信号组。 AUTOSAR COM 模块一致地发送和接收信号组,为复杂的数据类型提供必要的一致性。
信号组可以静态配置。 可以为每个信号组配置一个符号名称。 有关配置详细信息,请参见 ECUC_Com_00345。
AUTOSAR COM 模块通过 shadow buffer 机制实现信号组的一致性,即 RTE 访问 shadow buffer 中的组信号。 如果 shadow buffer 需要与 I-PDU 同步,RTE 可以使用 Com_SendSignalGroup 或 Com_ReceiveSignalGroup 显式触发。 同步以原子方式执行。
信号组一致性的另一种方法是启用信号组数组 API Com_SendSignalGroupArray (SWS_Com_00851) 和 Com_ReceiveSignalGroupArray (SWS_Com_00854)。 这种方法的偏差在第 7.4.6 章(本文3.3.6)中描述。
[SWS_Com_00484] 通过调用 Com_Init,AUTOSAR COM 模块应在发送方初始化信号组的 shadow buffer 。(SRS_BSW_00101)
由于格式良好的 SWC 在调用 Com_ReceiveSignalGroup 之前不会尝试读取组信号,因此 SWS_Com_00484 仅适用于发送方。【即,接收方没有初始化?】
如果为属于信号组的信号调用 Com_SendSignal 或 Com_InvalidateSignal,则 AUTOSAR COM 将仅更新该信号组的影子缓冲区。 没有任何进一步的 I-PDU 处理,例如 TMS 评估,除非 I-PDU 内容发生变化。
[SWS_Com_00050] 如果为信号组调用 Com_SendSignalGroup,则 AUTOSAR COM 模块应自动将 shadow buffer 复制到 I-PDU 缓冲区。(SRS_Com_02041)
// 两个组信号 a,b 都属于 信号组 x
// 复制 a 到 shadow buffer
Com_SendSignal(signal_a, &a);
// 复制 b 到 shadow buffer
Com_SendSignal(signal_b, &b);
// 复制 shadow buffer 到 I-PDU
Com_SendSignalGroup(group_x);
在信号组数据由 Com_ReceiveSignalGroup 复制到shadow buffer后,可以通过调用函数 Com_ReceiveSignal 从shadow buffer接收组信号。
[SWS_Com_00051] 如果为信号组调用Com_ReceiveSignalGroup,AUTOSARCOM模块应以原子方式将数据从I-PDU缓冲器复制到shadow buffer。(SRS_Com_02041)
// 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);
Table 5 显示所有只能针对信号组进行配置的通知函数,而不能针对单个组信号进行配置。 第 7.3 章(本文3.2)定义了信号和信号组的通知方法的功能逻辑。 可配置通知函数的原型在第 8.6.3.1 章(本文4.6.3.1)中定义。
基于 UINT8 数组的信号组访问
信号组一致性的另一种方法是通过 COM 配置参数 ComSignalGroupArrayAccess (ECUC_Com_10003) 启用信号组数组 APIs Com_SendSignalGroupArray (SWS_Com_00851) 和 Com_ReceiveSignalGroupArray (SWS_Com_00854)。 然后复合数据的序列化在 COM 模块之外完成,但结果与 COM 将组信号放置在 I-PDU 中的使用的布局相同。 在这种方法中,不使用shadow buffer。 序列化的数据作为信号组的 uint8 数组表示直接提供给 COM 模块。
[SWS_Com_00841] 仅在以下前提条件适用时才应使用基于 UINT8 数组的信号组访问:
[SWS_Com_00842] 如果信号组定义了 ComSignalGroupArrayAccess (ECUC_Com_10003),则不应为该信号组分配shadow buffer。(SRS_Com_02112)
[SWS_Com_00843] 如果信号组定义了 ComSignalGroupArrayAccess (ECUC_Com_10003),则该信号组不支持对以下 API 的调用:
上述要求定义了具有数组访问权限的信号组不支持某些 API。 也就是说,禁止为具有数组访问权限的信号组调用这些 API。 如果它们被非法调用,则行为未定义。
由于信号组以 uint8-array 表示形式提供,因此在评估(evaluating,我理解为这里的意思是使用)组信号时,接收过滤和传输模式选择需要处理这种数据表示。
为了简化过滤器评估,仅支持来自 SWS_Com_00602 的过滤器子集。
对于信号组数组访问,以下两个过滤器被排除在接收过滤和传输模式选择之外:
[SWS_Com_00848] 信号组数组处理函数 Com_SendSignalGroupArray 和 Com_ReceiveSignalGroupArray 应支持以下过滤器用于接收过滤和传输模式选择:
如果使用 AUTOSAR Transformer 方法,则序列化和进一步的数据处理已经在Transformer链中完成。 由于Transformer链已经处理了通信数据的 uint8-array 表示,基于 uint8array 对信号组的访问允许使用已经序列化的数据并将其放入 I-PDU 而无需 COM 再次序列化数据 。
The AUTOSAR System Template 定义了应在基于 uint8-array 的方法中处理哪个信号组。 如果 System Template 启用基于 uint8-array 的方法,则 Ecu 配置参数 ComSignalGroupArrayAccess (ECUC_Com_10003) 设置为 true。
[SWS_Com_00844] 通信数据的 uint8-array 表示的起始位置应为该信号组中 ComBitPosition 最小的组信号的字节偏移量。(SRS_Com_02112)
[SWS_Com_00845] 通信数据的uint8-array表示的结束位置应为该信号组中ComBitPosition最高的组信号占用的最后一个字节的字节偏移量。(SRS_Com_02112)
[SWS_Com_00850] 通过调用 Com_Init,AUTOSAR COM 模块应根据所有包含的 ComGroupSignals 的 ComSignalInitValue 初始化信号组的相应 I-PDU 缓冲区部分,该部分已将 ComSignalGroupArrayAccess (ECUC_Com_10003) 配置为 true。(SRS_Com_02112,SRS_BSW_00101)
[SWS_Com_00846] 当 Com_SendSignalGroupArray 被调用时,将提供指向信号组的 uint8 数组表示的数据指针。 AUTOSAR COM 模块应根据 SWS_Com_00844 中定义的起始位置和 SWS_Com_00845 中定义的大小将数据复制到 I-PDU。(SRS_Com_02112)
[SWS_Com_00847] 在以下方面中,COM 模块对 Com_SendSignalGroupArray 处理等同于 Com_SendSignalGroup:
[SWS_Com_00849] 当 Com_ReceiveSignalGroupArray 被调用时,将提供指向信号组的 uint8 数组表示的数据指针。 AUTOSAR COM 模块应根据 SWS_Com_00844 中定义的起始位置和 SWS_Com_00845 中定义的大小将数据复制到 I-PDU 的数据指针位置。(SRS_Com_02112)
Large Signal 大信号是太大而无法装入底层通信协议的单个 L-PDU 的信号。 例如,CAN 上的大信号将超过 8 字节或 CAN FD 的 64 字节。 对于 FlexRay,情况更为复杂,因为一帧可以包含多个 I-PDU。 因此,一个信号即使它不超过 FlexRay 帧的大小,对于 FlexRay 来说也可能是一个大信号。
AUTOSAR 中的大信号需要配置一个大型 I-PDU,该 I-PDU 将通过底层总线的传输协议进行传输。 大型 I-PDU 不一定包含一个或多个大信号。 使用这个概念,I-PDU 长度和信号大小将根据总线特定的传输协议受到限制,请参阅 ECUC_Com_00437。 UINT8_N 是唯一支持静态大小大于 8 字节的信号的信号类型。 有关动态长度信号,请参见第 7.6 章(3.5)。
由于 AUTOSAR COM 模块不了解底层总线属性,因此必须配置 I-PDU 是否可以在单个 L-PDU 内传输,例如 一个 CAN 帧,或者如果需要通过 TP 传输,另请参见 ECUC_Com_00761。
AUTOSAR COM 模块无法阻止或检测是否将太大的 I-PDU 发送到特定的总线传输协议,因为 AUTOSAR COM 模块使用与总线无关的 PduR接口。 不过,AUTOSAR COM 模块允许使用底层 TP 的 N-SDU 的最大长度,因此 AUTOSAR COM 模块不会引入任何额外的长度限制。
AUTOSAR COM 模块通过通用 PduR API 为使用传输协议的上层模块发送大型 I-PDU。 有关 AUTOSAR COM 模块 – PduR 接口的详细信息,请参见第 7.8 章(3.7)。 根据 PduR Specification,调用序列是:
[SWS_Com_00662] 在通过 PduR_ComTransmit 成功启动Large I-PDU 的传输后,AUTOSAR COM 模块不应修改此 I-PDU 的内部传输缓冲区的数据,除非 AUTOSAR COM 模块被通知成功传输或错误指示传输被丢弃。(SRS_Com_02095)
AUTOSAR COM 模块中的 I-PDU 是静态配置的。 因此,即使对于非常大的 I-PDU,也会分配 I-PDU 的完整内存。 采用这种方法是为了降低大数据类型处理的复杂性。
如果所使用的传输协议也用于诊断或其他服务,那么它必须支持多个用户。至少CANTP和FlexRayTP支持这一点。
[SWS_Com_00863] 如果当前传输了较大的I-PDU,并且再次触发了相同的I-PDU进行传输,则AUTOSAR COM将跳过额外的发送请求,并报告运行时错误COM_E_SKIPPED_TRANSMISSION。 (SRS_Com_02095)
例如,如果大I-PDU周期发送,并且下一个周期传输延迟,可能会发生这种情况。(意思是本周起未发送结束,下个周期又要开始)
AUTOSAR COM 模块通过通用 PDU 路由器的 API 接收大型 I-PDU,用于使用传输协议的上层模块。 有关 AUTOSAR COM 模块 – PDU 路由器接口的详细信息,请参见第 7.8 章(3.7)。 根据 PduR Specification,调用序列是:
[SWS_Com_00838] 如果 Com_TpRxIndication 调用以 E_NOT_OK 值为参数结果,AUTOSAR COM 模块应将接收到的大 I-PDU 的所有信号完全视为无效信号。 也就是说,AUTOSAR COM 模块应为所有包含的信号和信号组执行所有配置的 ComDataInvalidActions。(SRS_Com_02095)
当接收到大型 I-PDU 时,内部 I-PDU 缓冲区会逐渐被覆盖。 因此,除非旧信号没有存储在其他地方(例如在信号组的影子缓冲区中),否则 COM 模块可能会丢失某些场景中可能需要的信号数据信息,例如:
[SWS_Com_00882] 如果 AUTOSAR COM 模块通过大 IPDU 接收信号,并且这些信号配置了在某些情况下需要保留 old value 的功能,则 AUTOSAR COM 模块应以对通过普通 I-PDU 接收的信号相同的方式,正确地为通过大 I-PDU 接收的信号提供 old value。 (SRS_Com_02041)
找到提供旧值的有效方法和从配置中推导出哪些信号或 I-PDU 需要额外处理(例如缓冲)的实现是开放的。这意味着不是必须要实现一个队列。
动态长度信号是长度可以在运行时变化的信号。 动态长度信号的最大长度需要在配置时指定。 动态长度信号必须在动态长度 I-PDU 中传输。
[SWS_Com_00753] 对于动态长度信号,AUTOSAR COM 模块应仅支持 ComSignalType UINT8_DYN。(SRS_Com_02094, SRS_Com_02098)
将类型限制为 UINT8 数组类型也将动态长度信号的放置限制为字节边界。
所有其他信号,可能包括大信号,必须打包在动态长度信号之前(参见 SWS_Com_00754、SWS_Com_00755 和 SWS_Com_00756)。 因此,不需要对I-PDU内的动态长度信号的长度进行编码。 在接收端,动态长度信号的长度可以根据接收到的 I-PDU 的长度来计算。
允许为动态长度信号配置更新位。在这种情况下,更新位必须位于动态长度信号的前面,另请参见SWS_Com_00755。
AUTOSAR COM 模块中没有限制信号组与大或动态长度信号结合使用。
动态长度信号不限于通过哪种传输协议发送。但是,包含动态长度信号的I-PDU的最大长度必须遵守特定总线的限制。
对于应通过 CAN FD 发送的具有动态长度信号的 I-PDU,建议使用 IpduM 的多 PDU 映射功能。 这避免了由于 CAN FD 帧的离散数据长度而对接收长度的误解。 ?是不是说的是CAN FD 帧包括多个PDU,如果不限制每个PDU的映射,不知道每个PDU的范围,就导致无法计算出正确的PDU内部动态长度信号。
对于发送动态长度信号,RTE需要在发送调用时指定实际长度。对应的API是Com_SendDynSignal (SWS_Com_00627)。
[SWS_Com_00757] 在调用 Com_SendDynSignal 时,AUTOSAR COM 模块应将相应的动态长度 I-PDU 的长度设置为包含动态了长度信号的最小长度。 (意思应该是说固定信号长度 + 动态长度信号实际长度)动态信号的长度应等于在 API Com_SendDynSignal 中传递的输入参数“Length”的值。(SRS_Com_02093)
AUTOSAR COM 模块能够通过普通或大型 I-PDU 发送动态长度的 I-PDU。 在任何情况下,它都需要将动态 I-PDU 的长度传递给较低层。
[SWS_Com_00832] 当AUTOSAR COM模块为动态长度I-PDU调用 PduR_ComTransmit 时,应根据包含的动态长度信号的上次更新 (或init值,如果尚未发送) 设置PduInfoType的SduLength。(SRS_Com_02093)(如何根据动态长度信号的更新,设置整个SDU的长度?)
为了接收动态长度信号,需要告知RTE实际大小。
[SWS_Com_00758] 在接收到动态长度I-PDU时,AUTOSAR COM模块应通过以下方式计算包含的动态长度信号的长度:(SRS_Com_02093)
D y n S i g n a l L e n g t h = I P D U L e n g t h − D y n S i g n a l B i t P o s i t i o n 8 DynSignalLength = IPDULength - \frac{DynSignalBitPosition}{8} DynSignalLength=IPDULength−8DynSignalBitPosition
DynSignalLength、I-PDULength 单位都是字节(bytes)。文档中确实是这么写的,我感觉有问题。
Com_ReceiveDynSignal (SWS_Com_00690) 返回动态长度信号的长度,按照 SWS_Com_00758 的定义计算。
由于动态长度信号的长度是从接收到的 I-PDU 长度推导出来的,因此 AUTOSAR COM 模块不支持动态长度 I-PDU 和带有元数据的 I-PDU 的组合,请参阅 SWS_Com_00817。
COM支持从PduR接收并传输到PduR的PDU中的元数据,以及与RTE交换的信号中的元数据。
在传输过程中使用元数据的一种可能性是使用Com_TriggerIPduSendWithMetaData() 触发具有已定义元数据集的I-PDU的传输。
另一个是使用API Com_SendSignalWithMetaData(),Com_SendDynSignalWithMetaData(),Com_SendSignalGroupWithMetaData(),Com_SendSignalGroupArrayWithMetaData () 为下一次传输包含信号的I-PDU提供元数据。接收到的元数据将存储在I-PDU旁边,并且可以使用Com_ReceiveDynSignalWithMetaData() 、Com_ReceiveSignalWithMetaData(),Com_ReceiveSignalGroupWithMetaData () Com_ReceiveSignalGroupArrayWithMetaData 进行访问。
[SWS_Com_00887] 如果为传输的 I-PDU 配置了 MetaData,则 I-PDU 应与 RTE 最后提供的 MetaData 一起传输,或者,如果 RTE 没有提供 MetaData,则使用配置的 ComMetaDataDefault 传输。 Com_TriggerIPduSendWithMetaData() 提供的元数据应仅用于此调用触发的传输。
[SWS_Com_00888] 如果为接收到的 I-PDU 配置了 MetaData,则应存储接收到的 MetaData 以供 RTE 访问。
ISO COM Specification 未定义 COM 和较低层之间的接口。 在 AUTOSAR 中,AUTOSAR COM 模块唯一交互的底层就是 PduR。
AUTOSAR COM模块以两种不同的模式使用PDU路由器,具体取决于I-PDU的类型,它将使用特定于总线的传输协议进行传输或不使用。如果应该通过TP发送I-PDU,则根据配置参数ComIPduType进行配置。(根据该参数配置IPDU)
[SWS_Com_00138] AUTOSAR COM 模块应通过调用 PduR_CommitTransmit 函数来发送 I-PDU。(SRS_Com_02037)
[SWS_Com_00759] 如果 AUTOSAR COM 模块发送出一个 ComIPduType 配置为 NORMAL 的 I-PDU,则 AUTOSAR COM 模块应该被 PduR 使用 Com 的接口调用,这些 Com 接口用于不使用 TP 的模块。 请参见 Table 6 中的列normal I-PDU。 (SRS_Com_02096)
[SWS_Com_00760] 如果 AUTOSAR COM 模块发出一个 I-PDU,其 ComIPduType 配置为 TP,则 AUTOSAR COM 模块应该被 PDU 路由器使用 Com 的接口调用,这些 Com 接口用于使用 TP 的模块。 请参见Table 6 中的 TP I-PDU 列。(SRS_Com_02096)
第 9.1 章(本文 5 时序图)中的交互图显示了 PduR 模块和 AUTOSAR COM 模块之间的交互。这里的 Com 模块用于 normal I-PDU。
Table 6 概述了 ComIPduType 配置值对应的具体 I-PDU 使用的 AUTOSAR COM 模块和 PduR 之间的 API。 API 描述本身在第 7.15 章(本文 3.14)中指定。
为了使信号/信号组的接收方能够识别发送方在发送前是否更新了该信号/信号组中的数据,AUTOSAR COM 模块支持了更新位。
更新位指示发送方的 RTE 是否在包含该信号的 I-PDU 被发送到 PduR 之前更新了信号值。
如果传输模式为 DIRECT 且 ComTxModeNumberOfRepetitions 大于或等于 1,则不允许更新位(参见 SWS_Com_00310)。
通过在发送方和接收方的配置,可以为每个信号单独添加和/或为每个信号组单独添加最多一个更新位。
更新位的位置可通过配置参数 ComUpdateBitPosition (ECUC_Com_00257) 进行配置。 ComUpdateBitPosition 包含在配置容器 ComSignal 中。 因此,确保了信号/信号组和相应的更新位始终是同一 I-PDU 的一部分。
[SWS_Com_00055] AUTOSAR COM 模块应仅在内部处理更新位,而不是作为信号或信号组的一部分。(SRS_Com_02030)
AUTOSAR SWC(软件组件)不能直接看到或访问更新位。
[SWS_Com_00059] AUTOSAR COM 模块应按 Table 7 中的定义解释更新位。(SRS_BSW_00101, SRS_Com_02030)
更新位的初始化由 SWS_Com_00117 定义。
[SWS_Com_00061] 如果 RTE 通过调用 Com_SendSignal 更新信号的值,AUTOSAR COM 模块应设置该信号的更新位。(SRS_Com_02030)
[SWS_Com_00801] 如果 RTE 通过调用 Com_SendSignalGroup 更新信号组,AUTOSAR COM 模块应设置该信号组的更新位。(SRS_Com_02030)
[SWS_Com_00062] 如果一个 I-PDU 的参数 ComTxIPduClearUpdateBit 被配置为 Transmit,则在这个 I-PDU 通过 PduR_ComTransmit 发出并且 PduR_ComTransmit 返回 E_OK 之后,AUTOSAR COM 模块将清除所有包含的信号和信号组的所有更新位。(SRS_Com_02030)
[SWS_Com_00577] 如果将I-PDU的参数ComTxIPduClearUpdateBit配置为 Confirmation 确认,则在通过 PduR_ComTransmit 发送该 I-PDU 返回 E_OK 并成功确认 I-PDU 后,AUTOSAR COM 模块应清除所有包含的信号和信号组的所有更新位。(SRS_Com_02030)
[SWS_Com_00578] 如果 I-PDU 的 ComTxIPduClearUpdateBit 参数配置为 TriggerTransmit,则在 Com_TriggerTransmit 成功请求该 I-PDU 的内容后,AUTOSAR COM 模块应清除所有包含的信号和信号组的所有更新位。(SRS_Com_02030)
[SWS_Com_00324] 如果接收到带有更新位的信号或信号组,则 AUTOSAR COM 模块应仅处理此信号,即过滤器、通知、基于信号的网关、字节交换(如果设置了信号的更新位)。(SRS_Com_02030)
[SWS_Com_00802] 如果接收到带有更新位的信号或信号组并且没有设置更新位,则 AUTOSAR COM 模块应丢弃该信号。(SRS_Com_02030)
如果信号尚未更新,则不会通过信号网关路由信号。 它只会被丢弃。
如果 RTE 读取一个 cleared 更新位的信号,则返回初始值或最后(上次有效)接收到的值。
[SWS_Com_00067] 如果信号附加了更新位,并且设置了更新位的值,则 AUTOSAR COM 模块应将信号/信号组解释为已更新。(SRS_Com_02030)
对于带有更新位的信号的接收期限监视行为,请参见第 7.3.6.1 章(本文 3.2.6.1)。
AUTOSAR COM 模块以 I-PDU 计数器的形式提供数据序列控制机制。 乱序 I-PDU,即重复的 I-PDU 或在丢失 I-PDU 后收到的 I-PDU,将被检测并丢弃。
I-PDU计数器是可选的,可以为每个I-PDU进行配置。有关相应的配置容器,请参见ecoc_com_00592。
[SWS_Com_00687] 对于 ComIPduDirection 配置为 Send 所有配置有 ComIPduCounter 的I-PDU,在Com_Init初始化或Com_IpduGroupStart重新初始化I-PDU之后,AUTOSAR COM模块应将I-PDU计数器设置为0。(SRS_Com_02101)
[SWS_Com_00688] AUTOSAR COM模块应在调用I-PDU Callout 之前,或者,如果未配置,则在I-PDU由PduR_ComTransmit发出之前,使用计数器封装(这里原文 wrap around,google 给出的意思是计数器的值从 0 开始增到最大,然后再次从 0 或者负值最小值继续,循环的增加。)将 I-PDU 的计数器加一。
如果I-PDU标注的返回值为 “false” 或PduR_ComTransmit的返回值不等于E_OK,则应撤销I-PDU计数器的更新 (通过将I-PDU计数器递减一)。
如果 Com_TriggerTransmit 获取包含 I-PDU 计数器的 I-PDU,计数器不会增加。因此,如果将I-PDU计数器与 Com_TriggerTransmit 结合使用,则必须注意。如果在相应的PduR_ComTransmit 之后多次调用 Com_TriggerTransmit,则所有 I-PDU 将包含相同的计数器值。因此,延迟的 TriggerTransmit 可以正常工作,但是纯下层驱动的 TriggerTransmit 用例将无法与 I-PDU 计数器结合使用。(说的应该是重复发送的情况)
[SWS_Com_00587] 对于 ComIPduDirection 配置为 RECEIVE 且配置了 ComIPduCounter 的所有 I-PDU,在 I-PDU 由 Com_Init 初始化或通过 Com_IpduGroupStart 重新初始化后,AUTOSAR COM 模块应接受任何传入的 I-PDU,无论 I-PDU 计数器的值如何。(SRS_Com_02099)
[SWS_Com_00889] 如果 I-PDU 配置了 ComIPduCallout 且 ComIPduDirection 配置为 RECEIVE,则 AUTOSAR COM 模块应始终独立于接收到的数据(例如 I-PDU 计数器值)调用此 I-PDU Callout,并且 Callout 应在接收端的 counter handling (计数器处理)之前执行。
[SWS_Com_00588] 在接收到包含 I-PDU 计数器的 I-PDU 时,AUTOSAR COM 模块应将下一个预期接收的值设置为接收到对应计数器封装的值之后的值。
例子:如果I-PDU计数器具有4位,则其可能的值为0-15。如果接收到具有4位大小计数器的I-PDU,并且接收的计数器值是15,则下一个期望值是0。无论收到的值是否与实际期望值匹配,都需要更新新的期望值。
[SWS_Com_00590] 在接收到包含I-PDU计数器的I-PDU时,AUTOSAR COM 模块按照 SWS_Com_00588 中定义设置下一个期望值,如果没有为此I-PDU配置的I-PDU复制,并且满足以下条件时,COM 会丢弃 I-PDU:
[SWS_Com_00727] 如果检测到预期计数器和接收到的 I-PDU 计数器不匹配,Autosar Com 模块应通过配置的 ComIPduCounterErrorNotification (ECUC_Com_00003) 通知函数通知此不匹配。(SRS_Com_02102)
计数器错误通知独立于配置的 ComIPduCounterThreshold 触发。
I-PDU 计数器错误通知函数的签名在 SWS_Com_00726 中定义。
在Table 8中的示例中,I-PDU计数器为4位宽 (值0 - 15),并且ComIPduCounterThreshold配置为1:
安全相关的 I-PDU 可能需要在多个 L-PDU 中复制,以防止数据污染和丢失。 在 AUTOSAR 中,I-PDU 的复制由 PDU 路由器实现。 复制的 I-PDU 的比较和投票在 AUTOSAR COM 中执行。 由于复制的 I-PDU 没有用于比较的校验和或签名,因此需要在接收方存储和比较完整的 I-PDU。 AUTOSAR COM 允许通过 ComIPduReplicaRef (ECUC_Com_00601) 配置两个额外的冗余的 I-PDU。
可以通过 ComIPduReplicationQuorum (ECUC_Com_00600) 从 1 到 3 配置需要用来验证接收的(needed for a qualified reception)成功同等接收的(successfully equally received) I-PDU 的数量。PduR 模块不支持通过 TP 发送或接收的并且需要多个帧用来传输的 I-PDU 的 1:n 路由。 因此,AUTOSAR COM 堆栈当前不支持大型或动态 I-PDU 或数据类型的冗余。
由于复制本身是由 PduR 完成的,因此发送方 AUTOSAR COM 没有特殊处理。 但是,必须确保复制的 I-PDU 已配置 I-PDU 计数器,请参阅 SWS_Com_00834。 这是必需的,因为接收方的投票依赖于 I-PDU 计数器。
在接收端,AUTOSAR COM 模块对多个复制的 I-PDU 进行投票。 AUTOSAR COM 模块仅将成功确认的 I-PDU 的信号传递给 RTE。 如上所述,复制的 I-PDU 需要配置一个 I-PDU 计数器。 但是,ComIPduCounterThreshold 必须配置为 0,请参见 ECUC_Com_00595。 这里没有给出混合这两个功能的用例,投票会更复杂。(我理解为,如果窗口不为0,投票会更复杂)
[SWS_Com_00596] 只有当 AUTOSAR COM 模块一个复制的 I-PDU 至少接收到 ComIPduReplicationQuorum 个相同副本时,才会将该 I-PDU 的信号和/或信号组提供给 RTE。(SRS_Com_02103, SRS_Com_02105, SRS_Com_02106)
复制的 I-PDU 配置为 AUTOSAR COM 模块配置中的普通 I-PDU。 发送方的 fan-out (google 翻译:可以连接到指定输出的输入数量。fan-out,the number of inputs that can be connected to a specified output.)在 PduR 配置中进行配置。 在接收端,可以在 AUTOSAR COM 模块的配置中另外配置最多两个 PDU-R PDU 副本(参见 ECUC_Com_00601 ComIPduReplicaRef)和成功投票所需的接收到的相同 I-PDU 的数量(参见 ECUC_Com_00600 ComIPduReplicationQuorum)。
[SWS_Com_00597] 当 AUTOSAR COM 模块接收到复制的 I-PDU 的至少 ComIPduReplicationQuorum 个相同副本时,它应该只通知 RTE 一次关于来自该 I-PDU 的信号和/或信号组。(SRS_Com_02103, SRS_Com_02105, SRS_Com_02106)
I-PDU 计数器将按照第 7.10 章(3.9)中的定义为每个复制的 I-PDU 单独处理。(每个复制的 I-PDU,原文 replicated I-PDU,应该是说配置了要进行冗余操作的I-PDU)
由于I-PDU不包含特殊的校验和,因此通过逐个字节来执行完整的I-PDU比较。
对于 I-PDU 复制,ComIPduCounterThreshold 需要配置为 0,请参阅 SWS_Com_00834。 因此,ComIPduReplicaRef + 1 个缓冲区足以存储 I-PDU 以进行成功投票。
由于重用现有功能的方法,也就是说使用 PduR 进行 fan out ,必须注意正确设置系统。 PduR 允许在不同的总线上 fanning out 复制的 I-PDU。 在接收方,这些 I-PDU 以相同的 I-PDU id 指示给 COM。 对于相同的 I-PDU id,Com_RxIndication (SWS_Com_00123) 可能不会被称为可重入的。 防止这种情况的一种简单方法是确保所有 I-PDU 都由同一个接口模块接收,这导致所有副本使用相同的总线。 对于当前的 AUTOSAR 堆栈,这是推荐的方法。 然而,整合者也可以通过其他方式同步接收路径。
此外,由于没有防止上层更新 I-PDU 的机制,这种通信保护方法在解耦传输(即通过 Com_TriggerTransmit 请求的 I-PDU)的组合中不能有效工作。
信号网关是 AUTOSAR COM 模块的一个集成部分。 除循环任务调用外,任何外部模块都无法访问信号网关。
AUTOSAR COM 模块的信号网关适用于信号和信号组。
AUTOSAR COM 模块的信号网关仅支持 ComGwMapping 配置容器 (ECUC_Com_00544) 的静态路由。 只能独立于路由信号和组信号的内容来配置路由。(不太理解独立于路由信号和组信号的内容是什么意思)
可以根据 ComGwDestinationDescription 容器 (ECUC_Com_00549) 或通过 ComGwSignal 参考 (ECUC_Com_00551) 配置信号或组信号的目的地。 传输模式将根据 I-PDU 的其他关联信号的 TMC 进行选择。 如果没有信号有助于 TMS 计算,则将使用传输模式 ComTxModeTrue (SWS_Com_00677)。
[SWS_Com_00377] AUTOSAR COM模块的信号网关根据配置将路由信号/组信号的值复制到进行传输的信号/组信号中,见ECUC_Com_00544(SRS_PduR_06055, SRS_PduR_06089)
ComGwMapping配置允许将信号/组信号从一个源信号/组信号路由到零(无信号网关功能)或多个目的地(1:N)。
AUTOSAR COM 模块的信号网关不支持处理包含在大 I-PDU 中的信号或组信号,请参阅 SWS_Com_00598。
[SWS_Com_00872] 信号网关应在接收端支持以下I-PDU/ signal 处理阶段 (另请参见Figure 5):
[SWS_Com_00873] 信号网关应支持发送方的以下 I-PDU/信号处理阶段(另请参见Figure 5):
[SWS_Com_00357] AUTOSAR COM模块应从接收到的 I-PDU 转发待路由的信号到传输 I-PDU。有关配置,请参阅ECUC\U Com\U 00544配置容器ComGwMapping。
在要路由的信号被转发到发送 I-PDU 之后停止接收 I-PDU 不会阻止之前转发到发送 I-PDU 的发送,除非它也被停止。
[SWS_Com_00360] 如果要路由的接收的信号字节序与相应目的信号字节序不同,COM 模块应将其字节序转换为目的信号的字节序。(SRS_PduR_06061)
[SWS_Com_00361] AUTOSAR COM 模块应转发来自接收到的 I-PDU 的待路由的组信号到传输 I-PDU。 另请参见配置容器 ComGwMapping (ECUC_Com_00544)。(SRS_PduR_06002, SRS_PduR_06056,SRS_PduR_06061)
在待路由的组信号已经转发到发送 I-PDU 之后暂停接收 I-PDU 不会阻止发送 I-PDU 的发送,除非它也被停止。
[SWS_Com_00383] AUTOSAR COM 模块应以一致的方式路由属于同一信号组的所有组信号。 因此,AUTOSAR COM 模块应在路由操作期间将信号组的数据作为一个一致的(子)数据集传输。(SRS_PduR_06056)
[SWS_Com_00735] AUTOSAR COM 模块应支持将源信号组的组信号子集一致地路由到简化(信号数量减少)的目标信号组。(SRS_PduR_06056)
[SWS_Com_00833] AUTOSAR COM 模块应支持将源信号组的单个组信号路由到单个目标信号(不属于信号组的一部分)。(SRS_PduR_06056)
[SWS_Com_00362] 如果接收到的要路由的组信号的字节序与相关目标(组)信号的字节序不同,AUTOSAR COM 模块应将其字节序转换为目标(组)信号的字节序。(SRS_PduR_06061)
[SWS_Com_00701] AUTOSAR COM 模块的信号网关应路由信号和组信号,即使任何配置的接收期限监控超时已过期。(SRS_PduR_06089)
如果没有及时接收到信号或组信号,AUTOSAR COM 模块的信号网关无论如何都会路由这些信号或组信号。(理解为,接收触发了超时监控,但是收到后还会继续转发)
信号组的路由关系仅在组信号上定义。 然而,关于更新位,集成信号网关必须尊重封闭信号组的更新位。 因此,当本章节中引用信号组的更新位时,指的是包含已配置组信号的信号组。
[SWS_Com_00702] 如果接收信号/信号组和目标信号/信号组都配置了更新位 (ComUpdateBitPosition),并且接收信号/信号组设置了更新位,则 AUTOSAR COM 模块应路由设置更新位的信号/信号组,并在目标信号/信号组发送后,清除目标信号/信号组的更新位。(SRS_Com_02030)
[SWS_Com_00703] 如果接收信号/信号组和目的信号/信号组配置了更新位(ComUpdateBitPosition),并且接收信号/信号组的更新位未设置,AUTOSAR COM模块不应路由该信号/信号组 。(SRS_Com_02030)
[SWS_Com_00704] 如果接收到的信号/信号组配置了更新位 (ComUpdateBitPosition),但目标信号没有配置更新位,并且设置了更新位,则 AUTOSAR COM 模块应路由此信号/信号组 without 更新位。(理解为,发送 I-PDU 不需要管更新位,按无更新位的方式处理,但是路由的前提是接收信号组设置了更新位)(SRS_Com_02030)
[SWS_Com_00705] 如果接收到的信号/信号组配置了更新位 (ComUpdateBitPosition),并且更新位未设置,但目标信号没有配置更新位,则 AUTOSAR COM 模块不应路由此信号/信号组。(SRS_Com_02030)
[SWS_Com_00706] 如果接收到的信号/信号组没有配置更新位 (ComUpdateBitPosition),并且目标信号/信号组配置了更新位,当接收到新的信号/信号组时,AUTOSAR COM模块应设置目标信号的更新位,并在发送目标信号/信号组后将其清除。(SRS_Com_02030)
为了让用于 I-PDU 接收的中断程序免于使用无法计算且可能很宝贵的时间,有必要将 AUTOSAR COM 模块的信号网关与中断程序分离(解耦?decouple)。
[SWS_Com_00359] AUTOSAR COM 模块应在函数调用 Com_MainFunctionRouteSignals (SWS_Com_00400) 期间执行其信号网关的所有功能。 在此函数调用期间,AUTOSAR COM 模块的信号网关将检查接收到的路由信号和组信号,并将它们从相关的接收 I-PDU 复制到相关的发送 I-PDU。(SRS_BSW_00425, SRS_BSW_00432)
[SWS_Com_00466] 在 Com_MainFunctionRouteSignals 中,AUTOSAR COM 模块应评估传输属性和传输模式,并按以下顺序执行其路由操作,另请参见 Figure 2:
[SWS_Com_00539] AUTOSAR COM 模块应在调用一次 Com_MainFunctionRouteSignals 时发送一个 I-PDU 最多一次。(SRS_PduR_06055)
文档“General Specification of Basic Software Modules”的第 7.2 节错误处理详细描述了BSW的错误处理。 最重要的是,它构成了一个分类机制,由 BSW 模块中可能出现的五种错误类型组成。
以下部分的各节,分别指明了具体的错误。
[SWS_Com_00803] 使用错误参数调用 API :(SRS_BSW_00337)
[SWS_Com_00804] 如果在使用 Com_Init 初始化 AUTOSAR COM 模块之前或在调用 Com_DeInit 之后调用任何 API 服务(Com_GetStatus、Com_GetVersionInfo、Com_MainFunctionRx、Com_MainFunctionTx 和 Com_MainFunctionRouteSignals 除外),则:(SRS_BSW_00337)
[SWS_Com_00805] 空指针检查:(SRS_BSW_00414)
[SWS_Com_00837] 配置集选择无效:(SRS_BSW_00414)
[SWS_Com_00864] 传输请求被跳过(理解为丢弃?、skipped):(SRS_BSW_00452)
There are no transient faults. 无临时错误
There are no production errors.
There are no extended production errors.
本章对应[17]的交互层功能模型一章(Functional Model of Interaction Layer)。 下图说明了外部接收和外部传输的交互层的行为。 显示了完整的功能,但这取决于具体实现中存在/使用的部分的配置。
[SWS_Com_00396] 可以为接收信号或信号组配置各种处理步骤。 AUTOSAR COM 模块应按以下顺序执行配置的处理步骤:(SRS_Com_02037)
[SWS_Com_00744] 如果为 ComSignal 或 ComSignalGroup 同时配置了 ComRxDataTimeoutAction (接收数据超时动作)和 ComTimeoutNotification(超时通知),则 AUTOSAR COM 模块应首先调用配置的 ComRxDataTimeoutAction(接收数据超时动作),然后调用配置的 ComTimeoutNotification。(超时通知)(SRS_Com_02089)
需要在接收端进行字节序转换和符号扩展,以向 TMS 提供正确的数据格式。
为了在不同的分区(核心)之间提供负载分布,Com-Stack 的不同部分应分配给不同的分区。 因此,在每个网络类型的基础上这样的多核分布应支持,即 Com-Stack 的 FlexRay、CAN 和以太网部分应该可以分配不同的分区(核心)上。
为了支持这种灵活的分配,减少多核通信的数量(因此(可能阻塞)同步),Com 模块中的主线程执行(即各自的 MainFunctions)可以分成不同的 MainFunctions(每个核至少一个MainFunctions)。 这样,接收/传输流保持在单个网络的范围内(因此在单个核内),因此不需要特殊的多核通信和同步原语。 Com 模块中唯一的例外是信号网关需要特别考虑。
为了管理不同的时序要求,每个 MainFunction 都单独定义了它的时基。
[SWS_Com_00885] ComIPdus应在MainFunction中处理,该MainFunction通过ComIPduMainFunctionRef引用 (请参阅ecoc_com_10012)。
[SWS_Com_00886] 如果配置了 CompPreparationNotification,则在开始 I-PDU 处理之前,应在 MainFunctionTx 内调用相应的 Com_CbkTxPrep。