【PduR路由】IPduM模块详细介绍
目录
1.IpduM功能简介
2.IpduM模块依赖的其他模块
2.1RTE (BSW Scheduler)
2.2PDU Router
2.3COM
3.IpduM功能详解
3.1 功能概述
3.2 I-PDU多路复用I-PDU Multiplexing
3.2.1 Definitions and Layout
3.2.2通用功能描述 General
3.2.3模块初始化 Initialization
3.2.4 数据传输Transmission
3.2.5 数据接收Reception
3.2.6 元数据处理Metadata handling
3.3Multiple-PDU-to-Container handling
3.3.1 Dynamic Container Layout
3.3.2Static Container Layout
3.3.3 Transmission
3.3.4Transmission of Dynamic Containers
3.3.5 Transmission of Static Containers
3.3.6 Reception
3.3.7 Reception of Dynamic Containers
3.3.8 Reception of Static Containers
3.3.9 Errorhandling
3.3.10 Metadata handling
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没有元数据或具有相同的元数据类型。
相关文章:
【PduR路由】IPduM模块详细介绍
目录 1.IpduM功能简介 2.IpduM模块依赖的其他模块 2.1RTE (BSW Scheduler) 2.2PDU Router 2.3COM 3.IpduM功能详解 3.1 功能概述 3.2 I-PDU多路复用I-PDU Multiplexing 3.2.1 Definitions and Layout 3.2.2通用功能描述 General 3.2.3模块初始化 Initialization 3.…...
【MySQL】6.MySQL主从复制和读写分离
主从复制 主从复制与读写分离 通常数据库的读/写都在同一个数据库服务器中进行; 但这样在安全性、高可用性和高并发等各个方面无法满足生产环境的实际需求; 因此,通过主从复制的方式同步数据,再通过读写分离提升数据库的并发负载…...
Lucene及概念介绍
Lucene及概念介绍 基础概念倒排索引索引合并分析查询语句的构成 基础概念 Document:我们一次查询或更新的载体,对比于实体类 Field:字段,是key-value格式的数据,对比实体类的字段 Item:一个单词࿰…...
密码算法概论
基本概念 什么是密码学? 简单来说,密码学就是研究编制密码和破译密码的技术科学 例题: 密码学的三个阶段 古代到1949年:具有艺术性的科学1949到1975年:IBM制定了加密标准DES1976至今:1976年开创了公钥密…...
实时数仓之实时数仓架构(Hudi)
目前比较流行的实时数仓架构有两类,其中一类是以FlinkDoris为核心的实时数仓架构方案;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍,这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…...
2022-04-15_for循环等_作业
for循环 编写程序数一下 1到 100 的所有整数中出现多少个数字9计算1/1-1/21/3-1/41/5 …… 1/99 - 1/100 的值,打印出结果求10 个整数中最大值在屏幕上输出9*9乘法口诀表二分查找 编写程序数一下 1到 100 的所有整数中出现多少个数字9 #include <stdio.h>in…...
脑机辅助推导算法
目录 一,背景 二,华容道中道 1,问题 2,告诉脑机如何编码一个正方形格子 3,让脑机汇总信息 4,观察图,得到启发式算法 5,根据启发式算法求出具体解 6,可视化 一&am…...
【原创教程】三菱FX PLC控制FR-E740变频器
变频器的使用 1. 使用三菱FX PLC 控制变频器时,接线图请按下图所示接线。 各个端子的说明如下: R、S、T:变频器电源,E740变频器电源位3相380V。 STF:正转启动, STF信号ON时为正转、OFF时为停止指令。 STR :反转启动,STR信号ON时为反转、OFF时为停止指令。 RH、RM、RL…...
重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案
引言 在软件开发中,有时需要构建具有复杂结构的对象,如果直接使用构造函数或者 setter 方法逐个设置对象的属性,会导致代码变得冗长、难以维护,并且容易出错。为了解决这个问题,我们可以使用建造者模式。 一、建造者…...
C语言数据结构易错知识点(6)(快速排序、归并排序、计数排序)
快速排序属于交换排序,交换排序还有冒泡排序,这个太简单了,这里就不再讲解。 归并排序和快速排序都是采用分治法实现的排序,理解它们对分支思想的感悟会更深。 计数排序属于非比较排序,在数据集中的情况下可以考虑使…...
使用 React Router v6.22 进行导航
使用 React Router v6.22 进行导航 React Router v6.22 是 React 应用程序中最常用的路由库之一,提供了强大的导航功能。本文将介绍如何在 React 应用程序中使用 React Router v6.22 进行导航。 安装 React Router 首先,我们需要安装 React Router v6…...
单链表的插入和删除
一、插入操作 按位序插入(带头结点): ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList;//在第i 个位置插插入元素e (带头结点) bool Li…...
全量知识系统 之“程序”详细设计 之 “絮”---开端“元素周期表”表示的一个“打地鼠”游戏
全量知识系统 之“程序”详细设计 概述-概要和纪要 序 絮(一个极简的开场白--“全量知识系统”自我介绍) 将整个“人生”的三个阶段 比作“幼稚园”三班 : 第一步【想】-- “感性”思维游戏:打地鼠 。学前教育-新生期&#x…...
【详细讲解WebView的使用与后退键处理】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
【Linux多线程】生产者消费者模型
【Linux多线程】生产者消费者模型 目录 【Linux多线程】生产者消费者模型生产者消费者模型为何要使用生产者消费者模型生产者消费者的三种关系生产者消费者模型优点基于BlockingQueue的生产者消费者模型C queue模拟阻塞队列的生产消费模型 伪唤醒情况(多生产多消费的…...
Django屏蔽Server响应头信息
一、背景 最近我们被安全部门的漏洞扫描工具扫出了一个服务端口的漏洞。这个服务本身是一个Django启动的web服务,并且除了登录页面,其它页面或者接口都需要进行登录授权才能进行访问。 漏洞扫描信息和提示修复信息如下: 自然这些漏洞如何修复,…...
前端对数据进行分组和计数处理
js对数组数据的处理,添加属性,合并表格数据。 let data[{id:1,group_id:111},{id:2,group_id:111},{id:3,group_id:111},{id:4,group_id:222},{id:5,group_id:222} ]let tempDatadata; tempDatatempData.reduce((arr,item)>{let findarr.find(i>i…...
synchronized 和 lock
synchronized 和 Lock 都是 Java 中用于实现线程同步的机制,它们都可以保证线程安全。 # synchronized 介绍与使用 synchronized 可用来修饰普通方法、静态方法和代码块,当一个线程访问一个被 synchronized 修饰的方法或者代码块时,会自动获…...
ssh 公私钥(github)
一、生成ssh公私钥 生成自定义名称的SSH公钥和私钥对,需要使用ssh-keygen命令,这是大多数Linux和Unix系统自带的标准工具。下面,简单展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。 步骤 1: 打开终端 首先,打开我…...
LangChain入门:8.打造自动生成广告文案的应用程序
在这篇技术博文中,我们将探讨如何利用LangChain框架的模板管理、变量提取和检查、模型切换以及输出解析等优势,打造一个自动生成广告文案的应用程序。 LangChain框架的优势 在介绍应用程序之前,让我们先了解一下LangChain框架的几个优势: 模板管理: 在大型项目中,文案可…...
AI如何影响装饰器模式与组合模式的选择与应用
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章:设计模式深度解析:AI如何影响…...
【C语言环境】Sublime中运行C语言时MinGW环境的安装
要知道,GCC 官网提供的 GCC 编译器是无法直接安装到 Windows 平台上的,如果我们想在 Windows 平台使用 GCC 编译器,可以安装 GCC 的移植版本。 目前适用于 Windows 平台、受欢迎的 GCC 移植版主要有 2 种,分别为 MinGW 和 Cygwin…...
Ubuntu18.04 下Ublox F9P 实现RTK (利用CORS服务无需自建基站)
本内容参考如下连接:Ubuntu下Ublox F9P利用CORS服务无需自建基站实现RTK-CSDN博客 一、Ublox F9P 硬件模块示意图 图中展示了Ublox F9P的接口,包括串口2(`UART1`和`UART2`),USB1。需要人为通过u-center(Ublox F9P的显示软件)软件设置以下功能: Ublox通过`UART1`向PC端发送…...
springboot+vue在idea上面的使用小结
1.在mac上面删除java的jdk方法: sudo rm -rfjdk的路径 sudo rm -rf /Users/like/Library/Java/JavaVirtualMachines/corretto-17.0.10/Contents/Home 2.查询 Mac的jdk版本和路径: /usr/libexec/java_home -V 3.mac上面查询和关闭idea的网页端口&…...
MyEclipse将项目的开发环境与服务器的JDK 版本保持一致
前言 我们使用MyEclipse开发Java项目开发中,偶尔会遇到因项目开发环境不协调,导致这样那样的问题,在这里以把所有环境调整为JDK1.6 为例。 操作步骤 1.Window-->Preferences-->Java-->Installed JRES 修改为 1.6版本 2.Window-->…...
为BUG编程:函数重载的烦恼 char *匹配bool而不是string
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 这是一个BUG。 运行环境为linu…...
C++第十四弹---模板初阶
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、泛型编程 2、函数模板 2.1、函数模板的概念 2.2、函数模板的格式 2.3、函数模板的原理 2.4、函数模板的实例化 2.5、模板参数的匹配原则 …...
C++--内联函数
当调用一个函数时,程序就会跳转到该函数,函数执行完毕后,程序又返回到原来调用该函数的位置的下一句。 函数的调用也需要花时间,C中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。 内联函数ÿ…...
java数组与集合框架(一) -- 数据结构,数组
数据结构 概述 为什么要讲数据结构? 任何一个有志于从事IT领域的人员来说,数据结构(Data Structure)是一门和计算机硬件与软件都密切相关的学科,它的研究重点是在计算机的程序设计领域中探讨如何在计算机中组织和存储…...
React 应用实现监控可观测性最佳实践
前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX,提供了一种声明式的、组件化的编程模型,以便更高效地构建用户界面。无论是简单还是复杂的界面,React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…...
做机械出口用哪个网站好/新疆今日头条新闻
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000我把git命令都按顺序记录...(sudo可以用sudo su去掉..)安装git:apt-get install git创建目录:mkdir learngit用cd命令进入..创建git仓库&am…...
wordpress 筛选 文章/知名的网络推广
整个项目包含了:开题报告 开题报告PPT 任务书 中期报告 论文模板 答辩PPT等 项目源码 主要安介绍了系统在开发过程中所应用到的一些关键的技术,主要包括了前端小程序开发的MINA框架;后台开发java的框架springboot、模板引擎 thymeleaf…...
wordpress 清空草稿/广告联盟app下载官网
虽然益智游戏多种多样,有考验反应的打地鼠、切水果,有考验观察力的找茬、三消,还有考验逻辑推理的物理解密型游戏,但像蠢蛋秀这样用脑筋急转弯的方式考验玩家的游戏也算是独此一家了,操作很简单,玩起来很有…...
看24小时b站直播/网站推广软件
FLL智能交通任务FLL是学校今年新上的项目,FLL比赛是一个激发孩子解决问题、激发创意的平台。FLL机器人比赛是由机器人全自动的执行的,也就是说,机器人在执行任务时你不要去干扰它。但是大多数的队伍都要在比赛时去中断机器人,这样…...
登录注册网站怎么做/近期国际热点大事件
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/938986/blog/299545...
公司做网站要注意什么/百度后台登录
1. 实践题目 7-3 两个有序序列的中位数 2. 问题描述 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N1)/2⌋个数(A0为第1个数)。 Input 在一行…...