1.IpduM功能简介
IpduM模块在AUTOSAR分层架构中位于PduR模块的旁边。
PDU多路复用意味着使用PDU(协议数据单元)的相同PCI(协议控制信息),其SDU(服务数据单元)的多个唯一布局。选择器字段是多路PDU的SDU的一部分。它用于区分多路PDU之间的内容。
PDU的多路复用是目前已知的来自CAN的方法,但并不局限于此通信系统。
在发送方端,I-PDU多路复用器模块负责将适当的I-PDU从COM组合到新的、多路复用的I-PDU,并将它们发送回PduR模块。在接收端,它负责解释多路I-PDU的内容,并考虑到选择器字段的值,为COM提供适当的分离I-PDU。
2.IpduM模块依赖的其他模块
2.1RTE (BSW Scheduler)
IpduM模块依赖于BSW调度器,分别在IpduMRxTimeBase或IpduMTxTimeBase中配置的时间点调用IpduM_MainFunctionRx和IpduM_MainFunctionTx。
2.2PDU Router
以下总 结了IpduM所需要的来自PDU路由器的功能:
1)指示接收到了包含多路复用的I-PDU
2)输出i-pdu的发送接口
3)发送报文确认
以下列表总结了IpduM模块为PduR模块提供的功能:
1)可进行多路复用的输入I-PDU和待拆卸的输入容器-pdu的指示接口
2)为一个多路复用的i-pdu提供发送接口,它们将被组装成一个容器PDU
3)已传输的I-PDU的确认接口
PduR模块的配置必须使能够表示多路I-PDU的I-PDU路由到IpduM模块的静态或动态部分:
1)I-PDU,它属于多路复用的I-PDU,表示一个多路复用的I-PDU的静态或动态部分
2)I-PDU,它由要进行多路复用的静态和动态部分组成
3)I-PDU,它将被组装成一个容器PDU
4)提供容器来存放要被拆分的多路复用I-PDU
2.3COM
IpduM模块的配置依赖于COM模块的相应配置。对于每个多路复用的I-PDU,静态部分和动态部分的每个布局都需要有不同的I-PDU。
IpduM进一步假定正确的选择器字段值已经包含在表示动态部分的COM的模块I-PDU中。
3.IpduM功能详解
3.1 功能概述
有两种不同的方法可以将多个I-PDU多路复用到一个在总线上传输的结果PDU中:
1)I-PDU Multiplexing。I-PDU多路复用意味着使用从PduR传输到通信硬件抽象层的相同的I-PDU ID,并具有该I-PDU的多个唯一布局。
2)Multiple PDU to Container Mapping。多个PDU到容器的映射意味着将多个i-PDU收集到一个容器PDU中。然后,这个容器PDU通过PduR作为一个(大的)I-PDU传输。这种方式可以利用新总线系统的优势,允许与更小的I-PDU大小(通常是8字节)一起有效地使用带宽。
3.2 I-PDU多路复用I-PDU Multiplexing
3.2.1 Definitions and Layout
一个多路复用的I-PDU由一个静态部分和一个动态部分组成,其中静态部分由零个或多个信号或信号组组成。动态部分由选择器字段和一个或多个信号或信号组组成,请参见图3。I-PDU的动态部分可与C语言的union相比较。根据I-PDU内的选择器字段的值,将选择I-PDU的实际布局。
静态部件和动态部件的位置可根据I-PDU进行配置。静态部分和动态部分可以被细分为不同的部分。对于每个多路复用的I-PDU,只能定义一个选择器字段。选择器字段的值定义了如何解释I-PDU的动态部分的内容。选择器字段具有在1到16个连续位之间的可配置大小,其位置可以通过配置来定义。
pdu的多路复用最初来自于CAN,但它并不局限于这个通信系统。在AUTOSAR体系结构中,位于接口层(通信硬件抽象)上方的PDU路由器分层,因此该特性可以用于所有总线系统,可以由PDU路由器处理,例如FlexRay。
3.2.2通用功能描述 General
静态部分有一个COM I-PDU,一个复用IpduM I-PDU的动态部分的每个布局有一个COM I-PDU,因此IpduM最多组合两个COM的I-PDU。
IpduM模块不应设置选择器字段。选择器字段的字节序通过IpduMByteOrder参数配置。
IpduM模块依赖于COM模块的配置。对于每个动态布局,都需要在COM中配置一个I-PDU。这样的i-pdu已经必须包含正确的选择器字段值。COM中的选择器字段值可以通过配置为信号来初始化,这些信号用init值初始化,但在初始化后不会写入。
应允许优化从IpduM模块到PDU路由器模块的Rx-和Tx-确认路径,直接从IpduM模块调用COM API,而不包括PduR模块。这个功能通过配置IpduMRxDirectComInvocation参数可以实现。
3.2.3模块初始化 Initialization
IpduM_Init函数完成IpduM模块的初始化。
对于通过IpduM模块的I-PDU数据传输路径,在IpduM模块内分配了一个缓冲区。这个缓冲区需要初始化,因为它可能在COM模块完全填充数据之前传输。此缓冲区的初始化数据来自COM模块配置的初始值,如下:
1)IpduM应使用配置的模式IpduMIPduUnusedAreasDefault.初始化其内部传输缓冲区。
2)动态部分的信号的初始值应参考 COM I-PDU (IpduMInitialDynamicPart -> IpduMTxDynamicPart -> IpduMTxDynamicPduRef所应用的PDU的初始值。
3)静态部分的信号的初始值应参考 COM I-PDU (IpduMTxStaticPart -> IpduMTxStaticPduRef所应用的PDU的初始值。
选择器字段包含在初始动态部分的一个段中,因此被隐式地初始化。
为了进行优化,缓冲区可以在配置时计算出初始位模式,然后在运行时进行复制。
3.2.4 数据传输Transmission
在COM内部,静态部分有独立的I-PDU,多路I-PDU的每个动态部分都有一个。
静态部分和动态部分在COM中被视为单独的I-PDU,并且它们有自己的i-pduid。
对于多路I-PDU,IpduM应将对应的两个代表相关静态部分和最后接收到的动态部分的COMI-PDU合并为一个I-PDU,具有一个新的唯一I-PDU ID。IpduM将将这个新的IpduM I-PDU发送到PduR模块。
所有的控制功能,如COMI-pdu的deadline monitoring和 update-bit评估,必须由COM层来完成。
Transmission request
IpduM模块提供了一个IpduM_Transmit功能,使PDU路由器能够启动I-PDU的传输。
功能IpduM_Transmit应使用相关的静态和动态部分组装多路复用的I-PDU。
每个输出的I-PDU都有一个初始值,因此,在静态和动态部件从COM发送到IpduM之前,IpduM模块传输I-PDU,则传输由配置定义的值。
只要没有接收到IpduM I-PDU的传输确认(无论结果如何),函数IpduM_Transmit将返回E_NOT_OK。
如果多路I-PDU仅通过更新动态或静态部分来触发发送,那么如果在两次传输之间进行多次更新,非触发部分可能会被覆盖。
Transmission trigger
IpduM模块通过两个来自PduR模块的两个传输请求来接收多路I-PDU的静态和动态部分。
IpduM模块应可配置为向PduR发送针对新的多路I-PDU的传输请求:
1)接收到I-PDU的静态部分信号
2)接收到I-PDU的动态部分信号
3)接收到I-PDU的静态或者动态部分信号
4)在触发传输时,由于接收到任何此I-PDU(IpduMTxTriggerMode None)而不触发传输。
四种触发条件/模式允许通过COM发送的单个I-PDU的传输模式来控制新组装的I-PDU的传输模式。
并不是所有的四种触发条件/模式都保证了多路复用i - pdu不同实例之间连续传输的最小延迟时间,因为如果传输是由静态和动态部分触发的,或者仅由动态部分触发,COM不会考虑最小延迟时间。COM将静态部分和不同的动态部分视为不相关的独立i - pdu。
如果I-PDU只因为下层的触发传输而被发送出去,则需要配置“因为接收到任何东西而不触发传输”。使用API IpduM_TriggerTransmit,较低的层可以触发I-PDU的发送。
当IpduMTxTriggerMode为None时,下级通过IpduM_TriggerTransmit触发传输协议时,IpduMTxConfirmationPduId需要配置,因为IpduM_TriggerTransmit时,IpduMTxConfirmationPduId也用于解析I-PDU。
Just-In-Time update of parts
有时,IpduM模块可能不只是发送本地存储的部分,因为这些部分可能包含过时的信息,例如更新位。因此,IpduM支持每个部分都有一个可配置的即时更新机制。
如果一个部分的更新触发了多路I-PDU的传输,而第二个部分的IpduMJitUpdate配置为true,则IpduM模块必须先通过PduR_IpduMTriggerTransmit更新第二个部分,然后再通过PduR_IpduMTransmit发送多路I-PDU。
如果通过IpduM_TriggerTransmit请求一个多路复用I-PDU的内容,IpduM模块在返回多路复用I-PDU的内容之前,必须更新所有配置了IpduMJitUpdate的部分。
如果IpduM需要及时更新动态部分,则更新上层发送的最新动态部分,如果之前没有发送动态部分,则更新IpduMInitialDynamicPart引用的动态部分。
如果一个多路I-PDU的更新触发了一个多路I-PDU的传输,而第二个部分的IpduMJitUpdate配置为true,那么如果通过PduR_IpduMTriggerTransmit的jit更新请求返回E_NOT_OK,则该多路I-PDU将不发送。
如果通过IpduM_TriggerTransmit请求多路I-PDU的内容,并且IpduMJitUpdate为任何多路部分配置为true,如果通过PduR_IpduMTriggerTransmit的任何JIT-update re请求返回E_NOT_OK, IpduM_TriggerTransmit将返回E_NOT_OK。
Transmission confirmation
根据PDU Router中i -PDU的配置,PDU Router ac向IpduM模块发送传输确认。
如果IpduM接收到一个特定IpduM I-PDU的TxConfirmation,它应该将这个确认转换为COM I-PDU的相应确认,这些确认包含在最后发出的多路复用IpduM I-PDU中。
根据IpduMTxDynamicConfirmation和IpduMTxStaticConfirmation的配置,对于一个发送请求,IpduM将向COM传递零、一个或两个确认。给上层的确认次数不依赖于IpduMTxTriggerMode。
Examples:
1)如果对应的IpduMTxRequest的IpduMTxDynamicConfirmation和IpduMTxStaticConfirmation都不配置为true,则不生成COM确认。
2)如果IpduMTxStaticConfirmation配置为true,而IpduMTxDynamic确认配置为false(反之亦然),则只生成一个COM确认。
3)如果IpduMTxStaticConfirmation和IpduMTxDynamicConfirmation都配置为true,则会生成两个COM确认;到表示所述静态部分的I-PDU和表示所述动态部分的I-PDU。
如果生成了两个传输确认,它们显然是相等的,因为它们来自同一个I-PDUM传输确认。
3.2.5 数据接收Reception
通信硬件抽象(CAN接口、Lin接口、FlexRay接口)接收到的每个I-PDU都被发送给PDU路由器。PDU Router将多路i -PDU路由到IpduM模块。IpduM模块将多路复用I-PDU的静态部分和动态部分分开路由到它们的目的地。
在配置时,已知传入的I-PDU id对应于配置了静态部分的多路复用I-PDU。I-PDU ID是判断是否存在静态部件所需的全部信息。
由于所有多路复用i - pdu都包含一个动态部分,因此该部分总是必须被路由。
没有处理或通知错误配置的部件的要求。因此,如果接收到的I-PDU包含未在ECU上配置为接收的段,它们将被无声地忽略。此外,如果一个I-PDU配置了PduLength为0,它也将被无声地忽略,因为没有任何有意义的处理可以配置。
这种情况可能发生在网关设置中,如果一个多路复用I-PDU总是被PDU路由器路由到另一个总线上,但在一个动态部分中包含一个必须传递给应用程序的信号。在这种情况下,多路复用PDU也必须路由到IpduM。
3.2.6 元数据处理Metadata handling
仅当“IpduMMetaDataSupport”配置为“true”时,本节要求才适用。
如果IpduMTxTriggerMode配置为与NONE不同的值,IpduM将使用触发部分的MetaData发送多路I-PDU。
如果配置了“IpduMTxTriggerMode”为“NONE”,则IpduM发送多路I-PDU时,将使用上次更新部分的元数据。
在接收端,IpduM应将接收到的元数据连同所有解复用部分一起转发。
3.3Multiple-PDU-to-Container handling
IpduM支持将多个i -PDU映射到一个Container PDU。从PduR的角度来看,包含式pdu和容器式pdu都是普通的pdu。容器布局既可以在包含的i - pdu前使用标头动态定义,也可以不使用标头静态定义,但为包含的i - pdu定义静态位置。
IpduM依赖于PduR被配置为将映射到Container-PDU的发送pdu转发给IpduM,并将接收到的container pdu转发给IpduM。
3.3.1 Dynamic Container Layout
在动态容器PDU中,IpduM应将包含的I-PDU的头置于包含的I-PDU的前面。
对于动态容器PDU,容器PDU中所包含的I-PDU的位置没有配置,因此任意一个包含I-PDU的位置是由负载(DLC)的长度和前面(之前添加的)包含I-PDU的头来决定的。
容器PDU中i -PDU的数量受容器PDU最大大小的限制。
容器PDU中i -PDU的顺序将被保留。通过这种方式,所有受保护的i -PDU都按照它们被放入con tainer PDU中的相同顺序被提取。
IpduM支持动态容器pdu的两种不同的报头大小( IpduMContainerHeaderSize):
. IPDUM_HEADERTYPE_SHORT with 24 bit ID and 8 bit length
. IPDUM_HEADERTYPE_LONG with 32 bit ID and 32 bit length
头大小通过IpduMContainerHeaderSize配置每个Container PDU。因此,它对整个容器PDU都有效。不支持在一个Con‑tainer PDU内混合头部大小。
每个I-PDU报头由ID字段和length字段组成,字节顺序由IpduMHeaderByteOrder决定。
动态容器PDU中所含i -PDU的头和有效载荷的放置应该是连续的,没有任何间隙。
原理:这允许通过考虑报头大小和有效载荷长度(来自报头的DLC)在容器PDU上迭代。
这必须通过容器收集算法的实现来确保,因为包含的i -PDU在容器PDU中没有专用的(配置的)位置。
3.3.2Static Container Layout
当将包含的I-PDU添加到尚未触发的容器PDU中时,如果将IpduMContainedTxPduTrigger设置为IPDUM_TRIGGER_ALWAYS,则容器PDU立即被触发。
当IpduMContainerTxFirstContainedPduTrigger参数设置为TRUE时,IpduM将第一个包含的I-PDU添加到容器PDU中,需要调用PduR_IpduMTransmit。
原理:通过这种方式,对时间触发总线请求传输。
3.3.3 Transmission
当将第一个包含的I-PDU添加到容器PDU中,且容器PDU的IpduMContainerTxSendTimeout或包含的I-PDU的IpduMCon (IpduMCon) tainedTxPduSendTimeout配置为大于零时,IpduM模块将启动容器PDU的传输定时器。定时器初始化为IpduMContainerTxSendTimeout和IpduMContainedTxPduSendTimeout中较小的非零值。
直到容器PDU被取走,或者除非容器PDU的最大大小没有超过,否则可以添加分配给该容器的请求i -PDU。
当一个包含的I-PDU被添加到容器PDU中时,如果包含的I-PDU的超时时间小于容器PDU的剩余时间,则容器PDU的传输计时器将被更新为包含的I-PDU的超时时间(IpduMContainedTxPduSendTimeout)。
当容器PDU的传输定时器结束时,容器PDU将被触发。
当Container PDU被触发时,IpduM将调用PduR_IpduMTransmit。
将容器PDU传递给PduR时,参数 (PduInfoPtr)应包含一个指向已组装的容器PDU (SduDataPtr)的指针,并包含SduLength (SduLength)的总长度。
Queueing
如果一个容器PDU的多个实例必须由IpduM保存,除了当前的数据之外,最多可以存储IpduMContainerQueueSize实例。当前实例是当前包含i -PDU的容器PDU的一个实例。在该实例被排队或复制到下层之后,即在根据IpduMContainerTxTriggerMode的配置调用TriggerTransmit或Transmit API之后,不能再将包含的i - pdu添加到该实例中。
如果PduR_IpduMTransmit已经返回E_NOT_OK,在下一次调用IpduM_MainFunctionTx时,将重复相同的传输请求。与此同时,该Container PDU的实例处于排队状态。
在为该容器PDU的下一个实例调用PduR_IpduMTransmit之前,IpduM应等待传输确认(无论结果如何)。
IpduM模块在这里依赖于为下层的Container PDU配置的传输确认。
如果收到该容器PDU的传输确认,IpduM将在下次调用IpduM_MainFunctionTx时最迟为该容器PDU的下一个旧实例调用PduR_IpduMTransmit。
如果IpduMContainerTxTriggerMode被设置为IPDUM_DIRECT,并且PduR_IpduMTransmit为该容器PDU返回E_OK, IpduM将从队列中删除该实例。
在这种情况下,如果使用CanIf中的队列,Container-PDU的实例可能会丢失,因为较新的实例可能会覆盖之前的实例。这种最后是最好的行为在这种情况下可能不可取。
如果IpduM接收到一个特定的包含PDU的TxConfirmation,它应该将此确认转换为那些包含IpduMContainedTxPduConfirmation设置为TRUE的I-PDU的相应确认,并且包含在容器I-PDU的最后一个发送实例中。如果包含的相同I-PDU出现多次,则会导致多个txconfirmation。
如果创建一个Container PDU的新实例超过了IpduMContainerQueueSize,那么旧的实例将被丢弃。如果没有配置IpduMContain erQueueSize,则丢弃本地实例。在这两种情况下,IPDUM_E_QUEUEOVFL将通过Det_ReportRuntimeError报告给DET。
如果一个容器PDU实例被TriggerTransmit读取,它将从队列中删除。
Triggered Transmission and Last-is-Best semantics
如果IpduMContainerTxTriggerMode设置为IpduM_TriggerTransmit, IpduM将保留并提供缓冲数据,直到调用IpduM_TriggerTransmit来获取数据。
如果IpduMContainerTxTriggerMode设置为IpduM_TriggerTransmit,则IpduM_TriggerTransmit将复制队列中最古老的container PDU实例。如果队列为空或不存在,则复制Container PDU的当前实例。如果容器PDU的当前实例为空/不存在(不存在),则由IpduM_TriggerTransmit返回E_NOT_OK。
对于被包含的I-PDU,如果ipdumcontainedtxducollec tionSemantics设置为IPDUM_COLLECT_LAST_IS_BEST, IpduM在将容器I-PDU传输到下层之前,将使用PduR_IpduMTriggerTransmit从上层获取PDU数据。
虽然将ipdumcontainedtxducollectionsemantics IPDUM_COLLECT_LAST_IS_BEST与IpduMContainerTxTrigger Mode IPDUM_TRIGGERTRANSMIT结合使用似乎很自然,但它也可以与IPDUM_DIRECT结合使用。
一旦一个包含的I-PDU被配置为使用最后是最好的语义,用户就会接受这个包含的I-PDU的所有实例/值不一定在网络上都是可见的。另一方面,队列收集语义保证所包含I-PDU的每个实例/值在线路上都是可见的。
3.3.4Transmission of Dynamic Containers
由于以下要求,IpduM将确保一个包含的I-PDU(相同的PDU-ID)的实例以与它们传递给IpduM的顺序完全相同的顺序传输(传递给容器pdu中的PduR)。
当一个ipdumcontainedtxducolletionsemantics设置为IPDUM_COLLECT_QUEUED的I-PDU通过IpduM_Transmit传递给IpduM时,IpduM将识别相关的容器PDU并将包含的I-PDU附加到其有效负载,即使容器PDU中已经存在包含的I-PDU的先前实例。
通过这种方式,一个Container PDU可以包含同一个I-PDU的多个实例。产生的行为类似fifo,以保持正在传输的I-PDU实例的顺序。因此,接收IpduM的上层可以实现最后是最好的语义或FIFO( last-is-best or FIFO)语义。
如果一个包含的I-PDU已经被添加到尚未触发的容器PDU中,并且如果产生的有效载荷大于IpduMContain erTxSizeThreshold,则容器PDU将被触发。
如果IpduMContainerTxTriggerMode设置为IPDUM_DIRECT,添加一个包含的I-PDU将超过容器I-PDU的最大大小,则首先触发容器PDU。所包含的I-PDU应添加到Container PDU的新实例中。
如果IpduMContainerTxTriggerMode设置为IPDUM_TRIGGERTRANSMIT,添加包含的I-PDU将超过容器PDU的最大大小,则首先将容器PDU排队。然后将包含的I-PDU添加到Container PDU的新实例中。
包含的i - pdu将使用IpduMContainerTxTrigger Mode = IPDUM_TRIGGERTRANSMIT添加到容器pdu,只要它们既没有满也没有排队。
当一个Container PDU被TriggerTransmit触发或提取后,IpduM将计算Container PDU的整体大小。总大小由包含的i - pdu的所有有效负载之和加上相应报头的总长度构成。其结果应为容器PDU的有效载荷大小。
Triggered Transmission and Last-is-Best semantics
如果包含ipdumcontainedtxducollectionsemantics设置为IPDUM_COLLECT_LAST_IS_BEST的i - pdu, IpduM模块会在发送前更新这些i - pdu。如果这些包含的i - pdu具有动态大小,则可能发生容器大小不足以容纳所有包含的i - pdu,如果已过期的i - pdu的总体大小增加。
如果使用IpduMCon tainedtxducollectionsemantics IPDUM_COLLECT_LAST_IS_BEST更新包含的I-PDU,并且container的大小不足以容纳一个包含的I-PDU,那么这个包含的I-PDU和所有后续的I-PDU将被转移到下一个容器实例的开头。
为了保持包含的i - pdu的顺序,即使当前容器中有足够的空间,也需要转移所有后续包含的i - pdu。
当将包含的i - pdu存储到容器pdu中时,IpduM应保留包含的i - pdu传递给IpduM的顺序。也就是说,第一个传递的包含I-PDU被放置在容器的开头,以此类推。如果一个包含ipdumcontainedtxducollectionsemantics设置为IPDUM_COLLECT_LAST_IS_BEST的I-PDU被多次传递,IpduM将只在它第一次出现的位置存储它一次。
如果PduR_IpduMTriggerTransmit为包含的I-PDU返回E_NOT_OK, IpduM将隐去包含的I-PDU。相关的容器PDU无论如何都将传输,而不包含省略的I-PDU。在跳过的I-PDU后面的所有包含I-PDU都将按照包含省略的I-PDU(包括其头部)的大小向上移动。
3.3.5 Transmission of Static Containers
对于静态容器布局的Container PDU,如果IpduMContainerTxTriggerMode设置为IPDUM_DIRECT,则当所有包含的i -PDU被上层更新时,IpduM将触发Container PDU。
由于静态容器可能包含未更新的包含i - pdu,因此在接收端有方法检测包含i - pdu的当前状态。为包含的i - pdu或unsed区域的默认模式配置更新位。
如果所包含的I-PDU配置了Ipdu (PDU)的MUpdateBitPosition,当且仅当所包含的I-PDU被成功更新时,IpduM应确保该I (PDU)的更新位被设置。
如果静态容器配置了IpduM(节点)的UnusedAreasDefault,则IpduM应确保在容器PDU发送之前,容器(节点)的所有未更新区域都被设置为IpduMUnusedAreasDefault值。
这允许IpduM处理静态容器中包含的具有动态长度的i - pdu。但是,如果SWC或发送ip设置了IpduMUnusedAreasDefault-value,则接收ip无法检测到。因此,总是会接收到完整的,最终被填充的包含I-PDU。
必须注意到,一些总线(如CAN-FD和FlexRay)不能传输任意长度的pdu,可能会用自己的默认值将发送的I-PDU填充到下一个可能的长度。因此,IpduM的UnusedAreasDefault值的配置应该与总线特定的填充模式保持一致。
3.3.6 Reception
如果“IpduMContainerPduProcessing”设置为“ IPDUM_PROCES_SING_IMMEDIATE”,则对接收到的容器pdu进行“IpduM_RxIndication”的处理。否则,它将被延迟到下一次对IpduM_MainFunctionRx的调用。所有延期的集装箱pdu应按照接收顺序进行处理。
如果通过调用IpduM_RxIndication,容器PDU被重新接收,包含的i -PDU将被提取。
如果容器PDU的IpduMContainerRxAcceptCon tainedPdu设置为IPDUM_ACCEPT_CONFIGURED, IpduM将只期望并匹配IpduMContainedRxIn ContainerPduRef中引用容器PDU的包含的i -PDU。
每个包含的I-PDU通过PduR_IpduMRxIndication通知PduR。IpduM应按照容器PDU中i -PDU的位置顺序指示所包含的i -PDU。
Queueing
如果收到Container PDU,且“IpduMContainerPduPro PDU处理”设置为“IPDUM_PROCESSING_DEFERRED”,则该Container PDU将进入队列。
如果接收到的容器PDU的新实例超过了IpduMContainerQueueSize,则旧实例将被丢弃,并通过Det_ReportRuntimeError将IPDUM_E_QUEUEOVFL报告给DET。
3.3.7 Reception of Dynamic Containers
对于每个包含的I-PDU,其头部应使用的ID用于标识对应的I-PDU:
. 如果接收到的容器使用长头(IpduMContainerHeaderSize = IPDUM_HEADERTYPE_LONG),则该ID将与IpduMCon (IpduMCon)的长头(IpduMCon)进行比较。
. 如果接收到的容器使用短头(IpduMContainerHeaderSize = IPDUM_HEADERTYPE_SHORT),则该ID将与IpduMContainedRxPduShortHeaderId进行比较。
如果对于容器PDU, IpduMContainerRxAcceptCon tainedPdu设置为IPDUM_ACCEPT_ALL, IpduM将期望并匹配所有受控的i -PDU,而不依赖于IpduMContainedRxInContainerPduRef。
如果提取的包含I-PDU不能根据其ID匹配,它将被默默地丢弃。
对于每个包含的I-PDU,其头应使用中给出的长度为对应的I-PDU的长度。
当处理接收到的容器PDU并检测到包含ID 0的报头时,对该容器PDU的处理应停止,其余字节应被忽略。
原理:头ID为0意味着容器PDU已被填充字节填充,不再包含进一步的数据。
3.3.8 Reception of Static Containers
为了让接收IpduM模块能够确定接收到的静态容器中的哪些PDU已经在发送端被更新,可以为每个包含的I-PDU配置额外的更新信息,即容器PDU中的PDU更新位。
对于接收到的包含I-PDU,如果配置了更新位,则IpduM模块只对其进行处理,并将其指示给上层。
上述需求会导致静默地忽略已配置但未设置更新位的包含i - pdu。
未配置更新位的i - pdu始终被处理并指示给上层。假设它们总是有效的。
3.3.9 Errorhandling
有些总线系统不可能为传输的L-PDU设置任意大小(例如canfd)。容器PDU的有效负载长度可以从包含的报头中得到。因此,与Container PDU实际长度的差值可视为填充。
假设底层总线模块的配置使填充值不构建有效的报头。
当处理接收到的容器PDU并检测到有效载荷长度超过容器剩余字节的报头时,对该容器PDU的处理应停止并忽略剩余字节。另外,IPDUM_E_HEADER需要通过Det_ReportRuntimeError上报给DET。
有效负载长度大于剩余字节的标头(header)无效。在它后面不会再有头(header)了。
如果Container PDU中剩余的字节小于配置的IpduMContainerHeaderSize,剩余的字节将被忽略。
当处理一个IpduMContainerHeaderSize设置为IPDUM_HEADERTYPE_NONE的容器PDU时,IpduM将忽略所有根据其配置不包含或不完全包含在接收到的容器PDU中的PDU。这些包含的i - pdu不能显示给上层。如果配置了开发错误检测,IPDUM_E_CONTAINER将通过Det_ReportError报告给DET。
3.3.10 Metadata handling
如果Container PDU支持元数据,则IpduM在发送Container PDU时应使用从包含的i -PDU中最后收集的元数据。
如果IpduM接收到带有元数据的容器PDU,则IpduM应将容器PDU的元数据连同所有包含支持元数据的I-PDU一起转发。
IpduM不重新排列元数据。因此,它只支持分配给相同容器pdu的包含i - pdu,这些容器pdu没有元数据或具有相同的元数据类型。
编辑:黄飞
评论
查看更多