【AUTOSAR 基础软件】PduR模块详解(通信路由)

文章包含了AUTOSAR基础软件(BSW)中PduR模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解PduR这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生成的,与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。

PduR模块的位置处于通信栈的中心位置,用于上层COM或者DCM等内部模块与下层通信接口模块CanIf、LinIf或者传输协议模块LinTp,CanTp之间的报文转发。报文转发则是根据静态配置的路由表规则进行转发,而路由表是根据DBC中相关网络节点的报文收发关系与导入时选择的报文类型(COM、NM、NPDU、Gateway、XCP、DCM)自动生成的,用户可以在自动生成的静态路由表基础上添加一些路由信息。PduR模块不仅可以路由上下层之间的报文,还可以仅在下层的通信与传输模块之间进行路由(网关模式)。下层之间的报文转发对于上层模块与应用层软件可以做到完全透明,PduR可以独立完成转发,不需要上层模块与应用软件的参与。

目录

AUTOSAR规范解析

概述

PduR模块结构

缩略语与概念

与其他模块的依赖

功能说明

I-PDU处理

时序图

CanIf模块I-PDU接收

CanTp模块I-PDU接收 

CanIf模块I-PDU发送 

CanTp模块I-PDU发送 

两个CanIf之间的网关路由 

两个CanIf之间的网关路由,并且COM也收到报文

ISOLAR-AB配置 

PduR

PduRGeneral

PduRBswModules

PduRRountingTabls

代码解析 

动态配置代码

集成代码 

静态代码


AUTOSAR规范解析

概述

PduR模块提供I-PDU(交互层协议数据单元)的路由服务,PduR模块从上层模块接收到I-PDU之后,根据PDU ID查找已经定义好的静态路由表,获得其目标地址之后,定向并转发到下层模块。路由是一个动词,这里可以狭义的理解为一个转发的过程。而I-PDU是交互层协议单元,I-PDU由数据(缓冲区)、长度和ID组成,是PduR路由的数据单元。PduR涉及使用的模块按类型分类包括:

  • Communication interface modules(通信接口模块):这些模块的接口一般使用<Provider:Up>或者<Provider:Lo>作为接口名称一部分,例如Com,IPduM, LinIf, CanIf,,CanNm,FrIf和FrNm。
  • Transport Protocol modules(传输协议模块):这些模块的接口一般使用<Provider:UpTp>或者<Provider:LoTp>作为接口名称一部分,例如J1939Tp, LinTp (part of LinIf), CanTp, FrTp, COM, DCM。

正如前文所说,I-PDU的路由是基于静态定义的I-PDU ID进行的,并不支持运行时的动态路由,则相关模块对于PduR的位置是确定的,我们分为上或者下。例如DLT、DCM、COM、IpduM为上,而Canlf、Frlf、LinTp、lpduM、CanNm、FrNm则为下。lpduM被同时列为一个上模块和一个下模块,是因为它有两个不同的角色(上:用作与COM模块进行通信,下用作与通信接口模块之间的通信)。当IpduM调用PduR模块来传输或者接收复用的I-PDU时,或者当它被通过触发来提供传输数据时, IpduM都被认为是一个上层模块。IpduM调用PduR模块,提出传输确认或接收指示上层(例如COM),则被视为下层模块。

PduR模块的上下层模块关系并不是固定的,下面列出常见的上下层关系:

  • 上为AUTOSAR Diagnostic Communication Manager(DCM),下则为Transport Protocol modules(传输层协议,例如CanTP)。
  • 上为AUTOSAR COM模块,下为Communication Interface modules(通信接口模块,例如CanIf),或者Transport Protocol modules(传输层协议),或者I-PDU Multiplexer(IpduM)。
  • 上为I-PDU Multiplexer,下为Communication Interface modules。

PduR在AUTOSAR通信栈中位于中心的部位,下图展示了它的位置。

下图更详细的包含了PduR在整个协议栈与个个模块之间的关系。


PduR模块结构

PduR模块是AUTOSAR基本软件的一部分,并且是强制实例化在每一个AUTOSAR的基础软件中。PduR的详细模块结构如下图所示。

可以看出,PduR模块主要由两部分组成:

  • PDU Router routing paths(路由表):此项属于静态配置,由工具自动生成或用户配置,描述I-PDU的路由属性,包含源地址路由到目的地址等信息。
  • PDU Router Engine(路由引擎):根据PduR路由表执行路由操作的实际代码,这里如果多帧传输CANTP使用时,TP的PDU很大,此时需要拆分成很多I-PDU进行传输,在PduR收到全部的TP PDU之后才开始转发PDU,此时会用到buffer。路由引擎包含的功能有:
    • 将I-PDU从源路由到目的地。
    • 将源I-PDU的ID转换为目标ID,并将操作转化为具体模块的操作。(例如,PduR_Transmit转换为 Canlf_Transmit,PduR _CanlfTxConfirmation转换为Com_TxConfirmation)。

缩略语与概念

  • Upper Layer Modules (Up):PduR上方的模块。此层通常包括COM和诊断通信管理器(DCM),应在PduR中配置。
  • Lower Layer Modules (Lo):PduR下面的模块。此层可包括CAN、LIN、FlexRay、以太网通信接口模块和相应的TP模块。所使用的模块应在PduR中配置。
  • PDU Router:将I-PDU从一个模块传输到另一个模块的模块。PduR模块可用于网关操作和内部路由目的。
  • gatewaying-on-the-fly:网关功能,在接收到所有数据之前,在两个TP模块之间开始数据转发(达到指定阈值时)的路由。如果在两个接口之间传输大量数据,则希望在从源网络接收到所有数据之前能够在目标网络上开始传输。这样可以节省内存和时间。
  • multicast operation:PDU同时传输到一组接收端,即1:n路由。
  • data provision:为接口模块提供数据。
    • 直接数据提供:在传输请求时直接提供要传输的数据。目标通信接口可以以两种方式工作,要么直接复制数据,要么延迟复制到触发传输。
    • 触发发送数据提供:在发送请求中不提供要发送的数据,但将通过回调函数由上层接口模块提供。
  • last-is-best buffering:一种缓冲策略,其中最新的值会覆盖旧值。
  • FIFO buffering:缓冲区概念,采用先进先出的策略。
  • I-PDU ID:PDU的ID。
  • I-PDU:交互层PDU。I-PDU由数据(缓冲区)、长度和I-PDU ID组成。PduR主要路由I-PDU。
  • N-PDU:网络层PDU。传输协议模块将分割I-PDU到N-PDU。
  • L-PDU:数据链路层PDU。一个或多个I-PDU(或者N-PDU)被打包成一个L-PDU。L-PDU的格式依托于某个专用总线(例如CAN帧)。
  • SF:单帧,传输协议术语。
  • FF:头帧,传输协议术语。
  • CF:连续帧,传输协议术语。
  • PDU:Protocol Data Unit,协议数据单元。
  • BSW:Basic Software,基础软件。
  • <SrcLo>:作为I-PDU源的下层通信接口模块。SrcLo始终是一个。
  • <DstLo>:作为I-PDU目的地的下层通信接口模块。DstLo可以由一个到多个。
  • <SrcLoTp>:作为I-PDU源的下层传输协议模块。 SrcLoTp始终是一个。
  • <DstLoTp>:作为I-PDU目的地的低层传输协议模块。DstLoTp可以由一个到多个。
  • <Lo>:底层通信接口模块。
  • <Up>:上层模块。
  • <LoTp>:底层传输协议模块。

与其他模块的依赖

PduR模块依赖于所使用的通信硬件抽象层模块和所使用的通信服务层模块的API和功能。基本上,PDU路由器模块所需的API函数分别由一下几类模块提供:

  • 通信接口模块:
    <Lo>_Transmit (e.g. CanIf_Transmit, FrIf_Transmit, LinIf_Transmit)
    <Lo>_CancelTransmit (e.g. FrIf_CancelTransmit)
  • 传输协议模块:
    <LoTp>_Transmit (e.g. CanTp_Transmit, FrTp_Transmit, LinTp_Transmit)
    <LoTp>_CancelTransmit (e.g. CanTp_CancelTransmit, FrTp_CancelTransmit)
    <LoTp>_CancelReceive (e.g. CanTp_CancelReceive, FrTp_CancelReceive)
  • 上层使用传输协议模块的模块:
    <Up>_StartOfReception (e.g. Dcm_StartOfReception)
    <Up>_CopyRxData (e.g. Dcm_CopyRxData)
    <Up>_CopyTxData (e.g. Dcm_CopyTxData)
    <Up>_TpRxIndication (e.g. Dcm_TpRxIndication)
    <Up>_TpTxConfirmation (e.g. Dcm_TpTxConfirmation)
  • 上层使用通信接口模块的模块:
    <Up>_RxIndication (e.g. Com_RxIndication)
    <Up>_TxConfirmation (e.g. Com_TxConfirmation)
    <Up>_TriggerTransmit (e.g. Com_TriggerTransmit)

功能说明

PduR模块是一个I-PDU传输单元放置在通信接口模块和传输协议模块(下层模块)和COM和DCM(上层模块)中间的模块。从ECU角度,它可以执行一下三个类别的操作:

  • 接收I-PDU到局部模块:从一个下层模块路由到其他一个或多个上层模块。
  • 从局部模块传输:上层请求传输I-PDU到一个或多个下层。
  • 网关功能:
    • 从接口模块接收I-PDU,并经由相同或其他通信接口模块立即发送。跟上层模块没有关系。
    • 从传输协议模块接收I-PDU,并经由相同或其他传输协议模块发送I-PDU。跟上层模块没有关系。

I-PDU处理

I-PDU是由静态的I-PDU ID标识的,PduR模块使用静态配置表中的I-PDU ID来确定I-PDU的目标。I-PDU用于PduR的上层模块的数据交换,如COM模块和DCM模块。PduR的路由操作并不修改I-PDU,它只是将I-PDU转发给目标模块。在TP路由时,I-PDU的传递可以在收到完整I-PDU之前开始,即“动态网关”。而对于网络管理数据交换,可以绕过PduR模块实现。

I-PDU ID可以在路由表容器中配置,该容器还包含了是否包含处理API。这将允许在接收I-PDU ID 的每个模块中高效实现查找表(例如,PduR模块的配置包含 PduRCan_lfTxConfirmation的I-PDU ID)。

每个处理I-PDU并为I-PDU提供API的BSW模块必须包含I-PDU ID列表,这意味着每个被调用的模块将有I-PDU的查询表。COM模块调用PduR_ComTransmit (使用PduR模块列出的I-PDU ID),PduR模块将调用CanIf_Transmit(使用CanIf模块配置列出的I-PDU ID) , CanIf将调用PduR_CanIfTxConfirmation(使用PduR模块配置列出的I-PDU ID)和PduR模块将调用Com_TxConfirmation(使用COM模块配置列出的I-PDU ID)。如下图所示。

PduR模块通过源模块提供的I-PDU ID(位于PduR配置中)和目标模块I-PDU ID(位于被调用的目标模块配置中)的组合唯一的标识路由路径。PduR模块应根据I-PDU ID,将使用目标模块提供的API并传入转换后的ID。比如,COM模块将I-PDU传输给CanIf和LinIf,首先调用PduR_comtransmission,PduR模块将源IPDU ID(PDUR模块配置)转换为I-PDU ID (LinIf模块配置)和I-PDU ID(CanIf模块配置)。从COM模块接收到的PduInfoType值被复制到CanIf和LinIf模块,而不做任何更改。

如果一个传输请求中有多个下层目的模块(1:n, n>1),则所有这些模块必须是类似CanIf的通信接口模块或者类似CanTp的传输协议模块,而不是它们的混合。I-PDU在通信接口上分为三种传输方式:

  • 直接提供数据:当上层模块调用PduR_<Up>Transmit函数时,PDU Router模块将调用转发给<Lo>_Transmit函数,数据在调用中由下层通信接口模块复制。
  • 触发传输数据:下层通信接口模块通过使用I-PDU请求传输PduR_<Lo>TriggerTransmit,PduR模块将调用转发给PduR_<Up>TriggerTransmit,数据由上层模块复制。
  • 当上层模块调用PduR_<Up>Transmit函数时,PDU Router模块将调用转发给PduR_<Lo>Transmit函数,下层模块(通信接口模块)不复制数据。数据稍后将由较低的层使用卢PduR_ < > TriggerTransmit来获取。

PduR模块支持从一个源总线到一个或多个目的总线的I-PDU网关模式。这种模式与基于本地模块收发相比,PduR模块必须同时是接收器和发送器,并且在某些情况下还为I-PDU提供缓冲。
网关模式与其他的模式是分开的,以便在不需要网关的情况下高效实现PduR模块。以下列表概述了I-PDU网关的功能:

  • I-PDU可从源通信接口模块网关到一个(1:1)或多个目的通信接口模块(1:n I-PDU网关)。
    • 对于每个目的地,路由器模块可以针对I-PDU的每个目的地配置不同深度的缓冲(多I-PDU则采用FIFO)。
    • 在将I-PDU网关到n个目标通信接口的同时,上层模块也可以接收I-PDU。
  • 使用TP传输的I-PDU可网关到一个或多个目的地TP模块,其范围如下:
    • 单帧和多帧都可以网关到多个目标TP模块或本地模块(例如DCM)。
    • 由多个N-PDUs传输的I-PDU可以“on-the-fly”地网关到目的地,这意味着路由到TP模块上的I-PDU开始传输之前PduR模块不需要等待接收到完整的I-PDU。
    • 由多个N-PDUs传输的I-PDU可以网关到另一个TP模块或者由本地模块接收,而不是两者同时。
    • 使用TP模块传输的I-PDUs可以被FIFO缓冲。这适用于SF和多帧的I-PDUs。
  • I-PDU只能在通信接口模块或TP模块之间网关,而不是它们的混合。例如,不能从Canlf接收I-PDU并将其网关到LinTp。

时序图

PduR的时序图包括I-PDU接收,发送以及I-PDU的网关路由。AUTOSAR规范接收与发送两种时序图以CanIf,Frlf,LinIf以及CanTP这个四个模块为示例进行了介绍。I-PDU网关则以Can到Can,Can到FlexRay,CAN到LIN,一对一的TP模块间,以及1对多的TP间网关路由,以及单帧从CAN1接收路由到DCM与CAN2,最后从J1939Tp到DCM与LIN的多帧路由。

本篇文章就不介绍这么多模块间路由的情况了,仅介绍最常见的两种。如果只是用一些基本的功能,其实各家工具一般导入DBC文件中之后,默认生成的PduR模块的arxml配置已经足够使用了,若需要自己定制,建议使用脚本处理arxml,更快捷准确。

CanIf模块I-PDU接收

CanIf调用PduR层定义的PduR_CanIfRxIndication传递数据到PduR,然后PduR再调用Com_RxIndication将数据传递到COM,在COM将数据Copy一下,完成数据传递。


CanTp模块I-PDU接收 

下面的例子介绍的是CanTp模块到DCM模块之间的诊断协议传输,诊断的传输协议将报文分为单帧和多帧。下面的时序图突出多帧传输的数据可以多次传输,最终一个接收确认即可。


CanIf模块I-PDU发送 

下图是示例由COM发起,最后CanIf模块会通过PduR回馈发送确认信息。


CanTp模块I-PDU发送 

下图显示了使用传输协议API将I-PDU从DCM模块传输到CanTp模块。可以看到,具体的传输开始由CanTp模块控制,DCM逐步将数据一次次拷贝到CanTp。


两个CanIf之间的网关路由 

下面的例子发生在两个CAN总线间的路由,例如板卡上有两路CAN,CAN1接收数据,此时传到PduR,PduR直接调用CAN2的If层函数发出去,然后CAN2再向PduR回复一个发送好了,至此完成一次网关转发。


两个CanIf之间的网关路由,并且COM也收到报文

下图显示了如何将I-PDU从CAN1网关到CAN2并由COM模块在本地接收。


ISOLAR-AB配置 

PduR

PduRGeneral

这是PduR模块的一些通用配置容器,下面介绍一些比较难以理解的配置项:

  • PduRMetaDataSupport:启用MetaData处理支持。MetaData的大小由全局PDU定义中的配置参数MetaDataLength定义。此特性可用于高效的CAN to CAN路由,其中MetaData包含CANID。
  • PduRZeroCostOperation:一旦无法实现0开销(上下层模块一一对应),将会上报错误。
  • PduRFifoTxBufferSupport:配置参数使能或失能PduR支持FIFO作为PDU发送缓冲区。当PDUR_GATEWAY_OPERATION设置为disabled时,该参数必须设置为disabled。
  • PduRIFGatewayOperation:配置参数使能或失能从接口模块到下层接口模块的PDU Router IF Gateway功能。如果启用了PDUR_ZERO_CoST_OPERATION,则必须禁用此参数。
  • PduRMemorySize:为PduR缓冲区保留的内存大小。仅用于网关操作。
  • PduRMinimumRoutingLoModule:用于最小路由的下层模块。如果PDUR_ZERO_COST_OPERATION被禁用,则使用该参数,否则不得使用。
  • PduRMinimumRoutingUpRxPduId:用于到下层的PDU Router接口PDUR_MINIMUM_ROUTING指定的最小路由LO模块的接收PDU标识符。如果PDUR_ZERO_COST_OPERATION被禁用则使用该参数,否则不得使用。
  • PduRSbTxBufferSupport:配置参数使能或失能PduR支持单个缓冲区作为PDU发送缓冲区。如果PDUR_GATEWAY_OPERATION被禁用,该参数必须被禁用。(Sb:Signal buff)


PduRBswModules

该容器包含与PduR有交集的Bsw模块。这里默认生成了COM与DCM两个上层以及CanIf和CanTp两个下层模块,如下图所示。

下面我们着重介绍一下PduRBswModules模块中涉及的配置项:

  • PduRCommunicationInterface:指定这个模块是否支持通信接口APIs。
  • PduRLowerModule:是否是PduR的下层模块,如果配置成为真,则PduR需要实现 PduR_<module name>RxIndication供此模块使用。PduR也会调用<module name>_Transmit。
  • PduRRetransmission:定义TP是否使用重传功能,如果传输协议支持重传功能,但参数设置为False,则传输协议不会重传。
  • PduRTriggertransmit:触发传输功能,假设设置为TRUE,底层模块既可以调用下层,也可以调用上层的TriggerTransmit功能。
  • PduRTxConfirmation:发送确认,这个接口一般开着。
  • PduRUseTag:开了这个功能,假如COM使用,则使用PduR_ComCancelTransmit。使用Com替换下面两个接口的<up>。
    • PduR_<Up>CancelReceive
    • PduR_<Up>CancelTransmit
  • PduRBswModuleRef:Bsw模块的引用。


PduRRountingTabls

这个容器包含路由表信息,下图为自动生成的六个路由条目,他们的名称由报文名称+网络名称+源2目标模块构成。

点开路径,可以看到自动生成的CanIf2PduR与PduR2Com的引用,这些都是根据DBC自动生成的。


代码解析 

动态配置代码

PduR生成的动态配置代码如下图所示。

我们针对一些常用的进行说明:

  • PduR_PBcfg.c:包含了PduR_comToLo、PduR_DcmToLo与PduR_CanIfRxToUp的结构体定义,结构体包含了路由ID的对应关系。还包含了路由表等配置信息。
    /*
    ***********************************************************************************************************************
    * 
    * Product Info
    * Isolar version: ISOLAR-AB 4.0.2
    * Product release version: RTA-BSW 3.1.0
    * 
    ***********************************************************************************************************************
    *//*<VersionHead>* This Configuration File is generated using versions (automatically filled in) as listed below.** $Generator__: PduR  / AR42.4.0.1                Module Package Version* $Editor_____: 9.0                Tool Version* $Model______: 2.3.0.4                ECU Parameter Definition Version*</VersionHead>*/#include "PduR_PBcfg.h"
    #include "PduR_UpIf.h"#include "PduR_LoIf.h"
    #include "PduR_LoTp.h"#include "PduR_UpTp.h"#include "PduR_Mc.h"
    #include "PduR_Gw.h"#include "PduR_Gw_Cfg.h"
    /* Generating PbCfg_c::PduR_UpIfToLo_PBcfg_c::upIf_To_Lo *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined(PDUR_CONFIG_SINGLE_IFTX_LO)
    #define PduR_comToLo   NULL_PTR
    #else
    static CONST(PduR_RT_UpToLo,PDUR_CONST ) PduR_comToLo[] = {{ CanIfConf_CanIfTxPduCfg_DV_Test_Message_1_Can_Network_CANNODE_ECAN , (PduR_loTransmitFP)PduR_RF_CanIf_Transmit, (PduR_loCancelTransmitFP)PduR_IH_CancelTransmit },    /*DV_Test_Message_1_Can_Network_CANNODE_ECAN_Com2PduR*/{ CanIfConf_CanIfTxPduCfg_Tx_Test_Message_01_Can_Network_CANNODE_ECAN , (PduR_loTransmitFP)PduR_RF_CanIf_Transmit, (PduR_loCancelTransmitFP)PduR_IH_CancelTransmit }    /*Tx_Test_Message_01_Can_Network_CANNODE_ECAN_Com2PduR*/};
    #endif /* PDUR_CONFIG_SINGLE_IFTX_LO *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_UpTpToLo_PBcfg_c::upTp_To_Lo *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined(PDUR_CONFIG_SINGLE_TPTX_LO)
    #define PduR_DcmToLo NULL_PTR
    #else
    static CONST(PduR_RT_UpToLo,PDUR_CONST ) PduR_DcmToLo[] = {{ CanTpConf_CanTpTxNSdu_CanTpTxNSdu, (PduR_loTransmitFP)PduR_RF_CanTp_Transmit, (PduR_loCancelTransmitFP)PduR_RF_CanTp_CancelTransmit }    /*Diag_VCU_Resp_Can_Network_CANNODE_ECAN_Phys_Dcm2PduR*/};
    #endif /* PDUR_CONFIG_SINGLE_IFTX_LO *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_LoIfRxToUp_PBcfg_c::loIfRx_To_Up *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined(PDUR_CONFIG_SINGLE_IFRX)
    #define PduR_CanIfRxToUp   NULL_PTR
    #else
    static CONST( PduR_RT_LoIfRxToUp, PDUR_CONST ) PduR_CanIfRxToUp[] = {        { ComConf_ComIPdu_Rx_Test_Message_01_Can_Network_CANNODE_ECAN, (PduR_upIfRxIndicationFP) PduR_RF_Com_RxIndication }    /*Rx_Test_Message_01_Can_Network_CANNODE_ECAN_CanIf2PduR*/};
    #endif  /* PDUR_CONFIG_SINGLE_IFRX *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_LoIfDTxToUp_PBcfg_c::loIf_DTxToUp *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined(PDUR_CONFIG_SINGLE_IFTX_UP )
    #define PduR_CanIfTxToUp NULL_PTR
    #elsestatic CONST(PduR_RT_LoIfTxToUp, PDUR_CONST ) PduR_CanIfTxToUp [] = { 
    { ComConf_ComIPdu_DV_Test_Message_1_Can_Network_CANNODE_ECAN , (PduR_upIfTxConfirmationFP) PduR_RF_Com_TxConfirmation} ,   /* Index: 0  SrcPdu: DV_Test_Message_1_Can_Network_CANNODE_ECAN_Com2PduR  DestPdu: DV_Test_Message_1_Can_Network_CANNODE_ECAN_PduR2CanIf*/
    { ComConf_ComIPdu_Tx_Test_Message_01_Can_Network_CANNODE_ECAN , (PduR_upIfTxConfirmationFP) PduR_RF_Com_TxConfirmation}     /* Index: 1  SrcPdu: Tx_Test_Message_01_Can_Network_CANNODE_ECAN_Com2PduR  DestPdu: Tx_Test_Message_01_Can_Network_CANNODE_ECAN_PduR2CanIf*/
    };
    #endif  /* PDUR_CONFIG_SINGLE_IFTX_UP *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_LoIfTTxToUp_PBcfg_c::loIf_TTxToUp *//* Generating PbCfg_c::PduR_LoTpRxToUp_PBcfg_c::loTpRx_To_Up *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined ( PDUR_CONFIG_SINGLE_TPRX )
    #define PduR_CanTpRxToUp   NULL_PTR
    #else
    static CONST( PduR_RT_LoTpRxToUp, PDUR_CONST ) PduR_CanTpRxToUp[] = {{DcmConf_DcmDslProtocolRx_Diag_ECAN_ReqFunc_Can_Network_CANNODE_ECAN_PduR2Dcm, (PduR_upTpStartOfReceptionFP) PduR_RF_Dcm_StartOfReception,(PduR_upTpProvideRxBufFP) PduR_RF_Dcm_CopyRxData,(PduR_upTpRxIndicationFP) PduR_RF_Dcm_TpRxIndication },   /*Diag_ECAN_ReqFunc_Can_Network_CANNODE_ECAN_CanTp2PduR*/{DcmConf_DcmDslProtocolRx_Diag_VCU_ReqPhsy_Can_Network_CANNODE_ECAN_PduR2Dcm, (PduR_upTpStartOfReceptionFP) PduR_RF_Dcm_StartOfReception,(PduR_upTpProvideRxBufFP) PduR_RF_Dcm_CopyRxData,(PduR_upTpRxIndicationFP) PduR_RF_Dcm_TpRxIndication }    /*Diag_VCU_ReqPhsy_Can_Network_CANNODE_ECAN_CanTp2PduR*/
    };
    #endif  /* PDUR_CONFIG_SINGLE_TPRX *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_LoTpTxToUp_PBcfg_c::loTpTx_To_Up *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    #if defined(PDUR_CONFIG_SINGLE_TPTX_UP )
    #define PduR_CanTpTxToUp NULL_PTR
    #else
    static CONST(PduR_RT_LoTpTxToUp, PDUR_CONST ) PduR_CanTpTxToUp [] = {  { DcmConf_DcmDslProtocolTx_Diag_VCU_Resp_Can_Network_CANNODE_ECAN_Phys_Dcm2PduR, (PduR_upTpProvideTxBufFP) PduR_RF_Dcm_CopyTxData,(PduR_upTpTxConfirmationFP) PduR_RF_Dcm_TpTxConfirmation }    /*Index: 0 Diag_VCU_Resp_Can_Network_CANNODE_ECAN_Phys_Dcm2PduR*/
    };
    #endif  /* PDUR_CONFIG_SINGLE_TPTX_UP *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* Generating PbCfg_c::PduR_Mc_ComToLo_PBcfg_c::mcComToLow */
    /* Generating PbCfg_c::PduR_Mc_DcmToLo_PBcfg_c::mcDcmToLow */
    /* Generating PbCfg_c::PduR_Mc_IpduMToLo_PBcfg_c::MC_IpduMUp_Lo */
    /* Generating PbCfg_c::PduR_Mc_TpTxToUp_PBcfg_c::xpandMcTpTxToUp */
    /* Generating PbCfg_c::PduR_Cdd_PBcfg_c::Xpand_Cdd_body */
    /* Generating PbCfg_c::PduR_Mc_GwToLo_PBcfg_c::DisplayPduR_mcGwToLo */
    /* Generating PbCfg_c::PduR_GwIfTx_PBcfg_c::display_GwIfTx */
    /* Generating PbCfg_c::PduR_GwIf_PBcfg_c::display_GwIf */
    /* Generating PbCfg_c::PduR_Gw_IfBuf_PBcfg_c::PduR_gw_Buf_If_structure */
    /* Generating PbCfg_c::PduR_Rpg_PBcfg_c::display_PduR_RPG*/#if defined(PDUR_MODE_DEPENDENT_ROUTING) && (PDUR_MODE_DEPENDENT_ROUTING != 0)/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"static CONST (PduR_RPGInfoType, PDUR_CONST) PduR_RPGInfo[] = {{NULL_PTR,PDUR_RPGID_NULL,0},   /* PDUR_RPGID_NULL */};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_8
    #include "PduR_MemMap.h"
    /* Routing enable disbale flag to control routing. */
    CONST(boolean, PDUR_CONST) PduR_RPG_EnRouting[] =
    {TRUE, /*PDUR_RPGID_NULL*/};/* ------------------------------------------------------------------------ */
    /* End section for constants */
    #define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_8
    #include "PduR_MemMap.h"#endif /* #if defined(PDUR_MODE_DEPENDENT_ROUTING) && (PDUR_MODE_DEPENDENT_ROUTING != 0) *//* Generating PbCfg_c::PduR_Gw_TpBuf_PBcfg_c::PduR_gw_Buf_TP_structure*//* Generating PbCfg_c::PduR_GwTp_PBcfg_c::display_GwTp *//* Generating PbCfg_c::PduR_PbConfigType_PBcfg_c::PduR_BswLoCfg *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    static CONST( PduR_LoTpConfig, PDUR_CONST ) PduR_LoTpCfg[] = {{PduR_CanTpRxToUp,       /* CanTp */PduR_CanTpTxToUp,       /* CanTp */2,        /* CanTp RxToUp Number Of Entries*/1     /* CanTp TxToUp Number Of Entries*/}};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    static CONST( PduR_LoIfDConfig, PDUR_CONST ) PduR_LoIfDCfg[] = {{PduR_CanIfRxToUp,       /* CanIf */PduR_CanIfTxToUp,       /* CanIf */1,        /* CanIf RxToUp NrEntries*/2      /* CanIf TxToUp NrEntries*/}};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    /* Generating PbCfg_c::PduR_PbConfigType_PBcfg_c::PduR_BswUpCfg *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    static CONST( PduR_UpConfig, PDUR_CONST ) PduR_UpTpCfg[] = {{PduR_DcmToLo,     /* Dcm */NULL_PTR,       /* mcDcmToLo */1      /* Dcm */}};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    static CONST( PduR_UpConfig, PDUR_CONST ) PduR_UpIfCfg[] = {{PduR_comToLo,     /* Com */NULL_PTR,       /* mcComToLo */2      /* Com */}};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    /* Generating PbCfg_c::PduR_Cdd_PBcfg_c::PduR_CddCfg */
    /* Generating PbCfg_c::PduR_PbConfigType_PBcfg_c::PduR_BswUpToLoRxCfg *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"CONST( PduR_RPTablesType, PDUR_CONST ) PduR_RoutingPathTables = {(P2CONST( PduR_loTransmitFuncType, AUTOMATIC, PDUR_CONST ))             PduR_loTransmitTable,(P2CONST( PduR_loCancelReceiveFuncType, AUTOMATIC,  PDUR_CONST))        PduR_loCancelRxTable,(P2CONST( PduR_loCancelTransmitFuncType, AUTOMATIC, PDUR_CONST ))       PduR_loCancelTransmitTable,(P2CONST( PduR_upIfRxIndicationFuncType, AUTOMATIC, PDUR_CONST ))       PduR_upIfRxIndicationTable,(P2CONST( PduR_upIfTxConfirmationFuncType, AUTOMATIC, PDUR_CONST ))     PduR_upIfTxConfirmationTable,(P2CONST( PduR_upTpCopyRxDataFuncType, AUTOMATIC, PDUR_CONST ))         PduR_upTpCopyRxDataTable,(P2CONST( PduR_upTpStartOfReceptionFuncType, AUTOMATIC, PDUR_CONST ))   PduR_upTpStartOfReceptionTable,(P2CONST( PduR_upTpRxIndicationFuncType, AUTOMATIC, PDUR_CONST ))       PduR_upTpRxIndicationTable,(P2CONST( PduR_upTpCopyTxDataFuncType, AUTOMATIC, PDUR_CONST ))         PduR_upTpCopyTxDataTable,(P2CONST( PduR_upTpTxConfirmationFuncType, AUTOMATIC, PDUR_CONST ))     PduR_upTpTxConfirmationTable,(P2CONST( PduR_upIfTriggerTxFuncType, AUTOMATIC, PDUR_CONST ))          PduR_upIfTriggerTxTable};/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"/*These structures are generated by the code generator tool. Respective module's function names are generatedonly if it is present in the PduR_PbCfg.c file in any one of the entries.
    *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"CONST(PduR_loTransmitFuncType, PDUR_CONST) PduR_loTransmitTable[] =
    {{&PduR_RF_CanIf_Transmit_Func},{&PduR_RF_CanTp_Transmit_Func}
    };CONST(PduR_loCancelReceiveFuncType, PDUR_CONST) PduR_loCancelRxTable[] =
    {{NULL_PTR}
    };CONST(PduR_loCancelTransmitFuncType, PDUR_CONST) PduR_loCancelTransmitTable[] =
    {{&PduR_IH_CancelTransmit_Func},{&PduR_RF_CanTp_CancelTransmit_Func}
    };CONST(PduR_upIfRxIndicationFuncType, PDUR_CONST) PduR_upIfRxIndicationTable[] =
    {{&PduR_RF_Com_RxIndication_Func}
    };CONST(PduR_upIfTxConfirmationFuncType, PDUR_CONST) PduR_upIfTxConfirmationTable[] =
    {{&PduR_RF_Com_TxConfirmation_Func}
    };CONST(PduR_upIfTriggerTxFuncType, PDUR_CONST) PduR_upIfTriggerTxTable[] =
    {{NULL_PTR}
    };CONST(PduR_upTpCopyRxDataFuncType, PDUR_CONST) PduR_upTpCopyRxDataTable[] =
    {{&PduR_RF_Dcm_CopyRxData_Func}
    };CONST(PduR_upTpStartOfReceptionFuncType, PDUR_CONST) PduR_upTpStartOfReceptionTable[] =
    {{&PduR_RF_Dcm_StartOfReception_Func}
    };CONST(PduR_upTpRxIndicationFuncType, PDUR_CONST) PduR_upTpRxIndicationTable[] =
    {{&PduR_RF_Dcm_TpRxIndication_Func}
    };CONST(PduR_upTpCopyTxDataFuncType, PDUR_CONST) PduR_upTpCopyTxDataTable[] =
    {{&PduR_RF_Dcm_CopyTxData_Func}
    };CONST(PduR_upTpTxConfirmationFuncType, PDUR_CONST) PduR_upTpTxConfirmationTable[] =
    {{&PduR_RF_Dcm_TpTxConfirmation_Func}
    };/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    /* Generating PbCfg_c::PduR_PbConfigType_PBcfg_c::pdur_PBConfigType *//* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    CONST( PduR_PBConfigType, PDUR_CONST ) PduR_GlobalPBConfig = {(P2CONST( PduR_CddConfig, AUTOMATIC, PDUR_CONST )) NULL_PTR,                /* PduR_CddCfg */(P2CONST( PduR_LoTpConfig, AUTOMATIC, PDUR_CONST )) PduR_LoTpCfg,           /* Pointer to lowerlayer Tp config structure */(P2CONST( PduR_LoIfDConfig, AUTOMATIC, PDUR_CONST )) PduR_LoIfDCfg,         /* Pointer to Direct lowerlayer If config structure */(P2CONST( PduR_LoIfTTConfig, AUTOMATIC, PDUR_CONST )) NULL_PTR,             /* PduR_LoIfTTCfg */(P2CONST( PduR_UpConfig, AUTOMATIC, PDUR_CONST )) PduR_UpIfCfg,             /* Pointer to Upperlayer If config structure */(P2CONST( PduR_UpConfig, AUTOMATIC, PDUR_CONST )) PduR_UpTpCfg,             /* Pointer to Upperlayer Tp config structure */(P2CONST( PduR_MT_UpToLo, AUTOMATIC, PDUR_CONST )) NULL_PTR,                /* mcGwToLo */(P2CONST( PduR_MT_LoIfTxToUp, AUTOMATIC, PDUR_CONST )) NULL_PTR,            /* McIfRx */(P2CONST( PduR_MT_LoTpTxToUp, AUTOMATIC, PDUR_CONST )) NULL_PTR,            /* McTpTx */(P2VAR(   PduR_MS_LoTpTxToUp, AUTOMATIC, PDUR_VAR )) NULL_PTR,              /* PduR_msTpTxToUp*/(P2CONST( PduR_GT_IfTx, AUTOMATIC, PDUR_CONST )) NULL_PTR,                  /* gwIfTx */(P2CONST( PduR_GT_If, AUTOMATIC, PDUR_CONST )) NULL_PTR,                    /* gwIf        */(P2CONST( PduR_GT_Tp, AUTOMATIC, PDUR_CONST )) NULL_PTR,                    /* GwTp */(P2CONST( PduR_RPTablesType, AUTOMATIC, PDUR_CONST )) &PduR_RoutingPathTables, /* PduR_RoutingPathTables */
    #if defined(PDUR_TPGATEWAY_SUPPORT) && (PDUR_TPGATEWAY_SUPPORT != STD_OFF)(P2CONST(PduR_GwTp_SessionListType, AUTOMATIC, PDUR_CONST )) NULL_PTR, /*PduR_TpSession_Dynamic*/
    #endif
    #if defined(PDUR_MULTICAST_TO_IF_SUPPORT) && (PDUR_MULTICAST_TO_IF_SUPPORT != 0)(P2CONST(PduR_UpIfTxConf_Config, AUTOMATIC, PDUR_CONST)) PduR_UpIfTxConf_ConfigList,
    #endif
    #if defined(PDUR_MODE_DEPENDENT_ROUTING) && (PDUR_MODE_DEPENDENT_ROUTING != 0)(P2CONST (PduR_RPGInfoType, AUTOMATIC, PDUR_CONST))        PduR_RPGInfo,        /* RoutingPathGroup ConfigInfo */(P2CONST (boolean, AUTOMATIC, PDUR_CONST))   PduR_RPG_EnRouting,  /* RoutingControl StatusInfo */(P2VAR  (boolean , TYPEDEF , PDUR_VAR))  PduR_RPG_Status,        /*RAM status for each RPG*/(PduR_RoutingPathGroupIdType)                              0,        /* Number of RPGs.*/
    #endif(P2CONST (PduR_UpTpToLoTpRxConfig, TYPEDEF, PDUR_CONST)) NULL_PTR,          /* Pointer to PduR_UpTpToLoTpRxConfig structure for supporting Cancel Receive API */
    0,                  /* PDUR_CONFIGURATION_ID */
    0, /*Total no of Gw Tp Routing Path*/
    0, /*Total no of Gw If Routing path*/(PduIdType) 0       /* McTpTx */
    };/* ------------------------------------------------------------------------ */
    /* Begin section for constants */#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"#define PDUR_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
    CONST(PduR_ConfigType, PDUR_CONST) PduR_Config = {NULL_PTR,    /* Void pointer initialised with null pointer as PduR_Config will not be used in case of PDUR_VARIANT_PRE_COMPILE */NULL_PTR
    };#define PDUR_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED
    #include "PduR_MemMap.h"
  • PduR_Upxx.c:包含上层接口定义,由上层模块调用,最终调用PduR_xx_Lo中映射的接口。
    /*
    ***********************************************************************************************************************
    * 
    * Product Info
    * Isolar version: ISOLAR-AB 4.0.2
    * Product release version: RTA-BSW 3.1.0
    * 
    ***********************************************************************************************************************
    *//*<VersionHead>* This Configuration File is generated using versions (automatically filled in) as listed below.** $Generator__: PduR  / AR42.4.0.1                Module Package Version* $Editor_____: 9.0                Tool Version* $Model______: 2.3.0.4                ECU Parameter Definition Version*</VersionHead>*/#include "PduR_Prv.h"
    /* Appropriate header files are included to declare the prototypes*/
    #include "PduR_UpIf.h"#if defined(PDUR_MULTICAST_TO_IF_SUPPORT) && (PDUR_MULTICAST_TO_IF_SUPPORT == 1)
    #include "PduR_Mc.h"
    #endif/* ------------------------------------------------------------------------ */
    /* Begin section for code */#define PDUR_START_SEC_CODE
    #include "PduR_MemMap.h"/***************************************************************************************************** PduR_ComTransmit*      This function is called by the COM to request a transmission.** \param           PduIdType id: ID of COM I-PDU to be transmitted.*                  P2CONST( PduInfoType, TYPEDEF, PDUR_APPL_DATA ) ptr: Pointer to a structure with I-PDU related data that shall be transmitted:*                                         data length and pointer to I-SDU buffer** \retval          E_OK Transmit request has been accepted*                  E_NOT_OK Transmit request has not been accepted** \seealso         PDUR202, PDUR206* \usedresources***************************************************************************************************/FUNC( Std_ReturnType, PDUR_CODE ) PduR_ComTransmit( VAR(PduIdType, AUTOMATIC) id, P2CONST( PduInfoType, TYPEDEF, PDUR_APPL_DATA ) ptr)
    {return ((Std_ReturnType)PduR_rComTransmit( (id) , (ptr)));
    }/* ------------------------------------------------------------------------ */
    /* End section for code */
    #define PDUR_STOP_SEC_CODE
    #include "PduR_MemMap.h"
  • PduR_Loxx.c:包含下层接口定义,由下层模块调用,最终调用PduR_xx_Up中映射的接口。
  • PduR_CanTp_Lo.h/PduR_CanIf_Lo.h:包含根据ID区分的不同配置下的CanIf与CanTp接口实体。
    /*
    ***********************************************************************************************************************
    * 
    * Product Info
    * Isolar version: ISOLAR-AB 4.0.2
    * Product release version: RTA-BSW 3.1.0
    * 
    ***********************************************************************************************************************
    */#ifndef PDUR_CANIF_LO_H
    #define PDUR_CANIF_LO_H#include "PduR_Prv.h"/* Ensure that the function declarations in this header are located in the code section. */
    #define PDUR_START_SEC_CODE
    #include "PduR_MemMap.h"/* ------------------------------------------------------------------- */#define PduR_CanIf_upIfRxIndicationFuncId(id)       (PDUR_CANIF_RXIND_BASE[(id)].upRxIndicationID)/* ------------------------------------------------------------------- */
    #if defined(PDUR_CONFIG_SINGLE_IFRX)
    #define PduR_iCanIfRxIndicationID(id)        (id)
    #define PduR_iCanIfRxIndicationFunc(id)        (PDUR_CONFIG_SINGLE_IFRX(RxIndication))
    #else
    #define PduR_iCanIfRxIndicationID(id)        (PDUR_CANIF_RXIND_BASE[(id)].upId)
    #define PduR_iCanIfRxIndicationFunc(id)        (PduR_upIfRxIndicationTable[(PDUR_CANIF_RXIND_BASE[(id)].upRxIndicationID)].PduR_upIfRxIndicationFunc)#endif /* PDUR_CONFIG_SINGLE_IFRX */#if defined(PDUR_DEV_ERROR_DETECT) && (PDUR_DEV_ERROR_DETECT != STD_OFF)
    #define PduR_aCanIfRxIndication(id, ptr)     PduR_dCanIfRxIndication((id), (ptr))
    #else
    #define PduR_aCanIfRxIndication(id, ptr)     PduR_iCanIfRxIndicationFunc(id)(PduR_iCanIfRxIndicationID(id), (ptr))
    #endif /* PDUR_DEV_ERROR_DETECT */#define PduR_rCanIfRxIndication(id, ptr)      PduR_aCanIfRxIndication((id), (ptr))/* ------------------------------------------------------------------- */#if defined(PDUR_CONFIG_SINGLE_IFTX_UP)
    #define PduR_iCanIfTxConfirmationID(id)      (id)
    #define PduR_iCanIfTxConfirmationFunc(id)      (PDUR_CONFIG_SINGLE_IFTX_UP(TxConfirmation))
    #else
    #define PduR_iCanIfTxConfirmationID(id)      (PDUR_CANIF_TXCONF_BASE[(id)].upId)
    #define PduR_iCanIfTxConfirmationFunc(id)    (PduR_upIfTxConfirmationTable[(PDUR_CANIF_TXCONF_BASE[(id)].upTxConfirmationID)].PduR_upIfTxConfirmationFunc)#endif#if defined(PDUR_DEV_ERROR_DETECT) && (PDUR_DEV_ERROR_DETECT != STD_OFF)
    #define PduR_aCanIfTxConfirmation(id)        PduR_dCanIfTxConfirmation(id)
    #else
    #define PduR_aCanIfTxConfirmation(id)        PduR_iCanIfTxConfirmationFunc(id)(PduR_iCanIfTxConfirmationID(id))
    #endif /* PDUR_DEV_ERROR_DETECT */#define PduR_rCanIfTxConfirmation(id)         PduR_aCanIfTxConfirmation(id)/* Invalid PDU id handlers ------------------------------------------ */
    #define PDUR_IH_CanIfRx_RxIndication_Func     PDUR_DET_API(PduR_invId_IfRxIndication)
    #define PDUR_IH_CanIfTx_TxConfirmation_Func   PDUR_DET_API(PduR_invId_IfTxConfirmation)/* Anything after this point will not be placed in the code section. */
    #define PDUR_STOP_SEC_CODE
    #include "PduR_MemMap.h"#endif /* PDUR_CANIF_LO_H */
  • PduR_Com_Up.h/PduR_Com_Up.h:包含根据ID区分的不同配置下的DCM与COM接口实体。
  • PduR_CanIf.h/PduR_CanTp.h:包含CanIf与CanTp直接使用的接口原型。
    /*
    ***********************************************************************************************************************
    * 
    * Product Info
    * Isolar version: ISOLAR-AB 4.0.2
    * Product release version: RTA-BSW 3.1.0
    * 
    ***********************************************************************************************************************
    */#ifndef PDUR_CANIF_H
    #define PDUR_CANIF_H#include "PduR.h"#include "CanIf.h"
    #if (!defined(CANIF_AR_RELEASE_MAJOR_VERSION) || (CANIF_AR_RELEASE_MAJOR_VERSION != PDUR_AR_RELEASE_MAJOR_VERSION))
    #error "AUTOSAR major version undefined or mismatched"
    #endif
    #if (!defined(CANIF_AR_RELEASE_MINOR_VERSION) || (CANIF_AR_RELEASE_MINOR_VERSION != PDUR_AR_RELEASE_MINOR_VERSION))
    #error "AUTOSAR minor version undefined or mismatched"
    #endif/* Interface translation layers ------------------------------------- */
    #define PduR_RF_CanIf_Transmit_Func   CanIf_Transmit/* PduR_CanIfRxIndication  */
    extern FUNC( void, PDUR_CODE ) PduR_CanIfRxIndication( VAR(PduIdType, AUTOMATIC) id,P2CONST( PduInfoType, TYPEDEF, PDUR_APPL_DATA ) ptr );
    /* PduR_CanIfTxConfirmation  */
    extern FUNC( void, PDUR_CODE ) PduR_CanIfTxConfirmation(VAR(PduIdType, AUTOMATIC) id);#endif /* PDUR_CANIF_H    */
    
  • PduR_Com.h/PduR_Dcm.h:包含DCM与COM直接使用的接口原型。
  • PduR_Cfg_Internal.h:内部使用的配置符号值。
  • PduR_Cfg_SymbolicNames.h:外部使用的符号值。
    /*
    ***********************************************************************************************************************
    * 
    * Product Info
    * Isolar version: ISOLAR-AB 4.0.2
    * Product release version: RTA-BSW 3.1.0
    * 
    ***********************************************************************************************************************
    *//*<VersionHead>* This Configuration File is generated using versions (automatically filled in) as listed below.** $Generator__: PduR  / AR42.4.0.1                Module Package Version* $Editor_____: 9.0                Tool Version* $Model______: 2.3.0.4                ECU Parameter Definition Version*</VersionHead>*/#ifndef PDUR_CFG_SYMBOLICNAMES_H
    #define PDUR_CFG_SYMBOLICNAMES_H/* Note: Module variant generation is done here, specifically to make below macros available on the inclusion of * PduR_memmap.h header file by other modules without PduR_Cfg.h inclusion */#define PDUR_VARIANT_PRE_COMPILE    (0)#define PDUR_VARIANT_POSTBUILD_LOADABLE    (1)#if !defined(PDUR_CONFIGURATION_VARIANT)
    #define PDUR_CONFIGURATION_VARIANT    PDUR_VARIANT_PRE_COMPILE
    #endif /* PDUR_CONFIGURATION_VARIANT *//* For PduRRoutingTable: Symbolic Name reference are generated for Tx Paths and Rx paths
    For TxPaths:
    PduRConf_PduRSrcPdu_<shortname of PduRSrcPdu> will be used by module which gives PduR_<UpperLayer>Transmit request e.g Com,Dcm,Up-Cdd
    PduRConf_PduRDestPdu_<shortname of PduRDestPdu> will be used by module which gives PduR_<LowerLayer>TxConfirmation callback e.g CanIf,CanTp,Low-CddFor RxPaths:
    PduRConf_PduRSrcPdu_<shortname of PduRSrcPdu> will be used by module which gives PduR_<LowerLayer>RxIndication callback e.g CanIf,CanTp,Low-Cdd */#define PduRConf_PduRSrcPdu_DV_Test_Message_1_Can_Network_CANNODE_ECAN_Com2PduR    0
    #define PduRConf_PduRDestPdu_DV_Test_Message_1_Can_Network_CANNODE_ECAN_PduR2CanIf  0#define PduRConf_PduRSrcPdu_Diag_ECAN_ReqFunc_Can_Network_CANNODE_ECAN_CanTp2PduR    0
    #define PduRConf_PduRDestPdu_Diag_ECAN_ReqFunc_Can_Network_CANNODE_ECAN_PduR2Dcm  0#define PduRConf_PduRSrcPdu_Diag_VCU_ReqPhsy_Can_Network_CANNODE_ECAN_CanTp2PduR    1
    #define PduRConf_PduRDestPdu_Diag_VCU_ReqPhsy_Can_Network_CANNODE_ECAN_PduR2Dcm  1#define PduRConf_PduRSrcPdu_Diag_VCU_Resp_Can_Network_CANNODE_ECAN_Phys_Dcm2PduR    0
    #define PduRConf_PduRDestPdu_Diag_VCU_Resp_Can_Network_CANNODE_ECAN_Phys_PduR2CanTp  0#define PduRConf_PduRSrcPdu_Rx_Test_Message_01_Can_Network_CANNODE_ECAN_CanIf2PduR    0#define PduRConf_PduRSrcPdu_Tx_Test_Message_01_Can_Network_CANNODE_ECAN_Com2PduR    1
    #define PduRConf_PduRDestPdu_Tx_Test_Message_01_Can_Network_CANNODE_ECAN_PduR2CanIf  1#endif /* PDUR_CFG_SYMBOLICNAMES_H */
    

集成代码 

MemMap与SchM等就不在这里赘述了。


静态代码

主要介绍常见的静态代码涉及API说明,具体详细完整的介绍读者可以参考《AUTOSAR_SWS_PDURouter.pdf》以及《RTA-BSWReferenceGuide.pdf》。

  • PduR_Init:完成PduR模块初始化,注意在接口模块使用之前初始化PduR模块。
  • PduR_<User:Up>Transmit:用于与上层模块交互的可配置接口定义(接口名称根据配置生成),请求发送动作。
  • PduR_<User:Up>CancelTransmit:用于与上层模块交互的可配置接口定义(接口名称根据配置生成),取消发送动作。
  • PduR_<User:Lo>RxIndication:用于与底层通信模块交互的可配置接口定义(接口名称根据配置生成),接收通知函数。
  • PduR_<User:Lo>TxConfirmation:用于与底层通信模块交互的可配置接口定义(接口名称根据配置生成),发送确认函数。
  • PduR_<User:LoTp>CopyRxData:用于与底层传输协议模块交互的可配置接口定义(接口名称根据配置生成),拷贝接收数据。
  • PduR_<User:LoTp>RxIndication:用于与底层传输协议模块交互的可配置接口定义(接口名称根据配置生成),接收通知函数。
  • PduR_<User:LoTp>StartOfReception:用于与底层传输协议模块交互的可配置接口定义(接口名称根据配置生成),启动接收函数。
  • PduR_<User:LoTp>CopyTxData:用于与底层传输协议模块交互的可配置接口定义(接口名称根据配置生成),拷贝发送数据。
  • PduR_<User:LoTp>TxConfirmation:用于与底层传输协议模块交互的可配置接口定义(接口名称根据配置生成),发送数据确认。

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

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

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

相关文章

VSCode连接本地的虚拟机的一遍过步骤

一. 首先要在虚拟机的Linux上安装 openssh-server 1. 安装 sudo apt-get remove openssh-server # 先卸载&#xff0c;无论咋样都先做一下&#xff0c;以免出现问题 sudo apt-get install openssh-server # 安装 sudo service ssh --full-restart # 重启ssh 服务…

Flutter 获取手机传感器数据

前言 在Flutter中可以使用sensors_plus插件来访问加速度计、陀螺仪、磁力计以及气压传感器 sensors_plue的平台支持 平台 是否支持 Android✅iOS✅MacOS❌Web✅Linux❌Windows❌ sensors_plue的要求 Flutter >3.19.0Dart >3.3.0 <4.0.0iOS >12.0MacOS >10.…

JVM 内存区域 堆

堆是JVM中相当核心的内容&#xff0c;因为堆是JVM中管理的最大一块内存区域&#xff0c;大部分的GC也发生在堆区&#xff0c;那接下来就让深入地探究一下JVM中的堆结构。 需要明确&#xff0c;一个JVM实例只存在一个堆内存&#xff0c;堆区在JVM启动的时候就被创建&#xff0c…

成都睿明智科技有限公司共创抖音电商新篇章

在当今这个数字化浪潮汹涌的时代&#xff0c;抖音电商以其独特的魅力迅速崛起&#xff0c;成为众多商家竞相追逐的新蓝海。在这片充满机遇与挑战的领域中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和敏锐的市场洞察力&#xff0c;成为了众多商家信赖的合…

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis&#xff1f; ‌Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统&#xff0c;支持网络、可基于内存亦可持久化。‌ 它提…

uni-app关闭底部系统导航栏的控制按钮BUG

描述 plus.navigator.hideSystemNavigation(); 在uni-app中使用 plus.navigator.hideSystemNavigation(); 关闭导航栏时会出bug会留下一个黑框。这个bug基于手机&#xff1b; 平板的性能来决定出bug频率原因是&#xff1a;过早启用霸屏导致的&#xff08;过早使用plus.navig…

JVM 调优篇10 使用arthas排优

一 Arthas的作用 1.1 作用 1. 这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception&#xff1f; 2.是否有一个全局视角来查看系统的运行状况&#xff1f; 3. 有什么办法可以监控到JVM的实时运行状态&#xff1f; 4. 怎么快速定位应用的热点&#x…

Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质)

Cesium 实战 - 自定义纹理材质 - 立体墙(旋转材质) 核心代码完整代码在线示例Cesium 给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求; 但是作为 WebGL 引擎,肯定不够丰富,尤其是动态效果样式。 对于实体对象(Entity),可以通过自定义材质,实现各种…

CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR

这期我们看一个超表面极化分析&#xff0c;用到Floquet端口模数&#xff0c;S参数读出极化和轴比&#xff0c;还有平面波散射截面等技巧。 使用模板&#xff0c;频率0-25GHz&#xff0c;电场监视器8.06GHz: 画一片PEC&#xff1a; 画第二片PEC&#xff0c;insert到第一片里面&…

python爬虫,爬取网页壁纸图片

python爬虫实战&#xff0c;爬取网页壁纸图片 使用python爬取壁纸图片&#xff0c;保存到本地。 爬取彼岸图网&#xff0c;网站地址https://pic.netbian.com/ 本人小白&#xff0c;记录一下学习过程。 开始前的准备 安装python环境&#xff0c;略。 python编辑器pycharm2…

自动化检查网页的TDK,python+selenium自动化测试web的网页源代码中的title,Description,Keywords

首先&#xff0c;TDK是什么&#xff1f;对于新手小白来说&#xff0c;可能是懵逼的&#xff0c;所以这里给出一个官方的解说‌网页的TDK是指标题&#xff08;Title&#xff09;、描述&#xff08;Description&#xff09;和关键词&#xff08;Keywords&#xff09;的集合‌。这…

大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Blazor Web APP学习记录

目录 1 呈现模式1.1 静态SSR1.2 服务器端交互SSR1.3 客户端交互CSR1.4 自动交互式1.5 注意 2 Blazor Web APP项目3 会话状态3.1 Blazor Server会话状态保存3.2 Blazor WebAssembly 会话状态保存 1 呈现模式 参见&#xff1a;https://learn.microsoft.com/zh-cn/aspnet/core/bl…

Golang | Leetcode Golang题解之第474题一和零

题目&#xff1a; 题解&#xff1a; func findMaxForm(strs []string, m, n int) int {dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for _, s : range strs {zeros : strings.Count(s, "0")ones : len(s) - zerosfor j : m; j > zeros; j--…

点评项目-7-缓存击穿的两种解决方案、缓存工具类的编写

缓存击穿 在高并发访问的访问中&#xff0c;对于复杂业务 key 的缓存&#xff0c;可能会在缓存生效前打入大量的请求&#xff0c;导致大量的请求打到数据库 解决方案&#xff1a; 1.互斥锁&#xff0c;给缓存的构建过程加上一个锁&#xff0c;当拿到锁时才进行下一步&#x…

【Boss直聘-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

线性自抗扰控制(LADRC)系统算法框图

非线性ADRC(NLADRC)详细算法框图和源代码请参考专栏系列文章,常用链接如下: 1、NLADRC自抗扰控制 NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-CSDN博客文章浏览阅读1.6k次,点赞2次,收藏7次。本文介绍了如何将ADRC自抗扰控制算法从Simulink…

牛只行为及种类识别数据集18g牛只数据,适用于多种图像识别,目标检测,区域入侵检测等算法作为数据集。数据集中包括牛只行走,站立,进食,饮水等不同类型的数据

18g牛只数据&#xff0c;适用于多种图像识别&#xff0c;目标检测&#xff0c;区域入侵检测等算法作为数据集。 数据集中包括牛只行走&#xff0c;站立&#xff0c;进食&#xff0c;饮水等不同类型的数据&#xff0c;可以用于行为检测 数据集中包含多种不同种类的牛只&#xff…

【MATLAB源码-第249期】基于matlab的信道量化反馈的预编码仿真,采用均匀量化方式和LDL分解的预编码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于信道量化反馈的预编码技术是当今无线通信系统中的一个核心研究方向。随着多输入多输出&#xff08;MIMO&#xff09;系统的广泛应用&#xff0c;如何有效地利用信道状态信息&#xff08;CSI&#xff09;进行预编码成为提…

用自己的数据集复现YOLOv5

yolov5已经出了很多版本了&#xff0c;这里我以目前最新的版本为例&#xff0c;先在官网下载源码&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 然后下载预训练模型&#xff0c;需要哪个就点击哪个模型就行&am…