目录
3.2.3 Endianness Conversion and Sign Extension
3.4 Signal Groups - Complex Data Types
3.4.5 Attributes of a Signal Group
3.4.6 UINT8-array based access to signal groups
3.5.1 Transmission of Large Signals/ I-PDUs
3.5.2 Reception of Large Signals/ I-PDUs
3.6.1 Transmission of Dynamic Length Signals/ I-PDUs
3.6.2 Reception of Dynamic Length Signals/ I-PDUs
3.7 Interface between AUTOSAR COM Module and the PDU Router
3.11.2 Dealing with Signal Groups
3.11.3 Routing of Out-Timed Signals and Signal Groups
3.11.4 Handling of Update-Bits
3.11.5 Decoupling Signal Gateway
前言
信号/消息在AutoSAR通信架构中流经了下列模块,从上至下(发送逻辑)为:SwcAppSender->Rte->Com->PduR->CanIf->CanDrv;从下至上(接收逻辑:CanDrv>CanIf->PduR->Com->Rte->SwcAppReceiver;通过分层,每层可以根据自己的配置信息实现消息的打包和拆包,用户层的业务逻辑不依赖底层总线的硬件特性;缺点就是增加了各层的API调用开销。
1. Com模块功能介绍
COM模块位于RTE和PDU Router模块之间。
COM模块提供信号网关功能,主要的功能如下:
. 为RTE提供信号导向的数据接口
. 将AUTOSAR信号封装到要发送的I-PDU
. 将接收到的I-PDUs解包,并向RTE提供接收到的信号
. 将接收到的I-PDUs信号路由到发送I-PDUs
. 将接收到的I-PDUs信号组路由到发送I-PDUs
. 通讯传输控制(开始/结束 I-PDU组)
. 发送请求控制
. 保证传输I-PDU之间的最小距离
. 接收信号的控制(信号超时控制)
. 输入信号的滤波机制
. 不同的通知机制
. 提供初始值和更新指示
. 字节序转换
. 符号扩展
. 每个I-PDU支持两种不同的传输方式
. 基于信号的网关
. 支持大数据类型和动态数据类型
. 支持I-PDU计数器和I-PDU复制
2.关键概念理解
Confirmation: 通过确认,PDU Router报告AUTOSAR COM模块的请求已经成功完成。这是对COM请求的反应。例如,当PDU已成功传输时,PDU Router就会通过Confirmation报告给Com模块传输PDU成功。
Data Invalid Value: 由AUTOSAR COM模块发送的值,用于指示发送方侧AUTOSAR软件组件无法提供有效值。
Dynamic Length Signal: 可以在运行时动态改变信号数据长度的信号。
Dynamic Length I-PDU: 包含动态长度信号的I-PDU。
Group Signal: 信号组里面包含的信号。
Indication: Indication指的是从PDU Router到COM的异步信息,例如PDU Router通知COM报文的接收。
Init Value: Com module启动之前,I-PDU中的Signal的值。
Large Signal: 一整个I-PDU长度都不能满足的Signal。
Large I-PDU: 一整个L-PDU长度都不能满足的I-PDU。Large I-PDU需要通过TP传输层分帧传输。
Notification: COM模块通知到RTE的信息,例如可用的新数据,错误的发生。
Signal: I-PDU中的具体的每个信号。
Signal Group: 在AUTOSAR中,使用了所谓的复杂数据类型。在复杂数据类型中,有一个或多个数据元素(基本数据类型),就像在C结构中一样。这种复杂数据类型的数据一致性必须得到保证。RTE将复杂的数据类型分解为单个信号,并将其发送给AUTOSAR COM模块。由于这些信号都需要得到一致的处理,所以称之为信号组。
Update-bit: 由AUTOSAR COM模块支持的一种机制,使信号/信号组的接收方能够识别发送方在发送前是否更新了该信号/信号组中的数据。
3.功能详细设计
3.1 Introduction
3.2 General Functionality
3.2.1 AUTOSAR COM basis
COM模块需要可实现以下功能,每个功能可根据需求配置,如果在其他特定模块中已经实现,可通过配置disable该功能:
- 分离I-PDU为具体的Signal/Message的功能。
- 将Signal组合成I-PDU的功能。
- 缓冲队列的功能。
- 0长度信号的处理
- 对事件、任务、标志的通知机制。
- 开始和停止周期报文的功能。
- 间接网络管理的接口。
- 发送信号滤波。
3.2.2 Signal Values
COM模块为每个信号提供初始值、无效值、正常值三种数据。
3.2.3 Endianness Conversion and Sign Extension
COM模块支持boolean, uint8, uint16, uint32, uint64, sint8, sint16, sint32, sint64, uint8[n], float32, float64数据类型。
COM模块应该支持所有支持的有符号和无符号整型数据类型的字节序转换。
AUTOSAR COM模块将非整数数据类型(例如uint8[n]或float32)作为匹配大小的整数数据类型处理,或者在ComSignalEndianness配置为OPAQUE时不解释其内容。
AUTOSAR COM模块应将不透明数据解释为uint8[n],并始终将其映射为n字节大小的信号。
对于不透明的数据字节顺序,转换必须配置为opaque。
AUTOSAR COM模块应将接收的数据扩展到接收信号的ComSignalType的大小(符号扩展)。
AUTOSAR COM模块不支持float32和float64数据类型的符号扩展。
AUTOSAR COM模块在I-PDU发送之前执行字节序转换。
AUTOSAR COM模块在执行信号滤波和接收信号通知之前完成符号扩展和字节序转换。
3.2.4 Filtering
AUTOSAR COM模块只过滤接收端信号。AUTOSAR COM模块应在发送方使用传输模式条件(TMC)的过滤机制,但不应过滤发送方的信号。
AUTOSAR COM模块提供以下的滤波算法:
. ALWARYS
. NEVER
. MASKED_NEW_EQUALS_X
. MASKED_NEW_DIFFERS_X
. MASKED_NEW_DIFFERS_MASKED_OLD
. NEW_IS_OUTSIDE
. ONE_EVERY_N
ComSignalType为FLOAT32, FLOAT64, UINT8_N, UINT8_DYN的信号只支持ALWAYS, NEVER, ONE_EVERY_N的滤波算法。
ComSignalType为BOOLEAN的信号只支持ALWAYS, NEVER, ONE_EVERY_N,MASKED_NEW_EQUALS_X,MASKED_NEW_DIFFERS_X,MASKED_NEW_DIFFERS_MASKED_OLD的滤波算法。
3.2.5 Signal Gateway
AUTOSAR COM模块提供了一个集成的信号网关(Signal Gateway),实现信号和信号组的1:n转发。
路由关系是通过ComGwMapping 容器静态配置的。
信号网关接收到进行路由的信号或信号组后,立即分别作为这些信号或信号组的发送方。如果是集成的信号网关转发一个信号/信号组,或者是软件组件发送一个信号/信号组,则信号处理没有区别。
由于网关关系是静态配置的,因此优化后的信号网关可能会跳过一些具体配置的处理阶段。例如,在某些情况下不需要进行字节序转换。当然,这样的优化不应该在目标总线上导致任何不同的逻辑行为或不同的表示。优化只能用于提高Signal Gate方法的性能。
3.3 Normal Operation
3.3.1 Start-Up Behavior
AUTOSAR COM模块在执行Com_Init (SWS_Com_00432)时初始化每个I-PDU,首先使用ComTxIPduUnusedAreasDefault值进行字节化,然后根据所包含信号的初始值(ComSignalInitValue)和更新位进行位化。
3.3.2 De-Initialization
AUTOSAR COM模块提供了API函数Com_DeInit用于COM层的反初始化。这意味着,在层d反初始化后,没有通过AUTOSAR COM模块的通信是possible和所有启动的I-PDU组停止。
3.3.3 Communication Modes
Transfer Properties and I-PDU Transmission Mode
Signals
AUTOSAR COM模块支持信号的几种传输特性和I-PDU的几种传输模式。
一个信号的发送请求属性(ComTransferProperty )如果为TRIGGERED,且该I-PDU的发送模式(ComTxModeMode)为DIRECT或MIXED,AUTOSAR COM模块应立即(在最近的的下一个主函数中)启动ComTxModeNumberOfRepetitions加上I-PDU的一次传输。
对于使用ComTxModeMode DIRECT或MIXED分配给I-PDU的带有ComTransferProperty TRIGGERED_WITHOUT_REPETITION的信号的任何发送请求,AUTOSAR COM模块将立即(最迟在下一个主要函数中使用)启动分配给IPDU的一次传输。
在发送一个信号时,如果信号的ComTransferProperty 属性为TRIGGERED_ON_CHANGE,且发送模式ComTxModeMode为DIRECT或者MIXED。如果新发送的信号在长度或值上与本地存储的(最后发送或初始化)不同,AUTOSAR COM模块将立即(最迟在下一个主要函数中使用)启动分配给IPDU的一次传输。
在发送一个信号时,如果信号的ComTransferProperty 属性为TRIGGERED_ON_CHANGE_WITHOUT_REPETITION,且发送模式ComTxModeMode为DIRECT或者MIXED。如果新发送的信号在长度或值上与本地存储的(最后发送或初始化)不同,AUTOSAR COM模块将立即(最迟在下一个主要函数中使用)启动分配给IPDU的一次传输。
对于ComBitSize配置为0的信号和组信号,AUTOSAR COM模块不支持TRIGGERED_ON_CHANGE和TRIGGERED_ON_CHANGE_WITHOUT_REPETITION传输属性。
对传输属性TRIGGERED_ON_CHANGE和TRIGGERED_ON_CHANGE_WITHOUT_REPETITION的支持并不局限于某些信号类型。因此,所有可能的信号类型都支持它们。这甚至包括字节数组类型,例如UINT8_N。
AUTOSAR COM模块不应对传输模式(ComTxModeMode)为 NONE的I-PDU发起传输。
发送模式(ComTxModeMode)为NONE的I-PDUs可以通过Com_TriggerTransmit进行发送。
如果I-PDU的传输因任何原因被触发,则发送与I-PDU相关的Pending信号。例如,如果在同一个I-PDU内发送了一个具有ComTransferProperty TRIGGERED的信号,或者I-PDU的发送被调度为cause of ComTxModeMode PERIODIC或MIXED。
I-PDU的总线定时可以通过RTE的发送请求来控制,并结合上述的传输模式和传输特性。另外,PDU路由器,特别是在FlexRay和LIN的情况下,可以通过Com_TriggerTransmit服务来控制它。在后一种情况下,PDU路由器请求从AUTOSAR COM模块发送i -PDU。
可以对任意I-PDU调用Com_TriggerTransmit函数,而不管它的传输模式是什么。这使得LIN和FlexRay可以使用所有可用的传输模式,特别是对于零星通信。NM也使用这种机制来发送用户数据。
Signal Groups
在AUTOSAR COM中,如果I-PDU在信号组或组信号更新的情况下被发送出去,结合传输模式定义,则信号组和组信号也可以有一个传输适当的传输模式。
一个信号组的发送请求属性(ComTransferProperty )如果为TRIGGERED,且该I-PDU的发送模式(ComTxModeMode)为DIRECT或MIXED,AUTOSAR COM模块应立即(在最近的的下一个主函数中)启动ComTxModeNumberOfRepetitions加上I-PDU的一次传输。
在使用ComTxModeMode DIRECT或MIXED分配给I-PDU的信号组的任何发送请求中,AUTOSAR COM模块最迟将在下一个主函数中启动分配的I-PDU的传输任务。
关于使用ComTransferProperty TRIGGERED_ON_CHANGE的信号组,它不包含任何具有自己的ComTransferProperty配置的信号:
在发送信号组的时候,如果信号组的发送模式(ComTxModeMode)配置为DIRECT或者MIXED,且任何一个组信号的值或者长度和上一次的值或者长度不同,则AUTOSAR COM模块在Mainfucntion的下一次调度中立即启用ComTxModeNumberOfRepetitions,同时传输该I-PDU。
Selection of the Transmission Mode for one specific I-PDU
I-PDUs传递信号。由于一个I-PDU可以包含多个信号,下面定义了一种方法,根据包含在一个特定I-PDU中的信号的状态来推导I-PDU的传输模式。
AUTOSAR COM模块允许为每个I-PDU静态配置两种不同的传输模式。I-PDU在特定时间点有效的传输模式,只使用映射到该I-PDU的信号的值来选择。
用于选择两种传输模式中的一种的I-PDU的信号以及用于选择传输模式的条件是静态配置的。
对于传输方式的选择,AUTOSAR COM模块将组信号视为正常信号。
对于TMS的评估,AUTOSAR COM模块应考虑所有(组)信号,其中的配置项包括configured ComFilter容器。
如果一个具有ComIPduDirection配置为SEND的I-PDU的信号包含一个配置容器ComFilter,则该信号可以视为对该I-PDU的TMS的contribute。如果该信号的配置容器没有分配配置容器ComFilter,那么它不会被视为对TMS的contribute。
如果I-PDU内没有信号参与TMS的计算,则AUTOSAR COM模块将该I-PDU的TMS评估为true。
如果AUTOSAR COM模块评估一个contributing signal的TMC为真,那么AUTOSAR COM模块将评估TMS为真。
如果AUTOSAR COM模块评没有一个contributing signal的TMC为true,那么AUTOSAR COM模块将评估TMS为false。
AUTOSAR COM模块应该为每个I-PDU定义一个传输模式选择器。
当包含的信号通过调用Com_SendSignal或Com_SendSignalGroup更新后,AUTOSAR COM模块将重新计算I-PDU的TMS。
对于配置为 MASKED_NEW_DIFFERS_MASKED_OLD的传输模式的计算,AUTOSAR COM模块应仅使用最低有效的ComBitSize位。
对于配置为MASKED_NEW_DIFFERS_X、MASKED_NEW_EQUALS_X、NEW_IS_OUTSIDE或NEW_IS_WITHIN的传输模式计算,AUTOSAR COM模块应使用配置的ComSignalType的所有位。
注意,将ComFilterAlgorithm配置为ALWAYS的信号将始终将各自I-PDU的TMS设置为true。因此,在定义导致经颅磁刺激的信号时必须谨慎。
如果I-PDU的TMS值为true,则AUTOSAR COM模块将使用配置容器ComTxModeTrue 中定义的ComTxModeMode。
如果I-PDU的TMS值为false,则AUTOSAR COM模块将使用配置容器ComTxModeFalse 中定义的ComTxModeMode。
当I-PDU的TMS状态发生变化时,AUTOSAR COM模块应立即使用当前有效的传输模式(最迟在下一个主功能内)。这意味着,首先AUTOSAR COM模块应根据形式的模式更改,然后,AUTOSAR COM模块应执行任何由模式更改引起的对PduR_ComTransmit的调用。
如果TMS的变化导致I-PDU的传输模式发生变化,则AUTOSAR COM模块需要重新启动定时器,以获取传输模式PERIODIC和MIXED的周期时间。
当调用Com_SendSignal或Com_SendSignalGroup结果变化的传输方式开始I-PDU传输模式周期或混合,然后AUTOSAR COM模块应当开始新的传播循环调用PduR_ComTransmit未来在最新的主要功能。无论导致传输模式切换的信号或信号组的传输特性如何,都应启动传输。仍应尊重最小延迟时间。参见图5 AUTOSAR COM模块的接收交互模型。
不考虑ComTxModeTimeOffset。它只在明确的I-PDU传输模式开关中生效,例如Com_IpduGroupStart或Com_SwitchIpduTxMode。
如果TMS的更改导致传输模式DIRECT的更改,则应立即(最迟在下一个主要函数内,除非由于MDT而移位ed)直接传输至底层。
上面的需求说明了如果使用ComTransferProperty PENDING信号触发TMS-switch到ComTxModeMode DIRECT时的行为。
如果I-PDU的ComTxModeMode配置为NONE,则AUTOSAR COM不会发起传输。这可以用来防止传输I-PDU,例如TMS计算为假的情况下。
在一次调用Com_MainFunctionTx中,AUTOSAR COM模块最多发送一次I-PDU。
Signal Flow and Transmission Mode Selection
在RTE对一个特定的信号发出请求后,将信号写入配置定义的适当的I-PDU缓冲区,并根据3.3.3.2章节选择I-PDU的传输模式。
Replication of Signal Transmission Requests
RTE发送请求时,在ComTxModeMode传输模式为 DIRECT或 MIXED中传输请求的重复次数由配置参数ComTxModeNumberOfRepetitions定义。
如果ComRetryFailedTransmitRequests 设置为TRUE,I-PDU的发送模式设置为DIRECT或MIXED,且ComTxModeNumberOfRepetitions设置为0,则这个I-PDU被触发发送数据时,AUTOSAR COM模块仅调用 PduR_ComTransmit函数一次发送I-PDU,且这个发送不用考虑发送Confirmation。
COM模块如果在发送数据的时候又收到RTE新的信号发送请求,且这个新的信号属于同一I-PDU中的信号,AUTOSAR COM模块应该取消未完成的发送任务,并在下一个调度周期处理新的发送请求。
如果底层返回E_NOT_OK,而N-Times传输正在进行,这个错误通知将被忽略,除非ComRetryFailedTransmitRequests设置为true。N-Times传输只计算确认的传输,错误的发送请求可以被安全忽略。
如果在MIXED传输模式循环传输并等待确认后,在混合传输模式下请求n次传输,则循环传输的确认将分配给n次传输。在这种情况下,只有N次请求的新值的N -1次传输被服务。然后,在N-Times请求完成后,传输截止日期监控定时器将最早被重置。在结合混合传输模式和N-Times传输配置传输截止时间监控定时器时,必须考虑到这一点。
如果在传输模式中混合一个n次传输请求与混合传输的循环部分重叠,则循环传输应计算为相应的n次传输任务请求的传输。
如果在N-Times传输完成之前出现了传输截止时间监控超时,则AUTOSAR COM模块将不会对该N-Times传输发起进一步的传输。
最小延迟时间将始终被考虑在内,为了避免启动时的突发,可以为每个I-PDU配置一个时间偏移,两次重复的时间由配置参数“ComTxModeRepetitionPeriod”配置。
Retry Failed Transmission Requests
如果ComRetryFailedTransmitRequests设置为TRUE,则需要计算PduR_ComTransmit的返回值。如果PduR_ComTransmit的返回值不等于E_OK,则AUTOSAR COM模块将在下一次Com_MainFunctionTx中为未发送的I-PDU再次调用PduR_ComTransmit。
AUTOSAR COM模块对传输deadline的监控应独立于可能的重试。后续重试不应影响传输截止日期监测。
如果ComRetryFailedTransmitRequests设置为True,并且I-PDU出现了传输截止时间监控超时,AUTOSAR COM模块将对该I-PDU的任何正在等待的传输请求过期。
循环传输的周期定时器总是从第一次传输尝试开始。
3.3.4 Signal Invalidation
AUTOSAR COM模块为发送方提供了指示其无法为相应信号提供有效值的可能性,例如在传感器故障的情况下。AUTOSAR COM模块允许在配置期间定义ComSignalDataInvalidValue。
Reception of an Invalidated Signal
如果为一个接收信号配置了无效值ComSignalDataInvalidValue且在COM层接收到了这个信号的无效值,并且信号的ComDataInvalidAction配置项被配置为NOTIFY, AUTOSAR COM模块将通过配置的ComInvalidNotification函数通知RTE。在这种情况下,不能进行滤波或正常信号指示等信号处理。接收信号Deadline定时器也会重启。
如果信号组中有一个组信号配置了ComSignalDataInvalidValue 参数,且收到了这个无效值,并且这个信号的ComDataInvalidAction配置项被配置为NOTIFY, AUTOSAR COM模块将通过配置的ComInvalidNotification函数通知RTE。在这种情况下,信号组中的所有信号的正常处理(例如接收Indication)都不会发生。
如果信号组中有一个组信号配置了ComSignalDataInvalidValue 参数,且收到了这个无效值,并且这个信号的ComDataInvalidAction配置项被配置为REPLACE, , AUTOSAR COM模块将将会使用信号组配置的ComSignalInitValue替换所有的组信号,正常的信号组/组信号处理(例如接收Notification)将会在接收到所有组信号的初始值后开始进行。
如果为一个接收信号配置了ComSignalDataInvalidValue参数且接收到了这个无效值,并且它的ComDataInvalidAction配置为NOTIFY, AUTOSAR COM模块将不会将接收到的ComSignalDataInvalidValue存储到信号对象中。下一次调用com_receivessignal将分别返回最后一个有效接收到的信号或ComSignalInitValue(如果还没有接收到信号)。
如果一个信号组中的一个组信号配置了ComSignalDataInvalidValue参数且接收到了这个无效值,且其ComDataInvalidAction配置为NOTIFY,则AUTOSAR COM模块不应将接收到的任何组信号存储到信号对象中。下一次调用com_receivessignal将分别返回最后一个有效接收到的组信号或ComSignalInitValue(如果还没有接收到信号)。
3.3.5 Handling of I-PDUs
I-PDU Group Definitions
以下规则被应用于I-PDU组:
- 一个I-PDU可以属于任意一个I-PDU组
- 如果一个I-PDU属于一个已启动的I-PDU组,或者它不属于任何I-PDU组,并且它被隐式启动,则该I-PDU是active (started)
- 最大的I-PDU组的数目是可配置的,通过ComSupportedIpduGroups参数配置
- I-PUD组可能只包含发送I-PDU或者接收I-PDU
I-PDU组里面的一个I-PDU被激活,整个I-PDU组里面的I-PDU都会被激活。
对于AUTOSAR COM模块,I-PDU组的嵌套纯粹是概念上的,必须通过AUTOSAR COM模块的适当配置和/或使用来解决。
同样,COM模块不知道或处理任何i - pdu分组。任何I-PDU分组必须通过配置或调用模块进行处理。
此外,I-PDU组的完整状态处理不在AUTOSAR COM模块完成,例如在ComM模块中处理。当I-PDU组状态发生变化时,管理I-PDU组状态的模块会通过Com_IpduGroupStart和Com_IpduGroupStop来持续启动或停止I-PDU组。
I-PDU未被分配到任何I-PDU组的状态不能被改变,因此它们是隐式启动的:
如果一个I-PDU没有被分配给任何一个I-PDU组,AUTOSAR COM将在Com_Init中启动这个I-PDU,就像它将由Com_IpduGroupStart启动一样,参数Initialize设置为true。
由于AUTOSAR COM不会隐式地停止这样一个I-PDU,而且它没有被分配给任何I-PDU组,这样一个I-PDU永远不会被停止。
Starting of I-PDU Groups
缺省状态下所有的I-PDU是被stopped,通过调用Com_IpduGroupStart开始一个I-PDU的接收或者发送。
如果一个I-PDU由Com_IpduGroupStart启动,AUTOSAR COM模块将初始化这个I-PDU的以下属性:
- DIRECT或MIXED传输模式下I-PDUs的ComMinimumDelayTime
- 使用非零配置的ComFirstTimeout重新启动所有信号的所有接收截止监控计时器
- 当I-PDU激活后第一次启动传输计时器时,取消所有传输截止监控计时器,并使用ComFirstTimeout(如果配置)作为值
- 所有包含的更新位将被清除
- 使用ONE_EVERY_N的算法(ComFilterAlgorithm)重置 OCCURRENCE类型的过滤器
- 对于ComIPduDirection为SEND的I-PDU,设置I-PDU计数器为0
- 接收ComIPduDirection配置为RECEIVED的I-PDU
如果一个I-PDU是由Com_IpduGroupStart启动的,参数Initialize设置为true,则AUTOSAR COM模块还需要初始化这个I-PDU的以下属性:
- I-PDU中定义的数据
- 包含信号组的shadow buffer
- 将每个信号的过滤机制的old_value赋给ComSignalInitValue
- 周期或混合传输模式下i - pdu的ComTxModeTimePeriod和ComTxModeTimeOffset
如果一个I-PDU是由Com_IpduGroupStart启动的,则AUTOSAR COM模块需要根据其当前的数据内容确定其传输方式。
在某些情况下,I-PDU在所有包含的信号被写入之前由Com_ IpduGroupStart启动。在这种情况下,AUTOSAR COM模块应该使用ComSignalInitValue来表示缺失的信号数据。
当I-PDU启动,并且上层已经通过一个发送api写入了I-PDU中的一个或多个信号时,AUTOSAR COM模块应该使用最近获得的值来确定I-PDU的TMS
如果一个I-PDU是由Com_IpduGroupStart启动的,并且I-PDU中包含了配置了截止时间监控的信号,则AUTOSAR COM模块应该独立于初始化参数的值启动这些信号的截止时间监控。
注意,如果一个I-PDU是由Com_IpduGroupStart启动的,并且参数initialize设置为false,内部缓冲区不会被更改,并且I-PDU包含最后一个设置或初始化值。特别的是,如果I-PDU是第一次启动,并且initialize设置为false, COM会对Com_Init设置的初始值进行操作。
如果I-PDU不属于任何I-PDU组,则在COM初始化时启动。其启动传输方式根据贡献其TMS的信号的ComSignalInitValue来评估。在这种情况下,已经可以在配置时完成计算,因为在COM初始化之前不能写入信号。
Stopping of I-PDU Groups
调用Com_IpduGroupStop将停止I-PDU组(如果它之前已经启动)。
为了使I-PDU不传输,需要停止包含该I-PDU的所有I-PDU组。因此,要实现listen-only模式,需要停止所有包含传输I-PDU的I-PDU组。i - pdu的接收也可能被停止。
通过调用Com_SendSignal, Com_SendSignalGroup或com_invalidatsignal函数,AUTOSAR COM模块将更新其内部缓冲区的值,即使是对于停止的i - pdu。
如果一个写入停止的I-PDU的信号将触发这个I-PDU的传输,如果它没有停止,那么这个触发器不存储。在重新启动相应的I-PDU组后,这样一个旧的触发器不会立即导致I-PDU的传输。
如果一个I-PDU被Com_IpduGroupStop停止,AUTOSAR COM模块将取消该I-PDU的任何未完成传输请求。这包括取消关于ComRetryFailedTransmitRe任务的任何潜在重试。
如果一个I-PDU被Com_IpduGroupStop停止,AUTOSAR COM模块将取消对所有未决确认的截止时间监控。
对于停止的I-PDU, AUTOSAR COM模块应忽略任何发送确认。
AUTOSAR COM模块不能禁止Com_Trigger- Transmit函数的调用。但是,在I-PDU停止的情况下,Com_TriggerTransmit函数返回E_NOT_OK。
如果I-PDU被Com_IpduGroupStop停止,则AUTOSAR COM模块应禁用其接收处理。
如果Com_IpduGroupStop停止了较大的I-PDU, AUTOSAR COM模块应停止接收过程,忽略部分接收到的I-PDU。
如果I-PDU被Com_IpduGroupStop停止,则AUTOSAR COM模块将取消其截止时间监控。
如果I-PDU被Com_IpduGroupStop停止,对于停止的I-PDU中未确认的传输信号/信号组,AUTOSAR COM模块应立即调用配置的ComErrorNotification
如果一个大的I-PDU在传输过程中被停止,则AUTOSAR COM模块应立即停止传输过程。
下图给出了停被止的I-PDU的行为概述:
下图给出了已启动i - pdu的行为概述:
Signal Indication (Unpacking of I-PDUs)
为了同时支持中断驱动和轮询系统,可以在信号指示发生时进行配置。有两种可配置的信号指示模式IMMEDIATE和DEFERRED可通过comipdussignalprocessing配置。
如果将I-PDU的ComIPduSignalProcessing配置为IMMEDIATE,则AUTOSAR COM模块应针对Com_RxIndication或Com_TpRxIndication函数中包含的信号和信号组分别调用配置好的ComNotifications。
如果将I-PDU的ComIPduSignalProcessing配置为DEFERRED,则AUTOSAR COM模块应先将I-PDU的数据分别从PduR的Com_RxIndication函数或相关TP接收函数中复制到COM中。然后,在下一次调用Com_MainFunctionRx时,AUTOSAR COM模块将异步调用所包含信号和信号组的配置的ComNotifications。
如果在DEFERRED模式下,在延迟解包发生之前调用com_receivessignal,则返回之前未更新的值。
当拆包I-PDU时,AUTOSAR COM模块应检查接收到的数据长度(PduInfoPtr->SduLength),并通过ComNotification拆包并只通知完全接收到的信号。
如果接收到的I-PDU小于通过参数ComPduIdRef得到的长度,当且仅当其配置位置小于或等于部分接收到的I-PDU的接收大小时,接收大小为0的信号。
如果接收到小于预期的I-PDU,结果是接收到一个没有其配置的更新位的信号,AUTOSAR COM模块应将此信号视为其更新位被设置,并将该信号解释为已更新。
如果接收到的I-PDU长度小于配置的/预期的I-PDU长度,则接收到的I-PDU长度小于配置的/预期的I-PDU长度需要防止信号部分更新。另一方面,所有com完全接收的信号应该被接收并通知到上层。
拆包I-PDU时,AUTOSAR COM模块应检查接收到的数据长度(PduInfoPtr->SduLength),在只收到部分信号组的情况下,不能拆包或通过ComNotification通知该信号组及包含的所有信号组。
上述要求防止接收到不一致的信号组,从而防止接收到不一致的复杂数据类型。
如果接收到的数据长度大于预期,则AUTOSAR COM模块不会为未配置的信号复制或处理额外的接收数据。
Minimum Delay Timer (MDT)
当I-PDU启动时,重新初始化MDT。因此,可以通过快速停止和启动i - pdu来延迟MDT。
传输截止时间监控定时器的行为不受最小延迟时间监控所引起的任何传输延迟的影响。
如果省略ComMinimumDelayTime或配置为0,则不进行最小延迟时间监控。
如果ComEnableMDTForCyclicTransmission配置为false,则在以下情况下不应(重新)启动最小延迟定时器:
- ComTxModeMode配置为PERIODIC的I-PDUs
- 使用ComTxModeMode MIXED的i - pdu循环部分
- 在ComTxModeNumberOfRepetitions > 0情况下i - pdu重复传输
如果最小延迟计时器当前没有启动,则最小延迟计时器不会过期。因此,优化的实现可能会在ComEnableMDTForCyclicTransmission配置为false的情况下完全忽略对周期性i - pdu的最小延迟时间的监控,因为最小延迟计时器永远不会启动。
如果配置一个I-PDU的ComMinimumDelayTime大于0,并且ComRetryFailedTransmitRequests设置为FALSE,则AUTOSAR COM模块在通过PduR_ComTransmit将该I-PDU传输到PDU路由器时,将加载并启动最小延迟时间计数器。
如果ComMinimumDelayTime I-PDU配置大于0并且ComRetryFailedTransmitRequests被设置为TRUE时,只有PDU Router的PduR_ComTransmit函数返回true后,AUTOSAR COM模块通过PduR_Transmit传输I-PDUs时才加载和启动最小延迟时间计数器。
如果配置一个I-PDU的ComMinimumDelayTime大于0,AUTOSAR COM模块将在成功传输确认时(重新)加载该I-PDU的一个已经运行且未经过的最小延迟时间计数器,使用ComMinimumDelayTime
运行的最小延迟定时器在接收到成功的TX确认该I-PDU时被重新加载,除非在接收到确认时传输已经延迟超过ComMinimumDelayTime。在正常情况下,AUTOSAR COM模块将不会进一步传输该I-PDU,除非加载和启动的最小延迟已经过期。但是也存在一些例外: Com_TriggerTransmit不干扰最小延迟定时器。此外,minimum delay timer在传输截止时间监控定时器到期时复位。同时,启动I-PDU组将重置所包含I-PDU的最小延迟时间定时器。
如果由于传输截止时间监控定时器超时而导致I-PDU的最小延迟定时器被重置,并且存在对该I-PDU的延迟请求,则AUTOSAR COM模块应立即发送该I-PDU。
7.3.6 Deadline Monitoring
在对信号组进行期限监控的上下文中,它被当作一个信号来处理。截止时间监控参数ComFirstTimeout和ComTimeout可以在配置容器ComSignal或ComSignalGroup中定义。
对应的超时通知回调函数可以在配置容器ComSignal或ComSignalGroup中的参数ter ComTimeoutNotification中定义。
如果一个信号或signal组的配置参数ComTimeout被省略或配置为0,AUTOSAR COM模块将不监测这个信号或信号组。它还应该忽略ComFirstTimeout。
Reception Deadline Monitoring
接收Deadline控制这个功能可以通过配置enable或者disable。
当且仅当I-PDU包含在已开启接收截止时间监控的I-PDU组中时,才开启I-PDU接收截止时间监控。否则禁用I-PDU接收截止时间监控功能。
如果为带有更新位的信号配置了接收截止日期监控,则AUTOSAR COM模块应为每个带有更新位的信号/信号组执行单独的接收截止日期监控。
AUTOSAR COM模块应该对信号执行基于I-PDU的接收截止时间监控,而不需要更新位。
对于同一I-PDU内所有没有更新位的信号和信号组,AUTOSAR COM模块应使用相关信号和信号组的最小配置的非零超时参数(COM FirstTimeout, ComTimeout)执行接收截止时间监听。
如果配置了接收截止时间监控的I-PDU内的所有信号都配置了更新位,则不需要对I-PDU基进行接收截止时间监控。
在Rx-timeout的情况下,comerxdatatimeoutaction参数决定AUTOSAR COM模块是用初始值或替代值替换信号/信号组值,还是保持最后接收的值。
如果将comxdatatimeoutaction设置为REPLACE,当信号的接收截止时间的监听计时器到期时,AUTOSAR COM模块将用它的ComSignalInitValue替换信号的值。
如果ComSignalInitValue替换了最后接收到的值,最后接收到的值将被覆盖并丢失。因此,AUTOSAR COM模块会为这个信号返回ComSignalInitValue,直到接收到一个新的值。
如果将comxdatatimeoutaction设置为SUBSTITUTE,当信号的接收截止监控定时器到期时,AUTOSAR COM模块将用它的ComTimeoutSubstitutionValue替换信号的值。
如果信号或者信号组的接收deadline控制定时器到期且配置参数ComRxDataTimeoutAction没有配置(缺省状态)或者配置为NONE,AUTOSAR COM模块不会替换信号或者信号组的值。
如果配置参数ComRxDataTimeoutAction配置为REPLACE,当信号组的接收deadline控制定时器到期的时候,AUTOSAR COM模块将使用ComSignalInitValues值替换组信号值。
如果配置参数ComRxDataTimeoutAction配置为SUBSTITUTE,当信号组的接收deadline控制定时器到期的时候,AUTOSAR COM模块将使用ComTimeoutSubstitutionValue值替换组信号值。
当成功接收到一个配置了接收截止监控的(大)I-PDU时,AUTOSAR COM模块将分别在调用Com_RxIndication或Com_TpRxIndication函数时重置此(大)I-PDU的re接收截止监控定时器。
如果一个信号或信号组的配置参数ComFirstTimeout被省略或配置为0,则AUTOSAR COM模块不应该分别从相应的I-PDU开始监控该信号或信号组的接收,直到第一次接收。
基于I-PDU的接收截止时间监控机制不考虑信号的值。
En-/Disable Reception Deadline Monitoring
当I-PDU的接收截止时间监控被禁用并且定时器过期时,不会给RTE错误指示。禁用接收截止时间监控不会停止I-PDU的接收。
如果Com_EnableReceptionDM使能了I-PDU的接收截止时间监控,则AUTOSAR COM模块需要将包含信号和信号组的接收截止时间监控定时器设置为配置的ComFirstTimeout值。
AUTOSAR COM模块将静默地忽略Com_EnableReceptionDM使能I-PDU接收截止时间监控的设置,如果这个I-PDU已经使能接收截止时间监控。
启用接收截止日期监视意味着使用配置的ComTimeoutNotification将截止日期监视到期的超时通知通知给信号或信号组的RTE。
如果在包含tx -I-PDU的I-PDU组上调用Com_EnableReceptionDM或Com_DisableReceptionDM,则AUTOSAR COM模块将静默忽略此请求。
如果I-PDU的接收截止时间监控已经被禁用,AUTOSAR COM模块将静默地忽略Com_DisableReceptionDM将I-PDU的接收截止时间监控设置为禁用的情况。
Transmission Deadline Monitoring
AUTOSAR COM传输截止时间监控的总体思路是对底层和总线进行监控,而不是对COM模块本身进行监控。因此,传输监控定时器通常在COM模块向下层发送I-PDU时启动。这与传输模式、传输属性或更新位无关。在一般情况下,传输监控定时器没有重新启动或重置,如果它当前正在运行。
AUTOSAR COM模块应独立于信号/信号组所属I-PDU的传输特性和传输方式,对所有信号和信号组进行传输截止时间监控(如配置)。
对于传输截止日期监控, AUTOSAR COM模块不区分ComTransferProperty配置为 PENDING或TRIGGERED信号。
如果对一个I-PDU的相关信号/信号组配置了不同的ComTimeout参数,则AUTOSAR COM模块应使用最小值作为超时参数,用于监控I-PDU的传输截止时间。
对于支持生成传输确认的总线,只应该在AUTOSAR COM模块中配置传输截止日期监控。否则,传输截止日期监视总是会通知一个传输错误。
如果一个信号(组)被发送到较低的层(I-PDU内),AUTOSAR COM应该启动一个配置的传输截止时间监控计时器,除非这个计时器已经在运行。
如果计时器已经在运行,新的发送请求不会重置或重新启动正在运行的计时器,但当前未完成的发送请求将被进一步监视。除非另有规定,否则定时器将启动,而不管导致潜在I-PDU发送请求的触发器是什么。例如,此类触发器是信号的循环发送请求、传输模式切换或通过Com_TriggerIPduSend显式I-PDU发送请求。
如果该I-PDU的传输截止时间监控服务(重新)启动后第一次启动定时器,则使用配置的ComFirstTimeout值启动该定时器,否则使用ComTimeout值启动该定时器。
当AUTOSAR COM收到I-PDU的发送确认时,它将取消所有包含信号和信号组的运行传输截止时间监控计时器。
如果只对传输模式为NONE的I-PDU配置了传输截止时间监控,则AUTOSAR COM模块需要在I-PDU所属的I-PDU组启动时启动该I-PDU的传输截止时间监控定时器。
如果为传输模式为NONE的I-PDU和其他传输模式配置了传输截止时间监控,则当传输模式为NONE时,传输截止时间监控应被禁用。
如果为传输模式为NONE的I-PDU配置了传输截止时间监控,当收到成功的发送确认时,AUTOSAR COM模块将重置该I-PDU的传输截止时间监控定时器。
对于一个信号组,只能对整个信号组配置传输截止时间监听,不能对组信号配置传输截止时间监听。
如果ComIPduCancellationSupport配置为TRUE的I-PDU的传输截止监控定时器到期,AUTOSAR COM模块将为该I-PDU调用PduR_ComCancelTransmit。
PduR_ComCancelTransmit的调用是在Com的正常超时处理之外完成的,如果配置了,则会通知SW-C。AUTOSAR COM忽略PduR_ComCancelTransmit的返回值。
如果传输截止监控定时器超时,将会有一个超时通知,不管原因是什么。例如,如果传输被I-PDU callout过滤掉,甚至会发生通知。
Transmission Deadline Monitoring with N-Times Transmission Mode
如监控定时器中定义的,如果分别为相应的信号或信号组配置了传输截止时间监控,则必须在分别调用Com_SendSignal或Com_SendSignalGroup时启动。
对于DIRECT和MIXED传输模式,应确保所有的ComTxModeNumberOfRepetitions请求都能在配置的时间段内发出。
如果监控计时器过期了,RTE就会通过configured通知机制收到关于该失败的通知。
对于具有ComTxModeMode DIRECT和ComTxModeNumberOfRepetitions > 0的I-PDU,在ComTxModeNumberOfRepetitions加上一个成功接收的发送确认之后,AUTOSAR COM模块将取消任务截止时间监控计时器。
如果在ComTxModeNumberOfRepetitions加上一个confirmations后定时器被取消,则传输成功,然后发送传输确认到RTE。
对于带有ComTxModeMode DIRECT和ComTxModeNumberOfRepetitions > 0的I-PDU, AUTOSAR COM模块将重置一个已经运行的传输截止日期监控定时器,以防该I-PDU的另一个发送请求被发起。
3.4 Signal Groups - Complex Data Types
为了支持复杂数据类型的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
3.4.1 Initialization
通过调用Com_Init, AUTOSAR COM模块将初始化发送端信号组的shadow缓冲区,一个结构良好的SWC在调用Com_ReceiveSignalGroup之前尝试读取组信号。
3.4.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)
3.4.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)
3.4.4 Notifications
下表显示,所有的通知功能仅可为信号组配置,而不是为单个组的信号配置。
3.4.5 Attributes of a Signal Group
3.4.6 UINT8-array based access to signal groups
一个信号组一致性的替代方法是通过COM配置参数ComSignalGroupArrayAccess 启用信号组数组API Com_SendSignalGroupArray和Com_ReceiveSignalGroupArray。复合数据的序列化在COM模块外部完成,但结果是与COM将用于在I-PDU中放置组信号相同的布局。在这种方法中,不使用shadow缓冲区。串行化的数据作为信号组的uint8数组表示直接提供给COM模块。
只有在满足以下前提条件的情况下才能使用基于uint8阵列的信号组接入:
(1)仅对复合数据使用固定大小的数据类型
(2)信号组,它们被映射到与I-PDU对齐的字节
(3)信号组,不被其他信号中断(但可能包含间隙)
如果一个信号组定义了ComSignalGroupArrayAccess,则不应该为该信号组分配shadow缓冲区。
如果一个信号组定义了ComSignalGroupArrayAccess,则该信号组不支持调用以下API:
- Com_SendSignal和com_receivessignal用于该信号组中的任何一组信号
- Com_SendSignalGroup和Com_ReceiveSignalGroup对应的信号组
上面的要求定义了具有数组访问的信号组不支持某些api。也就是说,不能为具有数组访问的信号组调用这些api。如果是非法调用,则该行为是未定义的。
Basic functionality
如果使用AUTOSAR Transformer方法,则序列化和进一步的数据处理已经在数据发送链路中完成。由于数据发送过程已经处理通信数据的uint8-array表示,基于信号组的uint8-array访问允许使用已经序列化的数据,并将其放入I-PDU,而不需要COM再次序列化数据。
AUTOSAR系统模板定义了在基于uint8阵列的方法中处理哪个信号组。如果系统模板开启了基于uint8-array的方式,则Ecu配置参数ComSignalGroupArrayAccess 设置为true。
com通信数据的uint8-array表示的起始位置应该是该信号组中ComBitPosition最小的组信号的字节偏移量。
通信数据的uint8-array表示长度应为该ComSignalGroup中的所有ComGroupSignals在ComIPdu中所占用的字节数。
Initialization
通过调用Com_Init, AUTOSAR COM模块将基于ComSignalInitValue的所有包含ComGroupSignals的ComSignalGroupArrayAccess配置为true的信号组的相应I-PDU缓冲区初始化。
Transmission
当Com_SendSignalGroupArray被调用时,一个指向信号组的uint8数组表示的数据指针被提供。AUTOSAR COM模块根据启动位置将数据复制到I-PDU。
AUTOSAR COM模块处理Com_SendSignalGroupArray的调用时,一下情况下与Com_SendSignalGroup处理方式相同:
- Signal Groups (Transfer Properties and I-PDU Transmission Mode)
- Selection of the Transmission Mode for one specific I-PDU
- Signal Flow and Transmission Mode Selection
由于信号组是由uint8-array表示提供的,所以在分析信号组时,传输模式选择需要考虑这个数据表示。
TMS对Com_SendSignalGroupArray的支持中排除了两个过滤器:NEW_IS_WITHIN, NEW_IS_OUTSIDE
Com_SendSignalGroupArray的调用应支持以下传输模式选择(TMS)滤波器:
• ALWAYS,
• NEVER
• MASKED_NEW_EQUALS_X
• MASKED_NEW_DIFFERS_X
• MASKED_NEW_DIFFERS_MASKED_OLD
• ONE_EVERY_N
Reception
当Com_ReceiveSignalGroupArray被调用时,一个指向信号组的uint8数组表示的数据指针被提供。AUTOSAR COM模块根据起始位置将数据复制到I-PDU的数据指针位置。
3.5 Large Data Types
大信号是指信号太大,以致于无法容纳底层通信协议的单个L-PDU。例如,CAN上的一个大信号将超过8个字节,而对于CAN FD则会超过64个字节。对于FlexRay,情况更加复杂,因为一帧可以包含几个i - pdu。因此,一个信号对于FlexRay来说可能是一个很大的信号,即使它没有超过FlexRay帧的大小。
AUTOSAR中的大信号需要配置一个大的I-PDU,该I-PDU将通过底层总线的传输层协议传输。一个大的I-PDU并不一定要包含一个或多个大信号。使用这个概念,I-PDU长度和信号大小将根据总线特定的传输协议受到限制。UINT8_N是唯一支持大于8字节的静态大小信号的信号类型。
由于AUTOSAR COM模块不知道底层总线属性,如果I-PDU可以在单个L-PDU中传输,例如一个can帧,或者需要通过TP传输,则必须配置它。
AUTOSAR COM模块无法阻止或检测是否太大的i -PDU被发送到特定的总线传输协议,因为AUTOSAR COM模块使用总线独立的PDU路由器接口。然而,AUTOSAR COM模块允许使用底层TPs的N-SDU的最大长度,因此AUTOSAR COM模块不会引入任何额外的长度限制。
3.5.1 Transmission of Large Signals/ I-PDUs
PDU Router模块提供使用传输层的API给上层模块,COM模块使用这类API发送I-PDU:
(1)PduR_ComTransmit:用于发起发送请求
(2)一个或多个Com_CopyTxData回调:用于复制数据
(2)回调Com_TpTxConfirmation:用于确认传输
I-PDU通过调用PduR_ComTransmit 函数开始大I-PDU的传输后,AUTOSAR COM模块不得修改其内部的数据传输缓冲区的I-PDU除非AUTOSAR COM模块通知成功传输或者一个错误表明传输中止。
AUTOSAR COM模块内部的i - pdu是静态配置的。因此,即使对于非常大的I-PDU,也会分配I-PDU的完整内存。采用这种方法是为了降低大型数据类型处理的复杂性。
如果所使用的传输协议还用于诊断或其他服务,则必须支持多个用户。这至少被CAN TP和FlexRay TP所支持。
如果当前传输较大的I-PDU,而再次触发相同的I-PDU进行传输,则AUTOSAR COM将跳过新来的传输请求,并报告运行时错误COM_E_SKIPPED_TRANSMISSION。例如,如果一个大的I-PDU被周期性地发送出去,并且传输在下一个周期被延迟,就可能发生这种情况。
3.5.2 Reception of Large Signals/ I-PDUs
PDU Router模块提供使用传输层的API给上层模块,COM模块使用这类API接收I-PDU:
(1)调用Com_StartOfReception:用于发起RX请求
(2)一个或多个Com_CopyRxData的回调:将接收数据复制到AUTOSAR COM模块的内部接收缓冲区
(3)调用Com_TpRxIndication:指示接收过程的正确或不正确的结束
当调用Com_TpRxIndication时,参数结果的值E_NOT_OK, AUTOSAR COM模块将接收到的大I-PDU的所有信号都当作无效信号处理。也就是说,AUTOSAR COM模块将对所有包含的信号和信号组执行所有配置的ComDataInvalidActions。
3.6 Dynamic Length Signals
动态长度信号是指长度在运行时可以变化的信号。动态长度信号的最大长度需要在配置时指定。动态长度信号必须在动态长度I-PDU中传输。
对于动态长度信号,AUTOSAR COM模块应该只支持ComSignalType UINT8_DYN。将该类型限制为UINT8-array类型也限制了将动态长度信号放置到字节边界。
所有其他信号,可能包括大信号,必须在动态长度信号前打包。因此,不需要在I-PDU内对动态长度信号的长度进行编码。在接收端,动态长度信号的长度可以根据接收到的I-PDU的长度来计算。
允许为动态长度信号配置一个更新位。在这种情况下,更新位必须位于动态长度信号的前面。
在AUTOSAR COM模块中没有任何限制,可以防止信号组与大长度或动态长度的信号组合使用。
动态长度信号不受限于通过传输协议发送。但是,包含动态长度信号的I-PDU的最大长度必须遵守总线特定的限制。
对于需要通过CAN FD发送动态长度信号的i -PDU,建议使用IpduM的多PDU映射特性。这避免了由于CAN FD帧的离散数据长度而导致对接收长度的解释错误。
3.6.1 Transmission of Dynamic Length Signals/ I-PDUs
对于发送动态长度信号,RTE需要在发送时指定实际长度。对应的API是Com_SendDynSignal。
在调用Com_SendDynSignal时,AUTOSAR COM模块将对应的动态长度I-PDU的长度设置为包含动态长度信号的最小长度。动态信号的长度应该等于API Com_SendDynSignal中传入的输入参数“length”的值。
AUTOSAR COM模块能够通过普通或大i - pdu发送动态长度的i - pdu。在任何情况下,都需要将动态I-PDU的长度传递给下层。
当AUTOSAR COM模块调用PduR_ComTransmit来获取动态长度I-PDU时,PduInfoType的SduLength值需要根据所包含的动态长度信号的最后一次更新(如果还没有发送,则为init值)来设置。
3.6.2 Reception of Dynamic Length Signals/ I-PDUs
为了接收动态长度信号,RTE需要被告知实际大小。
在接收到动态长度I-PDU时,AUTOSAR COM模块应计算所包含的动态长度信号的长度,方法如下:
dynamic signal length in bytes = received I-PDU length in bytes - ComBitPosition of dynamic length signal / 8
Com_ReceiveDynSignal函数返回接收到的动态长度信号的长度。
由于动态长度信号的长度来源于I-PDU的接收长度,因此AUTOSAR COM模块不支持动态长度I-PDU和I-PDU与元数据的组合。
3.7 Interface between AUTOSAR COM Module and the PDU Router
AUTOSAR架构下,AUTOSAR COM模块的唯一下层模块就是PDU Router模块。
AUTOSAR COM模块在两种不同的模式下使用PDU Router,取决于I-PDU的类型,PDU Router将使用总线特定的传输层协议或不使用。如果I-PDU应该通过TP发送,则根据配置参数ComIPduType进行配置。
如果AUTOSAR COM模块发送一个ComIPduType配置为NORMAL的I-PDU,则AUTOSAR COM模块应该期望被PDU Router调用,使用不经过传输层的COM接口。
如果AUTOSAR COM模块发送一个ComIPduType配置为TP的I-PDU,则AUTOSAR COM模块应该期望被PDU Router调用,使用经过传输层的COM接口。
3.8 Update-Bits
为了使信号/信号组的接收方能够识别发送方在发送前是否更新了该信号/信号组中的数据,AUTOSAR COM模块支持更新位。
更新位指示发送端RTE是否在包含该信号的I-PDU发送给PDU路由器之前更新了一个信号。
如果ComTxModeNumberOfRepetitions大于或等于1且传输模式为DIRECT,则不允许更新位。
通过发送端和接收端的配置,可以为每个信号和/或为每个信号组分别添加至多一个更新位。
更新位的位置可以通过配置参数ComUpdateBitPosition配置。ComUpdateBitPosition包含在配置容器ComSignal中。因此,保证了信号/信号组和相应的更新位始终是同一个I-PDU的一部分。
AUTOSAR COM模块应该只在内部处理更新位,而不是作为信号或信号组的一部分。更新位对AUTOSAR Software Components不可见,且SWC不能访问更新位。
3.8.1 Sender Side
如果RTE通过调用Com_SendSignal来更新一个信号的值,AUTOSAR COM模块应该设置这个信号的更新位。
如果RTE通过调用Com_SendSignalGroup来更新一个信号组,AUTOSAR COM模块应该设置这个信号组的更新位。
如果I-PDU的ComTxIPduClearUpdateBit参数配置为Transmit,则AUTOSAR COM模块在通过PduR_ComTransmit发出I-PDU, PduR_ComTransmit返回E_OK后,将清除所有包含信号和信号组的更新位。
如果I-PDU的配置参数ComTxIPduClearUpdateBit配置为confirmation, PduR_ComTransmit被调用后返回E_OK且被确认,AUTOSAR COM模块将会清除信号组及其包含信号的所有update-bit。
如果将I-PDU的ComTxIPduClearUpdateBit参数配置为TriggerTransmit,则当Com_TriggerTransmit请求该I-PDU的内容成功后,AUTOSAR COM模块将清除所有包含信号和信号组的更新位。
3.8.2 Receiver Side
如果接收到带有更新位的信号或信号组,如果设置了信号的更新位,则AUTOSAR COM模块只对该信号进行过滤、通知、信号网关、字节交换等处理。
如果接收到带有附加更新位的信号或信号组,且未设置更新位,则AUTOSAR COM模块应丢弃该信号。
如果信号没有被更新,信号将不会通过信号门的方式路由。它只会被丢弃。
如果RTE读取一个具有相关的已清除的更新位的信号,则返回初始化值或最后接收到的值。
如果信号附加了更新位,并且更新位被置位,则AUTOSAR COM模块应将信号/信号组解释为已更新。
3.9 Data Sequence Control
AUTOSAR COM模块以I-PDU Counters的形式提供数据序列控制机制。如果i - pdu是重复的i - pdu,或者i - pdu丢失后收到的i - pdu,将被检测丢弃。I-PDU Counters是可配置的。
3.9.1 Sender Side
对于ComIPduDirection配置为SEND且配置了comipduounter的所有I-PDU,在Com_Init初始化或Com_IpduGroupStart重新初始化I-PDU后,AUTOSAR COM模块将I-PDU计数器设置为0。
AUTOSAR COM模块应在I-PDU被PduR_ComTransmit发送之前,直接将I-PDU的I-PDU计数器相对于环绕计数器增加1。如果PduR_ComTransmit的返回值不等于E_OK,则I-PDU计数器的更新将被撤销(通过将I-PDU计数器减1 )。
如果Com_TriggerTransmit获取一个包含I-PDU计数器的I-PDU,则不发生Counter计数。因此,如果使用Com_TriggerTransmit在combination上使用I-PDU计数器,必须小心。如果在对应的PduR_ComTransmit之后多次调用Com_TriggerTransmit,所有i - pdu将包含相同的计数器值。因此,延迟的TriggerTransmit传输可以工作,但是纯底层驱动的TriggerTransmit用例不能与I-PDU计数器结合使用。
3.9.2 Receiver Side
对于所有ComIPduDirection配置为RECEIVE且配置了ComIPduCounter的I-PDU,在Com_Init初始化或Com_IpduGroupStart重新初始化I-PDU后,AUTOSAR COM模块将接受任何传入的I-PDU,无论I-PDU计数器的值如何。
在接收到包含I-PDU计数器的I-PDU时,AUTOSAR COM模块应将下一个期望值设置为接收到的计数器环绕值之后的值。
例如,如果I-PDU计数器为4位,则可能的值为0 ~ 15。如果接收到一个4位计数器的I-PDU,并且接收到的计数器值是15,那么下一个期望值是0。无论接收到的值是否与实际的期望值匹配,都需要更新新的期望值。
在接收到包含I-PDU计数器的I-PDU时,如果没有为该I-PDU配置I-PDU复制,则AUTOSAR COM模块在设置下一个期望值后,将丢弃该I-PDU,并且:
received I-PDU counter < expected I-PDU counter
Or
received I-PDU counter > expected I-PDU counter
如果检测到预期的和接收到的I-PDU计数器不匹配,AUTOSAR COM模块将通过配置的ComIPduCounterErrorNotification通知函数来通知此不匹配。
计数器错误通知与配置的ComIPduCounterThreshold无关。
示例:在下表的示例中,I-PDU计数器的宽度为4位(值为0 ~ 15),ComIPduCounterThreshold配置为1:
3.10 Communication Protection
与安全相关的i - pdu可能需要在多个l - pdu中复制,以防止泄漏损坏和数据丢失。在AUTOSAR中,i -PDU的复制是通过PDU路由器实现的。在AUTOSAR COM中对复制i - pdu进行比较和表决。由于复制的i - pdu没有用于比较的校验和或签名,因此需要在接收端存储和比较完整的i - pdu。AUTOSAR COM允许通过ComIPduReplicaRef配置两个额外的复制i - pdu。
通过ComIPduReplicationQuorum可以从1到3配置一个合格接收所需的成功接收i - pdu的数量。PDU Router模块不支持i -PDU的1:n路由,因为i -PDU是通过TP模块发送或接收的,需要发送多个帧。因此,AUTOSAR COM堆栈目前不支持大型或动态i - pdu或数据类型的复制。
3.10.1 Sender Side
由于复制本身是由PduR完成的,所以在发送端没有针对AUTOSAR COM的特殊处理。但必须确保复制的I-PDU配置了I-PDU计数器。这是必需的,因为接收端的判断依赖于I-PDU计数器。
3.10.2 Receiver Side
在接收端,AUTOSAR COM模块对多个复制i - pdu进行Voting。AUTOSAR COM模块只将确认成功的i - pdu信号传递给RTE。如上所述,复制的I-PDU需要配置一个I-PDU计数器。但是,ComIPduCounterThreshold必须配置为0。没有混合这两个features的用例,一旦混合则Voting将更加复杂。
只有当AUTOSAR COM模块收到至少ComIPduReplicationQuorum相同复制I-PDU的副本时,它才应该从这个I-PDU中提供信号和/或信号组给RTE。
在AUTOSAR COM module的配置中,复制的I-PDU被配置为一个正常的I-PDU。发送端fan-out在PduR configu配给中配置。在接收端,可以在AUTOSAR COM模块的配置中配置多达两个PDU-R pdu副本和成功投票所需的相同接收i - pdu数量。
当AUTOSAR COM模块收到至少ComIPduReplicationQuorum相同复制I-PDU的副本时,它应仅就该I-PDU的信号和/或信号组通知RTE一次。
由于I-PDU不包含特殊的校验和,所以比较是通过逐个字节比较完整的I-PDU来执行的。
对于I-PDU复制,ComIPduCounterThreshold需要配置为0。因此,ComIPduReplicaRef + 1缓冲区足以存储成功投票的i - pdu。
7.10.3 Constraints
PduR允许在不同的总线上fan out输出复制的i - pdu。在接收端,这些I-PDU被指示给具有相同I-PDU id的COM。但是,对于相同的I-PDU id, Com_RxIndication可能不会被称为可重入。防止这种情况发生的一个简单方法是确保所有i - pdu都被相同的Interface module接收,这将导致对所有副本使用相同的总线。对于当前的AUTOSAR堆栈,这是推荐的方法。但是,系统集成商也可以通过其他方式同步接收路径。
此外,由于没有机制来阻止上层对I-PDU的更新,这种通信保护方法在解耦传输(即通过Com_TriggerTransmit请求I-PDU)的组合中不起作用。
3.11 Signal Gateway
该信号网关是AUTOSAR COM模块的集成部分。除了循环任务调用外,任何外部模块都不能访问信号网关。
AUTOSAR COM模块的信号网关与(组)信号和信号组一起工作。
AUTOSAR COM模块的信号网关仅支持ComGwMapping配置容器的静态路由。只能独立于路由信号和信号组的内容来配置路由。
信号或信号组的目的地可以配置为每个ComGwDestinationDescription容器或通过ComGwSignal引用。传输模式将根据I-PDU中其他相关信号的tmc来选择。如果没有信号有助于TMS计算,将使用传输模式ComTxModeTrue。
AUTOSAR COM模块的信号网关应根据配置将要路由的信号/信号组的值复制到传输的信号/信号组。
ComGwMapping配置允许将一个信号/信号组从一个源信号/信号组路由到零(没有信号网关功能)或多个目的地(1:n)。
AUTOSAR COM模块的信号网关不支持处理包含在大型I-PDU中的信号或信号组。
信号网关应在接收端支持下列I-PDU信号处理:
(1)复位接收截止时间监控定时器
(2)I-PDU回调处理
(3)检查更新位
(4)大小端处理和符号扩展
信号网关应在发送端支持下列I-PDU信号处理:
(1)设置更新位
(2)大小端处理和符号扩展
(3)I-PDU传输模式选择
(4)I-PDU回调
3.11.1 Dealing with Signals
AUTOSAR COM模块需要从接收到的i - pdu转发需要路由的信号来发送i - pdu。通过配置配置容器ComGwMappin来实现。
当需要路由的信号被转发到发送I-PDU后,停止接收I-PDU并不会阻止发送I-PDU的传输,除非发送I-PDU也被停止。
如果接收到的待路由信号的字节序与相关目的信号的字节序不一致,则AUTOSAR COM模块应将其字节序转换为目的信号的字节序。
3.11.2 Dealing with Signal Groups
AUTOSAR COM模块需要从接收到的i - pdu转发待路由信号组来发送i - pdu。参见配置容器ComGwMapping.
当要路由的信号组已经转发到发送I-PDU后,停止接收I-PDU并不会阻止发送I-PDU的传输,除非发送I-PDU也被停止。
AUTOSAR COM模块应以一致的方式路由信号组。因此,在进行路由操作时,AUTOSAR COM模块将一个信号组的数据作为一个一致的数据集进行传输。
AUTOSAR COM模块应支持将一个源信号组中的组信号子集路由为一个缩减后的目标信号组。
AUTOSAR COM模块应支持将源信号组中的单个组信号路由到单个目标信号(不属于信号组)。
如果接收到要路由的组信号的字节序与相关的目的(组)信号的字节序不一致,则AUTOSAR COM模块应将其字节序转换为目的(组)信号的字节序。
3.11.3 Routing of Out-Timed Signals and Signal Groups
AUTOSAR COM模块的信号网关应该路由信号和信号组,即使任何配置的接收截止时间监控超时。
如果没有及时收到信号或信号组,AUTOSAR COM模块的信号网关将路由这些信号或信号组无论如何。
3.11.4 Handling of Update-Bits
如果两者都有,接收信号/信号组和目的地信号/信号组配置了一个更新位(ComUpdateBitPosition),并设置了接收信号/信号组的更新位,AUTOSAR COM模块对设置的更新位的信号/信号组进行路由,并在发送后清除目标信号/信号组的更新位。
如果接收到的信号/信号组和目的信号/信号组配置了一个更新位(ComUpdateBitPosition),且未设置接收到的信号/信号组的更新位,则AUTOSAR COM模块不应路由该信号/信号组。
如果接收到的信号/信号组配置了一个更新位(ComUpdateBitPosition),但目的地信号没有更新位configure,并且设置了更新位,AUTOSAR COM模块将在没有更新位的情况下路由该信号/信号组。
如果接收到的信号/信号组配置了一个更新位(ComUpdateBitPosition),但是目的地信号没有更新位con被计算出来,并且更新位没有设置,AUTOSAR COM模块将不路由这个信号/信号组。
如果接收到的信号/信号组没有update-bit (ComUpdateBitPosition)配置和目标信号/信号组update-bit配置,AUTOSAR COM模块应当设置目的地的update-bit信号当一个新的信号/信号组收到后和清晰的目标信号的发送/信号组。
3.11.5 Decoupling Signal Gateway
为了保护用于I-PDU接收的中断程序不受不可计算的时间占用的影响,有必要将AUTOSAR COM模块的信号网关与中断程序解耦。
AUTOSAR COM模块在调用com_mainfunctionroutessignals函数时,执行其信号网关的所有函数。在此函数调用过程中,AUTOSAR COM模块的信号网关检查接收和待路由的信号和信号组,并将其从相关的接收i - pdu转发到相关的发送i - pdu。
在com_mainfunctionroutessignals中,AUTOSAR COM模块将评估传输属性和传输模式,并按照以下顺序执行其路由操作:
1. copy all gated signals from the source to the target I-PDUs
2. evaluate the TMC of all gated signals
3. evaluate the TMS for the target I-PDUs
在这种情况下,目标I-PDU包含新接收的具有ComTransferProperty TRIGGERED的门控信号,发送可以在Com_MainFunctionTx或com_mainfunctionroutessignals中执行。
在一次调用com_mainfunctionroutessignals时,AUTOSAR COM模块最多发送一次I-PDU。
4.关键API函数
Com_Init: 该服务初始化AUTOSAR COM模块层的内部和外部接口和变量,以进行进一步处理。调用Com_init后,ECU内部的通信还是disable的。
Com_DeInit: 停止ECU内部的通信,所有started的I-PDU组都置为stopped。
Com_IpduGroupStart: 启动一个I-PDU组,根据配置执行是否初始化信号组中的信号。
Com_IpduGroupStop: 停止一个I-PDU组。
Com_EnableReceptionDM: Enable I-PDU组中的一个I-PDU截至时间监控定时器。
Com_DisableReceptionDM: Disable I-PDU组中的一个I-PDU截至时间监控定时器。
Com_SendSignal: 将RTE的信号值更新到COM。
Com_ReceiveSignal: 将COM的信号值更新高RTE。
Com_SendSignalGroup: 将shadow buffer的值更新到对应的I-PDU。
Com_ReceiveSignalGroup: 将I-PDU的值更新高对应的Shadow buffer。
Com_TriggerIPDUSend: 通过调用Com_TriggerIPDUSend,对应I-PDU被传输一次,用于事件帧的处理。
Com_MainFunctionRx: 周期调度函数,RX回调函数直接处理不了的信息都由它来处理。
Com_MainFunctionTx: 周期调度函数,TX 回调函数直接处理不了的信息都由它来处理。
Com_IpduGroupControl: 控制IPDU Group中所有报文的的开启和停止发送。由BswM来调用。
5.COM模块与上下层模块的交互
5.1COM模块与PDUR模块之间的接口
以CAN信号的收发为例,COM模块调用PduR_ComTransmit接口函数通过PduR发送IPDU数据,PduR模块完成数据的发送后调用COM模块的Com_TxConfirmation回调函数通知到COM模块完成数据的发送;底层收发CAN数据后一路回调上传模块的接收回调函数,在PduR模块调用COM模块的Com_RxIndication回调函数通知COM模块接收到了CAN IPDU数据且将数据传递到COM层。
5.2 COM模块和RTE模块之间的数据确认处理
数据接收:
PduR模块接收到数据后调用COM模块的Com_RxIndication函数通知到COM模块,且将IDPU数据也传递到COM模块。COM模块接收到数据通知后根据配置有两种方式将数据IPDU中包含的Signals数据更新到RTE:
Immediate: Com接收到IPDU通知后立即调用Rtex_COMCbk_signalxxx将IPDU中包含的Signal(x, y)更新到RTE(缓存区)。
Deferred: Com模块接收到IPDU后内部设置标志(Flag)延迟处理,在Com模块的周期调度函数Com_MainFunctionRx中轮询标志(Flag),如果设置了标志则调用Rtex_COMCbk_signalxxx将IPDU中包含的Signal(x, y)更新到RTE(缓存区)。
数据发送:和数据接收过程类似,主要注意COM模块有Immediate和Deferred两种数据发送确认的处理机制。
6.COM模块的配置
6.1 COM
COM模块的配置,包括ComConfig,ComGeneral两个顶层 container.
ComConfig: 包含各个子container。
ComGeneral: 包含COM模块的通过配置参数。
6.2 ComGeneral
一些重要的配置参数:
ComSupportedIPduGroups: 支持的最大的IPDU组数量,有多少路LIN,CAN,ETH等他们的总和就是这个参数的配置值。
ComEnableSignalGroupArrayApi: 配置是否使用信号组数字访问API,一般项目中不使用这个API。
ComRetryFailedTransmitRequests: 配置是否发送IPDU失败后重新请求发送。
6.3 ComConfig
ComConfig配置容器中包含,ComIPduGroups,ComIPdus,ComSignalGroups,ComSignals四个配置子容器容器。
6.3.1 ComIPduGroups
COM模块有多少路的通信通道(Channel,包括ETH,CAN,LIN,Flexray等)ComIPduGroup里面就有多少个配置数,配置完后某个通道的索引值就是该通道的标识,具体每一个Channel里面无配置项。
6.3.2 ComIPdus
配置所有通信通道(LIN,CAN,ETH,Flexray)的所有IPDU的配置项。比较重要的配置有:
ComIPduDirection: RECEIVE 还是 SEND,是发送的IPDU还是接收的IPDU。
ComIPduSignalProcessing: IMMEDIATE还是DEFERRED,接收或者发送该IPDU时立即处理还是延迟处理(周期调度函数中统一处理)。
ComIPduType: TP还是NORMAL,该PDU是否要经过传输层处理(一般诊断报文会经过TP)。
ComIPduGroupRef: 该IPDU隶属的IPduGroup。
ComIPduSignalRef: 该IPDU包含的所有Signals。
6.3.3 ComSignal
配置所有通信通道(LIN,CAN,ETH,Flexray)的所有IPDU的的所有Signal的配置项。比较重要的配置有:
ComBitPosition: 该信号在IPDU中其实Bit位置。
ComBitSize: 该信号所占的Bit长度。
ComSignalEndianness: 该信号的字节序。
ComSignalType: 信号类型,BOOLEAN, UINT8等。
6.3.4 ComSignalGroup
此参数定义在接收到无效信号后执行的操作。当所包含的信号中有一个是无效信号时,与信号组相关的动作。
如果使用Replace,将使用ComSignalInitValue进行替换。
具体的配置项和ComSignal中的配置项差不多。