AUTOSAR-PduR模块

  1. PduR模块简介

在AUTOSAR中,PduR模块主要是通过通信接口模块(如Com, IPduM, Linlf, Canlf, CanNm)以及传输协议模块(如CanTp,FrTp,Com,Dcm)为I-PDU(交互层协议数据单元)提供路由服务。

1.1 PduR模块在AUTOSAR中的位置

PduR模块位于AUTOSAR通信服务的核心位置,作为上层模块与下层接口模块或传输层模块传输PDU的桥梁。其位置如下图所示。

上层和下层最常见的组合如下:

  • 诊断通信管理器(DCM)和传输协议模块

  • Com和通信接口模块/传输协议模块/IPduM

  • IPduM和通信接口模块

1.2 PduR的功能概述

PduR模块是AUTOSAR通信结构的核心模块。AUTOSAR通信结构概述如下图所示。

  • PduR路由路径:静态路由路径,用于描述每个I-PDU的路由属性。

  • PDU Router Engine:根据路由路径执行路由操作的实际代码。需要做到:①将I-PDU从源路由到目标;②将源I-PDU id转为目标I-PDU id。

PduR的功能概述如下:

  1. I-PDU转发

  1. 上层模块I-PDU发送至下层模块(接口模块、传输层模块)

包括1:1的单播和1:n的组播

  1. 接收下层模块(接口模块、传输层模块)I-PDU到上层模块

均包括1:1和1:n

  1. I-PDU网关

  1. 1/多接口模块到1/多接口模块(last-is-best buffer/ FIFO buffer/ no buffer)

  1. 1/多传输层模块到1/多传输层模块

  1. I-PDU的转发与网关组合

一个I-PDU可以被一个或多个上层模块接收,同时网关到一个或多个通信接口,使用last -best/FIFO/ no buffer

—一个I-PDU(仅为单帧)可以被一个或多个上层模块接收,同时通过缓冲区网关到一个或多个下层传输协议模块。

  1. 功能详解

PDU Router模块是一个I-PDU传输单元,位于通信接口模块和传输协议模块(下层模块)之上,Com和Dcm模块(上层模块)之下。

IpduM模块位于PduR的旁边,提供对多路复用I-PDU的支持。它既可作上层,也可做下层。当IpduM调用PduR完成发送操作(包括Transmit、TriggerTransmit以及TxConfirmation)时,IpduM被认为是上层模块;当IpduM被PduR调用完成相应的转发任务(转发来自真正上层模块如Com的TxConfirmation以及RxIndication)时,IpduM被认为是下层模块。

IpduM的不同功能

从ECU的角度来看,PduR模块可以执行三种不同类型的操作:

  • PDU接收到本地模块:接收来自底层模块的I -PDU,并转发给一个或多个上层模块。

  • PDU从本地模块发送:根据上层模块的请求,将I -PDU发送到一个或多个下层模块。

  • PDU网关:

  • 1. 从通信接口模块接收I-PDU,并立即通过相同或其他通信接口模块发送I-PDU;

  • 2.从传输协议模块接收I-PDU,并通过相同或其他传输协议模块发送I-PDU。

允许“PDU接收”和“PDU网关”组合使用。例如:Com模块在接收I-PDU的同时被网关到另一个下层模块。

2.1 I-PDU处理

[SWS_PduR_00160]PduR模块应将一个未经修改的I-PDU以一致的方式从源模块传输到目标模块

每个处理I-PDU并为I-PDU提供API的BSW模块必须包含一个I-PDU ID列表。这意味着每个被调用的模块都有一个标识I-PDU的查找表。例如:Com到PduR到CanIf的数据发送中,Com模块调用PduR_ComTransmit(PDU Router模块配置的I-PDU ID), PDU Router模块调用CanIf_Transmit(此处为Canlf模块配置的I-PDU ID), Canlf模块调用PduR_CanIfTxConfirmation(此处PDU Router模块配置包含I-PDU ID), PDU Router模块调用Com_TxConfirmation(此处Com模块配置包含The -PDU ID)。一般来说,为被调模块提供对应的I-PDU ID,即调用函数名字中的前缀(PduR_xxx)。如下图所示(参数中仅显示I-PDU ID):

I-PDU ID举例

[SWS_PduR_00161]PDU Router模块应通过源模块I-PDU ID(位于PDU Router配置中)和目的I-PDU ID(位于被叫目的模块配置中)的组合唯一标识路由路径。

[SWS_PduR_00766]PDU Router模块将I-PDU ID转换为发送路径和TxConfirmation/RxIndication的目标模块。

例如,Com模块向Canlf和Linlf发送I-PDU,此时PduR需要将已有的源I-PDU ID转换为一条到Canlf的发送路径和一条到Linlf的发送路径。此路径上有源ID(Com)、目的ID(CanIf或LinIf)以及该I-PDU在PduR中的ID,发送时根据ID传给不同目的模块,然后在目的模块中根据对应IDTxConfirmation,根据传输是否成功,得到E_OK(成功传输)或E_NOT_OK(不成功传输)的结果。然后,PduR转换ID后将ID与接收到的结果一起转发给Com。

2.1.1 发送

PduR的发送操作由上层源模块发出的PDU transmit请求触发,PduR将该请求转发给下层目的模块。

底层目标模块的传输操作总是异步的。这意味着在I-PDU被PduR传递到底层目的地后,传输服务请求立即返回。如果I-PDU传输成功或失败后,下层目的模块通过PduR_<User:Lo/LoTp>TxConfirmation通知PduR,PduR将通过<Up>_TxConfirmation/TpTxConfirmation将此确认转发给上层模块。

[SWS_PduR_00629] l-PDU不能缓冲在PduR中,以免上层源模块发送PDU。

2.1.1.1 多播
2.1.1.2 通信接口
触发数据传输
错误处理
2.1.1.3 通信协议
多播传输
错误处理
未知长度I-PDU处理

2.1.2 接收

PduR的接收操作是在来自下层模块的RxIndication中完成的。RxIndication函数起源于下层,要么是轮询通信驱动程序后循环函数的上下文中,要么是中断的上下文中。

[SWS_PduR_00827] 允许以n:1的方式转发I-PDU。一次只能启用一个源,分别使用PduR_EnableRouting和PduR_DisableRouting。PduRIsEnabledAtInit应确保在启动时使用该条件。当从通信接口模块转发到上层模块时不适用。

备注:不支持n:1的转发网关组合。

2.1.2.1 通信接口模块

通信接口模块通过调用PduR_<User:Lo>RxIndication来指示收到的I-PDU。I-PDU可以根据路由路径配置多个本地目的模块。

一个IF模块接收到多个上层模块:1:n路由

[SWS_PduR_00164] PDU Router模块对于从通信接口模块接收到并路由到一个或多个上层的I-PDU提供1:n路由。

例如:在Canlf收到一个I-PDU并转发给Com。注意:一个I-PDU可以被一个或多个上层模块接收,同时网关到一个或多个通信接口目的地。

[SWS_PduR_00621] 当PduR_<User:Lo>RxIndication被调用时,PDU Router模块将对每个目的上层模块调用<Up>_RxIndication。

[Sws_PduR_00744] 如果本地模块收到的I-PDU是直接转发的,PDU Router不检查l-PDU长度。

由于PDU路由器模块不会缓冲这个I-PDU,所以它不必拒绝比配置的长/短的I-PDU。

多个IF模块接收到一个上层模块:n:1路由

[Sws_PduR_00901] PDU Router模块从多个通信接口模块接收到一个上层模块的l-PDU,需要提供n:1路由。

[Sws_PduR_00902] 当多个通信接口模块向一个上层模块路由n:1时,PDU Router模块应可选地支持接收FIFO。

注:如果用户不能排除n:1路由点并发请求的可能性,则需要先出先出对并发接收请求进行序列化。

是否配置FIFO的区别:

多个IF模块进行向上层的RxIndication操作,

未配置FIFO时,有一个IF模块的上层RxIndication未返回时,PduR模块就会报错。

配置了FIFO时,有一个IF的上层RxIndication未返回时,PduR对这个I-PDU进行缓冲,直到这个I-PDU对应的上层RxIndication返回,将I-PDU从FIFO中移出。

[SWS_PduR_00903] 如果在未配置FIFO的n:1路由点上调用PduR_<User:Lo>RxIndication,且最近一次请求的<Up>_RxIndication未返回,PDU Router将立即返回,不调用<Up>_RxIndication,并报告PduR.PDUR_E_PDU_INSTANCES_LOST到DET模块。

[SWS_PduR_00904] 如果PduR_<User: Lo>RxIndication用于n:1路由,且配置了FIFO,且最近请求的<Up>_RxIndication未返回,PDU Router将对I-PDU进行缓冲。

[SWS_PduR_00905] 在从FIFO缓冲区调用I-PDU对应的<DstUp>_RxIndication返回后,I-PDU将从FIFO中移除,如果需要的话,将下一个FIFO条目提供给上层

2.1.2.2 传输协议

通过传输协议接收I-PDU的标准用例是每个路由路径只配置一个上层模块。

在多个软件集群的情况下,这个I-PDU也可能被多个上层模块接收。

示例:从CanTp模块(驻留在主机软件集群中)接收到一个功能性的寻址请求,并路由到两个Dcm模块实例(驻留在与主机软件集群位于同一分区的不同应用软件集群中)。

如果源和目标位于不同的分区,则需要考虑分区间路由原则。

从源传输协议模块接收的I-PDU的1:1路由

对于传输协议模块,在接收第一帧(FF)或单帧(SF)时,首先用开始接收通知 告知PduR模块。该通知通过<Up>_StartofReception被转发到相应的上层模块。每个段(N-PDU)的有效负载将在后续<Up>_CopyRxData调用中复制到上层目标模块中。在接收到最后一个N-PDU后,传输协议模块将通知PduR已经接收到完整的I-PDU, PduR将通过调用<Up>_TpRxIndication转发给相关的上层模块。

来自TP的数据是长报文,在传向上层的时候需要一段一段(N-PDU)进行传输,在全部传输完以后才进行RxIndication操作。

TP模块到上层的接收操作

如上图所示,PduR会将来自TP模块的开始接收指示StartOfReception、数据拷贝请求CopyRxData都转发至上层目的模块,上层模块完成相应处理以后返回到TP。

[SWS_PduR_00207] 当源传输协议模块使用PduR_<User:LoTp>RxIndication上报错误时,PDU Router模块除了将RxIndication转发给上层模块外,不进行任何错误处理。

从源传输协议模块接收的I-PDU的1:n路由

此部分为R21-11的DRAFT内容。

如果I-PDU被多个本地上层模块接收,则对这些上层模块的转发处理类似于直接传输协议网关。PduR在PduRDestBufferRef配置的专用缓冲区(PduRBuffers)中缓冲1:n转发PDU,并在RxIndication的上下文中通知上层。

[SWs_PduR_00917] 当PduR从下层成功接收到RxIndication时,模块将为每个配置好的上层目的地发起一个接收会话:<UpTp>_StartOfReception, <UpTp>_CopyRxData, <UpTp>_RxIndication,按此顺序调用。

[SWS_PduR_00912] 如果有多个本地目的地,PduR需要对每个目的地分别进行错误处理。各个目的模块之间的错误互不影响。

[SWS_PduR_00913] 对于有多个本地目的地的组播,当PduR_<User:UpTp> StartOfReception返回错误时,PduR将停止各自的上层接收,不再与上层交互。

[SWS_PduR_00914] 当PduR_<User:UpTp> StartOfReception返回BUFREQ_OK,但可用缓冲区太小无法接收整条消息时,PduR将调用上层模块PduR_<User:UpTp>RxIndication并返回E_NOT_OK。

[SWS_PduR_00915] 当PduR_<User:UpTp>CopyRxData返回错误时,PduR对上层模块调用PduR_<User:UpTp>RxIndication并返回E NOT_OK。

处理未知长度的I-PDU

PduR能够使用TP API处理未知长度的I-PDU(即流数据类型)。未知长度的定义用TpSduLength=0表示。

[SWS_PduR_00821] 在本地接收情况下,当PduR_<User:LoTp> StartOfReception被调用且TpSduLength=0时,PduR将调用<Up>_StartOfReception 并且TpSduLength=0。

2.2 Buffer概念

PduR应该能够缓冲I-PDU。当设置了路由路径相关的PduRQueueDepth时,期望路由路径缓冲I-PDU。到目前为止,I-PDU缓冲仅适用于网关I-PDU和从多个通信接口模块到本地模块的接收

缓冲在以下情况下是强制性的(必须使用缓冲):

  • 如果网关目的地具有 trigger transmit数据供应

  • TP gateways

2.2.1 buffer类型

缓冲区可以由PduRBuffer容器定义。从路径分配的角度来看,有两种类型的缓冲区。称为

全局缓冲区:未被任何PduRRoutingPath引用的PduRBuffer。可以被任何路由路径占用

专用缓冲区:至少被一个PduRRoutingPath引用的PduRBuffer。只能被专有路由路径占用

使用专用缓冲区的主要原因是功能性诊断请求,特别是OBD请求具有非常高的优先级,并且不能因为内存不足而被缓冲区分配策略延迟。

[SWS_PduR_00797]当一个I-PDU需要缓冲 并且 所需的大小不大于至少一个空闲专用缓冲区配置的PduRPduMaxLength时, PduR应使用该专用缓冲区对PduRQueueDepth进行缓冲。

[SWS_PduR_00798]当一个I-PDU需要缓冲 并且 所需的大小大于配置的所有空闲专用缓冲区的PduRPduMaxLength时,PduR将针对PduRQueueDepth动态分配一个大小合适的全局缓冲区。

I-PDU需要缓冲,有大小足够的专用缓冲区可使用时,则用这个专用缓冲区完成缓冲;没有大小合适的专用缓冲区时,动态分配一个合适的全局缓冲区。

2.2.2 缓冲策略

缓冲策略的类型由PduRQueueDepth配置参数的值决定。这个参数指定了一条路由路径可以同时占用几个 PduRBuffer,也隐式地表明一条路由路径可以缓冲几个I-PDU(一个PduRBuffer最多容纳一个I-PDU)。

当PduRQueueDepth值大于1时,表示使用FIFO队列缓冲功能。FIFO有状态,当从不同的上下文调用不同的PduR API时,这些状态可能会发生变化。例如,PduR_<SrcLo>RxIndication调用可以被PduR_<DstLo>TxConfirmation调用中断。因此,需要保护那些并发调用。

[SWS_PduR_00785] 如果PduRQueueDepth配置的值大于1,I-PDU缓冲区将采用先进先出(FIFO)行为。

[SWS_PduR_00787] 在FIFO缓冲的情况下,当一个新的I-PDU需要被缓冲,并且FIFO队列不是空的,那么新的I-PDU将被复制为最新的表项。

[SWS_PduR_00307] 在多播路由(一个源多个目的模块)的情况下,PduRQueueDepth和PduRDestBufferRef可以单独配置。这意味着多播目的地的缓冲区彼此独立。

2.2.3 buffer共享

在配置级别上,一个PduRBuffer可以被多个PduRDestBufferRefs引用。这样的PduRBuffer可以被任何一个引用的PduRRoutingPath占用,作为专用的缓冲区,但是在运行时,在特定的时刻,它只能被一个PduRRoutingPath占用。

(一个buffer可能对应多个目的模块,即多条路由路径。被某一个路由路径占用以后,会成为该路径的专用缓冲区。)

2.3 取消发送和接收

2.4 状态管理

2.5 路由路径组

3. API函数介绍

4.序列图解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值