【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没有元数据或具有相同的元数据类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/293238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【b站李炎恢】Vue.js Element UI 下 | 十天技能课堂 | 更新中... | 李炎恢

课程地址:【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注:虽然标题声明还在更新中,但是看一些常用…

python统计分析——双样本均值比较

参考资料:python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时,有两种情况必须区分开。在第一种情况中,同一对象在不同时候的两个记录值进行相互比较。例如,用学生们进入初中时的身高和他们一年后的身高&…

Python - 深度学习系列31 - ollama的搭建与使用

说明 做这个的主要目的是为了搭建Langchain的本地环境,使用LangChain让LLM具备调用自定义函数的功能。 内容 1 安装server 以下将ollama的安装方式,以及使用做一个简单的说明(记录)。之前对这个工具没有了解,只是从快速实践的…

LoRa物联网行业解决方案 1

1 行业应用 智慧停车 智能抄表 智慧牧场 智能生产 智能物流 智能健康 2 物联网智慧农场项目需求 3 为什么选lora? 4 设计 5 模块性能参数 sx1278 lora扩频无线模块 SEMTECH公司SX1278芯片 LoRa 扩频技术 通信距离10000米 SPI通信接口 mcu选型 硬件平台介绍 …

速通汇编(三)寄存器及汇编mul、div指令

一,寄存器及标志 AH&ALAX(accumulator):累加寄存器BH&BLBX(base):基址寄存器CH&CLCX(count):计数寄存器DH&DLDX(data):数据寄存器SP(Stack Pointer):堆栈指针寄存器BP(Base Pointer)&#…

【IC前端虚拟项目】mvu顶层集成的原则与技巧

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 截止目前,所有的子模块编码均宣告完成,接下来就是封装顶层的时刻了。我自己规划和集成顶层一般有一个习惯,就是在top层下面封装core层和其他模块,比如mvu的top层下例化了mvu_reg和mvu_core两个模块,…

​数据结构—栈操作经典案例

括号匹配&#xff1a; 这是我最开始写的&#xff0c;运行有问题 对于输入的括号序列&#xff0c;建议使用标准的 C 字符串而不是字符数组。 #include<iostream> using namespace std;typedef char SelemType; typedef int Status; #define OK 1 #define MAXSIZE 100 #…

八、组合数据类型(列表、元组、集合、字典)

序列&#xff1a;存储多个值的连续空间&#xff0c;每个值对应一个编号————索引 包括&#xff1a;列表、元组、集合和字典 相加操作 s1"桂林山水" s2山水甲天下 print(s1s2)#直接相加得到新的字符串 print(_____________________________) print((s1s2)*5,sep&…

Zeppelin安装

Zeppelin是一个基于Web的开源数据分析可视化工具&#xff0c;它提供了一个交互式的笔记本界面&#xff0c;用于在大数据环境中进行数据探索、数据分析、数据可视化和协作。Zeppelin的主要特点包括多语言支持、可视化功能、数据共享和协作&#xff0c;以及扩展性。它支持多种编程…

施耐德 Unity Pro PLC 编程软件介绍

Unity Pro 软件基本介绍 Unity Pro 是施耐德中大型 PLC 的编程软件&#xff08;<–> 对应西门子 Step7&#xff09; 支持的 PLC&#xff1a;施耐德中大型 PLC 中型 PLC&#xff1a;Premium、M340&#xff08;<–> 对应西门子 S7-300、S7-1200&#xff09;大型 PL…

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…

机器人深度学习IMU和图像数据实现焊接精细操作

在双电极气体保护金属弧焊 &#xff08;DE-GMAW&#xff09; 中&#xff0c;对焊枪和旁路电极位置的精确控制是至关重要的。为了这一过程&#xff0c;科研团队提出了安装微型惯性测量单元&#xff08;IMU&#xff09;传感器和摄像头&#xff0c;来记录焊工控制焊枪的移动和微调…

数据挖掘|贝叶斯分类器及其Python实现

分类分析|贝叶斯分类器及其Python实现 0. 分类分析概述1. Logistics回归模型2. 贝叶斯分类器2.1 贝叶斯定理2.2 朴素贝叶斯分类器2.2.1 高斯朴素贝叶斯分类器2.2.2 多项式朴素贝叶斯分类器 2.3 朴素贝叶斯分类的主要优点2.4 朴素贝叶斯分类的主要缺点 3. 贝叶斯分类器在生产中的…

C语言——内存函数

前言&#xff1a; C语言中除了字符串函数和字符函数外&#xff0c;还有一些函数可以直接对内存进行操作&#xff0c;这些函数被称为内存函数&#xff0c;这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy&#xff08;&#xff09;函数 memcpy是C语言中的…

JavaScript(三)---【this指针,函数定义、Call、Apply、函数绑定、闭包】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 0.1全局对象 在JS中有一个全局对象&#xff1a;“window object”&#xff0c;代指的是整个HTML。 一定要慎用全局对…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 从0开始 工具操作解析【三】

同类博文; 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析【二】-CSDN博客 回顾以往 在以前的博文简单介绍了这款工具的rom制作全程。今天针对这款工具的…

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc 默认已添加 使用环境变量立即生效 source ~/.bashrc 执行rust开发环境,在终端输入…

1.java 安装

操作步骤 下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html1 通过Xftp将下载下来的jdk上传到指定虚拟机上传到/usr目录下 2 通过Xshell连接到虚拟机&#xff0c;执行如下命令&#xff0c;解压文件&#xff1a; $ tar zxvf jdk-8u…

Python版【植物大战僵尸 +源码】

文章目录 写在前面&#xff1a;功能实现环境要求怎么玩个性化定义项目演示&#xff1a;源码分享Map地图:Menubar.py主菜单 主函数&#xff1a;项目开源地址 写在前面&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是…

LongAdder 和 AtomicLong

有幸看到一篇关于这个讲解 2个类的讲解&#xff0c;自己也归纳总结一下。 一、解析 看源码底层会发现实现机制不一样&#xff0c;当然这个也是必须的 LongAdder 点进去之后会发现&#xff0c;CAS 它是一个CAS的实现类。至于Cell类JVM提供的内置函数 官方说法是&#xff1a;…