• 249查看
  • 0回复

[Autosar] Com协议栈配置之PduR

[复制链接]


该用户从未签到

发表于 8-5-2024 19:39:36 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


简介
PduR的结构如下图所示。
Com协议栈配置之PduRw1.jpg

它主要由两部分组成:Pdu路由路径和Pdu路由驱动。前者是静态配置的每个I-PDU的路由,即从哪里来到哪里去,后者是根据前者的配置来实现这个路由的机制。在<<Can协议栈配置之CanIf>>里分析了,CanIf/CanTp会调用上层的User来告诉它发送成功或者上层的User的会调用CanIf_Transmit/CanTp_Transmit来发送消息,而PduR就是其中一个User,PduR的上层可以是Com、Dcm或者LdCom等。下边分析一下常见的Com和Dcm与PduR的调用时序。
发送时序
Com作为PduR的上层模块时发送时序如下图所示。
Com协议栈配置之PduRw2.jpg

1 Com调用PduR模块的PduR_ComTransmit,PduR调用CanIf_Transmit函数实现消息发送;

2 消息发送成功后,CanIf调用PduR_TxConfirmation,PduR调用Com_TxConfirmation通知Com消息发送成功
Dcm作为PduR的上层模块时发送时序如下图所示。
Com协议栈配置之PduRw3.jpg

1 Dcm调用PduR模块的PduR_Transmit,PduR调用CanTp模块的CanTp_Transmit发送消息,随后CanTp不断调用PduR_CanTpCopyTxData,然后PduR调用PduR_CanTpCopyTxData拷贝Dcm将要发送的数据;

2 当最后一帧数据发送完成后,CanTp调用PduR_CanTpTxConfirmation,PduR调用Dcm的Dcm_TpTxConfirmation告知Dcm发送完成。
Trigger类型发送时序如下图所示。
Com协议栈配置之PduRw4.jpg

Com调用PduR_Transmit函数发送数据,PduR调用FrIf_Transmit函数置发送标志位,然后FrIf模块向上调用PduR的PduR_Triggertransm,PduR再调用Com_TriggerTransmit实现数据拷贝,最终完成数据发送。
接收
Com作为PduR的上层模块时接收时序如下图所示。
Com协议栈配置之PduRw5.jpg

Dcm作为PduR的上层模块时接收时序如下图所示。
Com协议栈配置之PduRw6.jpg

1 CanTp接收到CanIf的数据(CanIf调用CanTp_Rxindication)后调用PduR模块的PduR_CanTpStartOfReception(假设满足接收条件),PduR调用Dcm_StartOfReception开始接收数据,在判断条件满足(buffer够用)后,开始不断调用Dcm_CopyRxData将接收的数据拷贝到Dcm的缓存;

2 在接收完最后一帧数据(CanTp调用PduR_CanTpRxIndication)后,PduR调用Dcm_TpRxIndication告诉Dcm数据接收完成,可以进行处理了。

网关(Gateway)
作为接口层(CanIf层)网关,当上层是Com时可以配置是否通知Com,下图为通知Com的路由(调用Com_RxIndication)
Com协议栈配置之PduRw7.jpg

PduR收到Can1的消息(调用PduR_RxIndicatio),然后PduR直接调用CanIf_Transmit通过Can2将消息发送出去。传输协议层(CanTp)间的网关的调用时序如下图所示。
Com协议栈配置之PduRw8.jpg

在PduRTpBuffer足够的情况下,接收完Can1的数据后再发送给Can2。但当接收的数据量达到PduRTpThreshold时,需要先调用发送数据将数据发给CAN2,以此往复。综上所述,PduR需要包含三个方面的配置:PduR的上下层包含哪些模块(PduRBswModuless)、通用配置(PduRGeneral)和路由路径(PduRRoutingTables)。
配置
下边介绍PduR的常见配置选项。
PduRBswModuless
以Com作为上层和CanIf作为下层,分析配置选项。
Com协议栈配置之PduRw9.jpg

Com协议栈配置之PduRw10.jpg

PduRCommunicationInterface:配置BSW模块是否支持通信接口的Api。

PduRLowerModule:是否是PduR的下层模块。

PduRUpperModule:是否是PduR的上层模块。

PduRBswModuleRef:引用配置的BSW模块。

PduRGeneral

Com协议栈配置之PduRw11.jpg

PduRTpWithLimitedBuffer:Tp层网关时是否使用有限的资源(需要配置Tp层缓存buffer的大小)。

PduRIFGatewayOperation:是否使能If层的网关功能。

PduRTpGatewayOperation:是否使能Tp层的网关功能。

PduRMulticastFromTpSupport:是否支持Tp层多播接收(非同一个Tp层即为多播,如CanTp和J1939Tp之间的转发)。

PduRMulticastToTpSupport: 是否支持Tp层多播发送。

PduRMulticastToIfSupport: 是否支持If层多播发送(非同一个If层即为多播,如CanIf和LinIf之间的转发)。。

PduRZeroCostOperation:零损耗操作(ZeroCostOperation)表示PduR的源和目的都只有一个时,可以开启此功能,此时PduR模块将不会做任何代码处理。如当你的ECU中只有一个Com模块和一个CanIf模块时,开启此功能,PduR_ComTransmit将直接调用CanIf_Transmit而不会再PduR模块进行任何逻辑处理,可以理解为下边的宏定义:
#define PduR_ComTransmit(a,b)  CanIf_Transmit(a,b)

PduRRoutingTables

PduRRoutingPath

Com协议栈配置之PduRw12.jpg

Com协议栈配置之PduRw13.jpg

PduRSrcPduRef:源模块的Pdu,对于发送而言就是上层模块(如Com)传给给PduR使用的Pdu(Com中使用的Pdu),对于接收而言就是下层模块(如CanIf)传给低PduR使用的Pdu(CanIf中使用的Pdu,CanIfRxPduCfg)。

PduRQueueDepth:PduR路由队列的深度(Tx Fifo buffer length)。

PduRDestPduDataProvision:指定数据的发送方式:direct (as part of the Transmit call) or via the TriggerTransmitcallback function,PDUR_DIRECT:PduR路由模块需要调用目标模块的发送函数而且不做任何缓存;PDUR_TRIGGERTRANSMIT:PduR路由模块需要调用目标模块的发送函数,然后目标模块通过triggerTransmit函数获取Pdu的数据,可能要求PduR模块(如缓存Tp的分包报文)具备缓存功能。

PduRTpThreshold:对于Tp路由来说PduR的缓存大小。

PduRTransmissionConfirmation:目标模块发送成功后是否调用TxConfirmation(只对If层接口而言,Tp层一般是必须调用)。

PduRDestPduRef:目标模块的Pdu,对于发送而言就是PduR发送给下层模块(如CanIf,CanIfTxPduCfg)使用的Pdu,对于接收而言,就是PduR传给给上层模块(如Com)用的Pdu。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 11:38 , Processed in 0.241784 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.