今天介绍COM的下层模块:PduR—协议数据单元路由。
1 PduR的位置和作用
PDU Router(下文简称“PduR”)模块位于AUTOSAR通讯架构的中间位置,其上层主要包括DLT、DCM、COM和IpduM,下层主要包括CANTp、CanIf、FrIf、LinTp、IpduM、CanNm、FrNm。由于IpduM具有两个不同的角色,所以它分为上下两个模块:
上层:COM模块与I-PDU多路复用器(IpduM)模块之间的通信;
下层:IpduM模块与通信接口模块(CanIf、FrIf)之间的通信。
图1 PduR在BSW通讯模块中的位置
PduR模块同级的I-PDU多路复用器 (IpduM) 模块,它提供对多路复用I-PDU的支持。当IpduM调用PduR模块来传输复用的I-PDU时,或当PduR模块调用它来接收或传输复用的I-PDU确认时,或者当它通过触发器传输来提供数据时,IpduM都被认为是一个上层模块。IpduM调用PduR模块,提出传输确认或接收指示上层(例如COM),或当它被称为PduR模块更新I-PDU时,属于多路复用I-PDU,则被视为下层模块。
2 PduR的内容
-
PDU接收到本地模块:从底层模块接收I-PDU并将其传递到一个或多个上层模块;
-
从本地模块传输PDU:根据上层模块的请求,将I-PDU传递到一个或多个底层模块;
-
PDU网关:
-
从接口模块接收I-PDU,并立即通过相同或其他通信接口模块传输I-PDU; -
从传输协议模块接收I-PDU,并通过相同或其他传输协议模块传输I-PDU。
I-PDU的路由是基于静态定义的I-PDU标识符执行的。在运行时不会动态地路由I-PDU,可能取决于它的有效负载。PduR模块是基于接口模块的通用方法,接口模块在PduR模块配置中配置。可以很容易地配置PduR来支持其他上层和下层模块。当然,这种方法也允许将复杂驱动程序(ComplexDrivers,CDDs)集成为PduR的上层或下层模块,但一般项目为了复杂驱动模块的独立,会单独解耦处理。
PduR模块的用户列表不是固定的。最常见的上层和下层的组合如下:
- AUTOSAR DCM和Tp模块;
- AUTOSAR COM和通信接口模块、传输协议模块或I-PDU多路复用器;
- I-PDU多路复用器和通信接口模块;
a) PduR路由路径: 描述每个I-PDU的静态路由路径。路由路径可以在ECU的编程状态下更新后生成可加载,或者通过可选初始化PduR时选用。
b) PduR引擎: 根据PduR的路由路径执行路由操作的实际代码。路由器引擎需要处理:
· 将I-PDU从源方路由到目标方;
· 将源方的I-PDU ID传递给目标方
(例如PduR_transmission转换为canif_transmission,PduR_CanIfTxConfirmation转换为Com_TxConfirmation)。
I-PDU由静态I-PDU ID标识,因为在编译PduR模块后必须标识I-PDU。PduR模块使用静态配置表中的I-PDU ID来确定I-PDU的目标。I-PDU用于PDUR上层模块的数据交换,如COM模块和DCM模块。路由器模块的路由操作并不修改I-PDU,它只是将I-PDU转发给目标模块。在TP路由时,I-PDU的传递可以在收到完整I-PDU之前开始,即“动态网关”。而对于网络管理数据交换,可以绕过PduR模块实现。
I-PDU ID配置时,需要同时配置实现的API。如此,可以在每个接收I-PDU ID的模块中高效地实现查找表(例如,PduR模块的配置包含PduR_CanIfTxConfirmation的I-PDU ID)。
PduR模块可以实现:
-
从本地模块到通信接口模块I-PDU的单播(1:1)。 -
从本地模块到通信接口模块I-PDU组播(1:n)。 -
从本地模块到传输协议模块I-PDU的单播 (1:1) (单帧(SF)或多帧(FF和CFs))。 -
从本地模块到传输协议模块I-PDU的组播(1:n) (单帧(SF))。 -
从通信接口模块到本地模块I-PDU的单播(1:1)。 -
从通信接口模块到本地模块I-PDU的组播(1:n)。 -
从传输协议模块到本地模块I-PDU的单播(1:1) (单帧(SF))。 -
从传输协议模块到本地模块I-PDU的组播(1:n) (单帧(SF))。 -
从通信接口模块到使用缓冲区通信接口模块I-PDU的网关(1:1)。 -
从通信接口模块到使用缓冲区通信接口模块I-PDU的网关(1:n)。 -
从通信接口模块到通信接口模块I-PDU使用FIFO的网关(1:1)。 -
从通信接口模块到通信接口模块I-PDU使用FIFO的网关(1:n)。 -
从通信接口模块到通信接口模块I-PDU使用FIFO的网关(n:1)。 -
从传输协议模块到传输协议模块I-PDU使用FIFO的网关(1:1)。 -
从传输协议模块到传输协议模块I-PDU使用FIFO的网关(1:n)。 -
从传输协议模块到传输协议模块I-PDU使用FIFO的网关(n:1)。
PduR模块不支持以下内容:
-
信号提取或转换。
-
数据完整性检查 (如校验和)。
-
更改或修改I-PDU。
-
制定任何依赖于PDU负载的路由决策。
-
支持TP模块和If模块之间的路由。
-
支持I-PDU在If模块之间的速率转换。(此功能在COM模块中实现)。
# 关注【汽车控制与人工智能】,后台回复“PduR”,获取相关材料。
3 API函数
PduR模块依赖所使用的通信硬件抽象层模块、所使用的通信API和功能服务层模块。PduR模块需要的API函数主要包括:
下层Com IF模块:
-
_Transmit (e.g.CanIf_Transmit, FrIf_Transmit, LinIf_Transmit)
-
_CancelTransmit (e.g.FrIf_CancelTransmit)
下层Tp模块:
-
_Transmit (e.g.CanTp_Transmit, FrTp_Transmit, LinTp_Transmit) -
_CancelTransmit(e.g. CanTp_CancelTransmit, FrTp_CancelTransmit) -
_CancelReceive(e.g. CanTp_CancelReceive, FrTp_CancelReceive)
上层COM模块:
-
_RxIndication (e.g.Com_RxIndication) -
_TxConfirmation (e.g.Com_TxConfirmation) -
_TriggerTransmit(e.g. Com_TriggerTransmit)
上层Dcm模块:
-
_StartOfReception(e.g. Dcm_StartOfReception)
-
_CopyRxData (e.g.Dcm_CopyRxData)
-
_CopyTxData (e.g.Dcm_CopyTxData)
-
_TpRxIndication (e.g.Dcm_TpRxIndication)
-
_TpTxConfirmation(e.g. Dcm_TpTxConfirmation)
每个处理I-PDU并为I-PDU提供API的BSW模块必须包含I-PDU ID列表,这意味着每个被调用的模块将有标识I-PDU的查询表。
举个例子:
COM模块调用PduR_ComTransmit(PDUR模块将列出I-PDU ID), PDUR模块将调用CanIf_Transmit(CanIf模块配置将列出I-PDUID),CanIf将调用PduR_CanIfTxConfirmation(PDUR模块配置将列出I-PDU ID)和PDUR模块将调用Com_TxConfirmation(COM模块配置将列出I-PDU ID)。如下图3所示(仅I-PDU ID为参数):
I-PDU接收是指从底层通信接口模块或传输协议模块接收并传递到COM模块。
PduR不是通信接口模块和I-PDU的唯一客户。其他模块如NM和TP模块直接从通信接口模块接收PDU。
图4 PduR的发送序列图
PduR模块通过源模块I-PDU ID(位于PDUR配置中)和目标模块I-PDU ID(位于被调用的目标模块配置中)的组合唯一地标识路由路径。PDUR模块应将I-PDU ID转换为传输路径和确认路径的目标模块。
比如,COM模块将I-PDU传输给CanIf和LinIf。调用PduR_comtransmission。PduR模块将源I-PDU ID(PDUR模块配置)转换为I-PDU ID (LinIf模块配置)和I-PDU ID(CanIf模块配置)。从COM模块接收到的PduInfoType值被复制到CanIf和LinIf模块,而不做任何更改。
LIN通讯类似,Linif将使用I-PDU ID调用PduR_liniftxconfirm,根据传输成功与否,调用结果是E_OK(成功传输)或E_NOT_OK(传输失败)。然后,PduR模块将转换I-PDU ID,并使用com_txconfirm将调用转发到COM,使用转换后的I-PDU ID和接收到的结果。
PduR模块只能根据配置中给出的路由路径对I -PDU进行路由。当具有不同元数据类型的I-PDU通过路由路径连接时,PduR生成器将会拒绝配置。PduR模块的接收操作,总是通过底层模块(通信接口模块或传输协议模块)的指示来完成。指示函数由底层轮询通信驱动的循环函数执行,或在中断情况下执行。
源通信接口模块通过调用PduR_RxIndication来指示接收到的I-PDU。I-PDU可以有多个目标本地模块,通过路由路径来配置。
对于传输协议模块,当接收第一帧(FF)或单帧(SF)时,首先通知PduR模块并开始接收通知。通过调用_StartOfReception将此调用转发到相关的上层模块。每个段的有效载荷(N-PDU)将由_CopyRxData调用在目标上层模块中复制。在接收到最后一个N-PDU之后,传输协议模块将指示PDU路由器模块已经接收到完整的I-PDU,而PDU路由器模块将通过调用_TpRxIndication将这个指示转发给相关的上层模块。
通过传输协议模块接收I-PDU可以只配置一个由路由路径配置的上层模块。
PduR模块为从源传输协议模块接收并路由到目标上层模块的I-PDU提供1:1的路由。比如,从CanTp模块接收功能性寻址请求(在SF中)并将其路由到DCM模块。
目标底层模块的传输操作异步实现的,这意味着传输服务请求返回在I-PDU被PduR模块传递到目标下层模块之后。如果目标底层通知PduR模块通过PduR_TxConfirmation(通信接口)或PduR_TxConfirmation(传输协议)在I-PDU传输成功或失败,PDUR模块将通过_TxConfirmation(通信接口)或该指示转发给上层模块_TpTxConfirmation (传输协议)。
PduR模块的传输操作由上层源模块的PDU传输请求触发,并将请求转发到目标下层模块。
5 I-PDU网关
PduR模块支持I-PDU从源总线到一个或多个目标总线的网关交换。本地模块的传输和接收的区别在于,PDUR模块必须同时是接收器和发送器,在某些情况下还为I-PDU提供缓冲。
为了在不需要网关的情况下有效地实现PduR模块,网关需求被有意地分开。如果PDUR模块允许I-PDU的网关交换,则这些要求被视为附加要求,而不是取代以前的要求。
-
PDUs可以从源通信接口模块网关到一个(1:1)或多个目标通信接口模块I-PDU网关(1:n)。
-
对于每个目的地,PDU路由器模块可以在可配置的深度内缓冲I-PDU的每个目的地(例如,如果多于一个I-PDU,则FIFO)。 -
一个I-PDU可以被一个上层模块在与n个目标通信接口同时接收。
-
使用TP传输的I-PDU可以被网关到一个或多个目标TP模块,范围如下:
-
单帧和多帧都可以被网关到多个目标TP模块或本地模块(如DCM)。 -
在多个N-PDUs中传输的I-PDU可以被“动态地”传送到一个目的地,这意味着在目标TP模块上开始传输之前,不需要接收完整的I-PDU。 -
在多个N-PDUs中传输的I-PDU可以通过网关传送到另一个TP模块,也可以由一个本地模块接收,但不能同时接收两个模块。 -
使用TP模块传输的I-PDU可以采用FIFO缓冲。这适用于SF和多帧I-PDU。
-
I-PDU只能在通信接口模块或TP模块之间进行网关,不能混合使用。例如,I-PDU不能从CanIf和网关到LinTp接收。
如果不支持I-PDU在不同周期或速率的通信接口模块之间路由,则可以通过使用信号网关的COM模块来完成。在这种情况下,I-PDU必须被路由到COM模块。
举例说明一下。
基于信号的通信路径如图8所示,发送路径由Com模块启动,经过PduR进行路由,派发到对应总线的接口模块,最后由对应的总线驱动模块把信号发送到总线上;接收路径反之。
Dcm的诊断信息通信路径如图9所示。发送路径由Dcm模块启动,经过PduR进行路由,派发到对应总线的TP模块,经过Tp的拆包功能经对应总线的接口层发送到驱动模块,最后由对应的总线驱动模块把信号发送到总线上;接收路径反之。
PDU的网关路径如图10所示。第一种网关路径是不同总线的接口层之间的,先由驱动接收到帧,经接口层提交给PduR模块,然后PduR模块根据之前配置的网关路径转发给另一种总线的接口层,接口层提交给目标总线的驱动层,最后由驱动层把PDU发布到总线上。另外一种网关路径是不同总线的TP层之间的,和第一种相比是在路径中增加了TP节点,同时也多了拆包组包的消耗。
图10 不同总线的网关路径
PDU广播路径如图11所示。广播路径由Com模块启动,根据PduR对这个PDU的配置,使用多条路径进行路由,之后派发到对应总线的接口模块,最后由对应的总线驱动模块把信号发送到总线上,从而达到广播效果。
6 PDU ID的映射机制
在每一层,PDU都有一个全局的识别号(简称全局ID)和一个本地的识别号(简称本地ID)。其中全局ID由ECU配置(简称EcuC)全局分配,一条通信路径上的PDU 的全局ID相同。为了方便本层管理PDU,会使用本地ID连续的机制,为每个PDU分配一个本地ID。
通信协议栈中上层在使用下层服务时,先根据PDU在自己层的本地ID,查找到这个PDU的全局ID,然后根据这个全局ID,查找这个PDU在下层对应的本地ID,最后根据得到的本地ID使用下层服务。
通信协议栈的下层在使用上层服务时,先根据PDU在自己层的本地ID,查找到这个PDU的全局ID,然后根据这个全局ID,查找这个PDU在上层对应的本地ID,最后根据得到的本地ID回调上层。
总结:
PduR模块主要提供两方面的服务:
一是承上启下衔接上层和下层:发送时派发从高层模块的PDU到低层模块;接收时派发从底层模块如If或者TP接收的PDU给高层模块(COM,PduR)。
二是通信网络中的网关功能。其中网关功能有两种:从一个接口层到另外一个相同或者不同总线类型的接口层;从一个TP到另外一个相同或者不同总线类型的TP层。其中路由协议是基于一个静态的路由表和PDU ID的概念。
缩略词:
CAN Communication Matrix:CAN通信矩阵,用来描述完整的CAN网络,包括:涉及的CAN节点;CAN PDU的定义(ID和数据长度DLC);PDU的发送和接收信息。
Physical Channel:物理通道。代表CAN网络的接口,不同CAN硬件单元的不同物理通道可以访问不同的网络。
DCM: Diagnostic Communication Manager,诊断通信管理
COM IF:communicationinterface modules,通讯接口模块
COM Tp:Communication Transport,通讯传输
IpduM:I-PDU Multiplexer,I-PDU多路复用
DLC:Data LengthCode,描述SDU长度的CAN信息。
I-PDU: Interaction Layer Protocol Data Units,交互层协议数据单元。
L-PDU:Data LinkLayer Protocol Data Unit,数据链接层的协议数据单元,包含标识符(ID), 数据长度(DLC)和数据(L-PDU)
L-SDU:Data LinkLayer Service Data Unit数据链接层服务数据单元,它其中的数据传输到L-PDU中。
gatewaying-on-the-fly: 网关功能。在两个TP模块之间的路由,在所有数据被接收之前,数据的转发就开始了(当达到指定的阈值时)。如果在两个接口之间传输数据量较大,最好能够在从源网络接收所有数据之前在目标网络上开始传输,可以节省内存和时间。
multicast operation:组播模式。同时传递PDU给众多接收组群。(1:n)
data provision:数据条款。包含两种数据条款接口模式:直接数据条款和触发型数据条款。
last-is-best buffering:first in first out缓冲策略,用最新值覆盖最后一个值。
FIFO buffering:缓冲概念,使用先进先出策略。
SF:Single Frame,单帧
FF:First Frame,首帧
CF:ConsecutiveFrame,连续帧
N-PDU:CAN传输层的网络协议数据单元。
N-SDU:CAN传输层的服务数据单元。其中的数据传输到N-PDU中。
PDU Router:协议数据单元路由。将I-PDU从一个模块传递到另外一个模块,PDU Router可以用于网关运行或内部路由。