概述
IPduM(I-PDU Multiplexer)在AUTOSAR架构中和PduR属于同一层级,顾名思义,IPduM作用是与PduR交互实现I-PDU的复用。
I-PDU多路复用是指使用同一个I-PDU的同一种PCI,其SDU有多个不同的布局。选择字段(selector field)是多路I-PDU中SDU的一部分。它用于区分复用I-PDU的不同布局。
IPduM模块负责将通过IPDU-Router从COM接收到的I-PDU组合成新的、多路复用的I-PDU,再发送到发送方的I-PDU Router。在接收端,它负责解析多路I-PDU的内容,并通过IpduM解析字段的值,为COM提供适当的分离I-DPU。
通俗的理解:一个PDU中的部分区域可以有多种Layout,类似于传统的一个报文可以有多种信号的Layout,实现一个报文传输多种不同Layout信号的作用,以此达到节省报文ID使用等作用。熟悉Vector DBC文件的朋友可能熟悉,类似于其中的信号复用。
Vector DBC中信号复用介绍
如下,我们在定义信号时,可以选择复用类型:
- Signal 普通信号,不复用
- Multiplexor Signal 作为控制开关的信号
- Multiplexed Signal 复用的信号,还需要设置复用值
举例:
【New_X】设置成multiplexor signal
【New_A】设置成multiplexed signal并且multiplex value=0x01
【New_B】设置成multiplexed signal并且multiplex value=0x02
当【New_X】的值为0x01时,【New_A】表示显性
当【New_X】的值为0x02时,【New_B】表示显性
AUTOSAR PDU SDU介绍
PDU:Protocal Data Unit
PDU包含SDU和PCI。在发送方,PDU由上层传递到下层,把传递下来的PDU当做是自己的SDU。
SDU:Service Data Unit
SDU由上层传递到下层,携带请求发送的数据。接收的SDU作为本层PDU的一部分。
PCI:Protocal Control Infomation
该信息用于将SDU从特定协议层的一个实例传递到另一个实例。例如,它包含源和目标信息。PCI在传输端由协议层添加,在接收端再次删除。
图示关系如下
名词解释和缩写
缩写 | 描述 |
---|---|
contained I-PDU | container PDU包含的I-PDU叫做contained I-PDU |
container PDU | 包含I-PDUs和Headers的PDU |
dynamic part | 根据选择器字段的值,I-PDU的某些部分有不同的布局。这些I-PDU中可以包含不同信号的部分称为动态部分。动态部分不一定是连续的 |
selector field | 选择字段是复用I-PDU的一部分,由几个连续的bits组成。其值用来选择复用I-PDU中复用部分的Layout |
static part | 不管选择器字段的值,I-PDU中的某些部分或者信号可能是相同的。这样的部分称为静态部分。静态部分不一定是连续的 |
IPduM功能介绍
IPduM有两种不同的用法,分别是:
-
I-PDU复用
I-PDU复用的用法是使用同一个I-PDU ID经过PduR传输或者接收该I-PDU的多个Layout。
-
多个PDU与Container PDU的映射
多个PDU到Container映射是指将多个I -PDU收集到一个Container PDU中。举个例子方便大家理解:比如车辆内网关上CAN总线上的ECU要和CANFD总线上的ECU通信,为了节省报文ID以及减小带宽等需求,可以将多个CAN报文打包在一个CANFD报文里。这就是多个PDU与Container PDU的映射应用。
I-PDU复用介绍
复用I-PDU的定义和结构
复用I-PDU由一个静态部分和动态部分组成,其中静态部分(可选)由0到多个signals或者signal groups组成。动态部分由一个选择字段和一个到多个signal或者signal group组成。如下图所示。
动态部分类似于C语言编程中的联合体。根据动态部分的选择字段不同,其layout不同。
静态部分和动态部分的位置可以配置,并且可以细分为不同的segments。每一个I-PDU只能包含一个选择字段。选择字段的值规定了动态部分的内容如何被解析。选择字段的长度可以配置为1到16个连续的bits,其起始位置也可以配置。
静态部分和动态部分在复用I-PDU中被分配相同的bits位,即两部分含有相同的宽度。
缩短的静态部分
这种结构静态部分和动态部分可以被细分为多个segments。
缩短的动态部分
这种结构不细分静态部分和动态部分。
复用I-PDU的发送
IpudM提供了IpduM_Transmit功能以使PduR模块根据触发条件发起I-PDU的发送。静态部分和动态部分的发送确认可以配置,根据配置两种发送确认都可以生成。
Transmission trigger
IpduM模块通过从PDU Router模块中分离出两个传输请求作为两个单个的COM I-PDU来接收多路传输的I-PDU的静态和动态部分。
发送有以下几种可配置的触发条件:
- 接收一个静态部分
- 接收一个动态部分
- 接收一个静态部分或者一个动态部分
- 不触发发送(IpduMTxTriggerMode None)
复用I-PDU的接收
PDU Router将多路复用的I-PDU路由到IpduM模块。IpduM模块将多路复用I-PDU的静态部分和动态部分分别路由到各自的目的地。
多个PDU与Container PDU的映射介绍
IpduM支持多个I-PDU与一个Container PDU的映射。Container PDU Layout可以是动态定义的,在包含的I-PDU前面使用header信息;或者静态地不使用header信息,但为Contained I-PDU定义了静态位置。从PduR的层级来看,Container PDU和Contained I-PDU都是PDU。这种方式一般用在网关上,将多个Classic CAN报文映射到一个CANFD报文。
Dynamic Container Layout
这种结构Header放置在I-PDU前面,Header的Size有Short和Full两种格式可以配置
-
IPDUM_HEADERTYPE_SHORT
24bit ID and 8bit length
-
IPDUM_HEADERTYPE_FULL
32bit ID and 32bit length
其中的ID和DLC,在CAN通信中就是CAN报文的ID以及DLC。
Static Container Layout
使用static container layout时,container pdu的header size必须配置为IPDUM_HEADERTYPE_NONE。
Transmission
发送的触发有多种不同的方式,如下:
-
如果IpduMContainedTxPduTrigger设置为IPDUM_TRIGGER_ALWAYS,当把contained I-PDU添加到container PDU时,Container PDU会被立即触发。
-
如果IpduMContainerTxFirstContainedPduTrigger 设置为TRUE,当把第一个contained I-PDU添加container PDU时,IpduM会调用PduR_IpduMTransmit。
-
如果contained I-PDU的IpduMContainedTxSendTimeout或者Container PDU的IpduMContainerTxPduSendTimeout配置大于0,IpduM会启动Container PDU的计时器,计时器由IpduMContainerTxSendTimeout和IpduMContainedTxPduSendTimeout中较小的且非0的参数初始化。
-
当一个contained I-PDU被添加到container PDU时,如果contained I-PDU的超时时间(IpduMContainedTxPduSendTimeout)小于container PDU的剩余时间,container PDU的发送计时器应该由contained I-PDU的超时时间(IpduMContainedTxPduSendTimeout)更新。
-
当配置的Container PDU发送timer超时时,IpduM会调用PduR_IpduMTransmit。
两种方式策略
-
Queueing
如果一个Container PDU被trigger多次来不及发送,会存储在队列中,等待下一次发送。下一次的发送必须等到上一次发送的TxConfirmation收到。
-
Triggered Transmission and Last-is-Best 策略
该方式不会有缓存,新数据会覆盖旧数据,且不会有重复的数据。
时序图
复用I-PDU的发送以及发送确认
接收复用I-PDU