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

news2024/11/22 22:21:42

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

PduR模块的位置处于通信栈的中心位置,用于上层COM或者DCM等内部模块与下层通信接口模块CanIf、LinIf或者传输协议模块LinTp,CanTp之间的报文转发。具体的转发规则是根据DBC中相关网络节点的报文收发关系与导入时选择的报文类型自动生成路由表来的。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
    #else
    
    static 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 generated
        only 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-Cdd
    
    For 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.coloradmin.cn/o/2198243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python学习日记-42] Python 中的生成器

[Python学习日记-42] Python 中的生成器 简介 表达式生成器 函数生成器 用生成器实现并发编程 简介 Python 中的生成器&#xff08;Generator&#xff09;是一种特殊的迭代器&#xff0c;它又被成为惰性运算&#xff0c;它可以在迭代过程中动态生成值&#xff0c;而不需要事…

HTML CSS 基础

HTML & CSS 基础 HTML一、HTML简介1、网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成1.4总结 2、web标准2.1 为什么需要web标准2.2 Web 标准的构成 二、HTML 标签1、HTML 语法规范1.1基本语法概述1.2 标签关系 2、 HTML 基本结构标签2.1 第一个 HTML 网页2.2 基本结构标签…

PHP input 多文件上传功能实现-网页不为人知的数据库缺陷——未来之窗行业应用跨平台架构

一、多文件上传html部分 1.1错误示例 <input type"file" class"input fl" name"file" style"width:200px;display:inline;border:0px;" multiple />1.2 正确示例 <input type"file" class"input fl" …

Vxe UI vue vxe-table 实现表格单元格选中功能

Vxe UI vue vxe-table 实现表格单元格选中功能 在表格中实现鼠标点击任意单元格&#xff0c;选取的功能&#xff0c;通过 mouse-config 配置就可以开启单选功能&#xff0c;多选单元格选取功能需安装插件支持。 代码 参数说明 mouse-config 鼠标配置项&#xff1a; selected&…

Linux之shell详解(Linux Shell Detailed Explanation)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【285-296】

文章目录 285. 为什么需要继承286. 继承原理图287. 继承快速入门288. 289. 290. 291. 292. 继承使用细节1,2,3,4,5288.1 继承给编程带来的便利288.2 继承的深入讨论/细节问题 293. 继承本质详解294. 继承课堂练习1295. 继承课堂练习2296. 继承课堂练习3 285. 为什么需要继承 28…

【软件部署安装】OpenOffice转换PDF字体乱码

现象与原因分析 执行fc-list查看系统字体 经分析发现&#xff0c;linux默认不带中文字体&#xff0c;因此打开我们本地的windows系统的TTF、TTC字体安装到centos机器上。 安装字体 将Windows的路径&#xff1a; C:\Windows\Fonts 的中文字体&#xff0c;如扩展名为 TTC 与TT…

App模拟心跳长连接的实现方法demo

摘要 背景&#xff1a;心跳通常是指客户端或服务器定期发送一个小型的、空的消息以保持连接的活动状态。它用于检测连接是否仍然有效&#xff0c;并防止连接由于长时间没有活动而被关闭。 技术原理&#xff1a;App定时发消息给服务器&#xff0c;服务器回消息表示连接依旧有效…

手机竖屏 Premiere Pro 电影转场特效视频模板Pr工程文件

10个不同的类别和115个过渡。过渡很容易使用。随附视频教程。 下载地址&#xff1a;Pr模板网 下载链接&#xff1a;https://prmuban.com/40597.html

动态规划算法专题(五):子序列问题

目录 1、最长递增子序列 1.1 算法原理 1.2 算法代码 2、摆动序列 2.1 算法原理 2.2 算法代码 3、最长递增子序列的个数 3.1 算法原理 3.2 算法代码 4、最长数对链 4.1 算法原理 4.2 算法代码 5、最长定差子序列 5.1 算法原理 5.2 算法代码 6、最长的斐波那契子序…

NASA:气象追踪分子光谱(ATMOS)二级产品,包含在垂直高度(公里)网格上的微量气体

目录 简介 摘要 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Tab Delimited Format V3 (ATMOSL2AT) at GES DISC 简介 这是版本3的气象追踪分子光谱&#xff08;ATMOS&#xff09;二级产品&#xff0c;包含在垂直高度&#…

多线程股吧(东方财富)用户信息爬取

多线程东方财富&#xff08;股吧&#xff09;用户信息爬取 在上一篇博客股吧信息爬取的基础上加入了多线程&#xff0c;使得速度提升了十几倍&#xff0c;爬取内容如下&#xff1a; 最终爬取结果如下&#xff1a; 完整代码如下&#xff08;准备好环境&#xff0c;比如pytho…

安宝特案例 | Fundació Puigvert 医院应用AR技术开创尿石症治疗新纪元

案例介绍 在医疗科技不断进步的今天&#xff0c;Fundaci Puigvert 医院迈出了重要一步&#xff0c;成功应用AR技术进行了全球首例同时使用两台内窥镜的ECIRS手术&#xff08;内镜肾内联合手术&#xff09;&#xff0c;由Esteban Emiliani M.D. PhD F.E.B.U 博士主刀。这标志着…

yub‘s Algorithmic Adventures_Day7

环形链表 link&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 思路分析 我只能说双指针yyds【刻板hh】 我们分两种情况来分析 起码在第二圈才会相遇 fast比slow多走环的整数倍 fast 走的步数是 slow 步数的 2 倍&#xff0c;即 f2s&#xff…

5.资源《Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件(含驱动代码)》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 使用CD4511驱动数码管工程文件&#xff08;含驱动代码&#xff09; 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程&#xff0c;内含设计图和工程代码。 3.内容展示 4.简述 工程功能可以看这个视频 数码…

微信小程序流量主

开发小程序也已经有一段时间了,也是为了添加流量主来开发小程序,根据小程序的定位,来获取用户想要的资源,通过广告的形式来增加用户的点击量进行收益,收益虽然微不足道,但是也是很有成就感的

活动邀请 | SonarQube×创实信息即将亮相2024 GOPS全球运维大会-上海站,分享代码质量与安全提升策略

2024年10月18日-19日&#xff08;周五-周六&#xff09;&#xff0c;第二十四届 GOPS 全球运维大会上海站将在上海中庚聚龙酒店举办。 大会为期2天&#xff0c;侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/…

宠物咖啡馆服务平台:SpringBoot技术深度解析

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于Spring Boot的宠物咖啡馆平台的设计与…

2024_10_8 系统进展

改进位置 发现是label_api里藏了我需要改进的东西 settings.py 数据库 我这边电脑上使用的是windows 192 vue.config.js 陈家强是这样设置的 module.exports {publicPath: process.env.NODE_ENV production? /: /,assetsDir: static,// css: {// extract: false// },…

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下&#xff1a; 对应的实体类为&#xff1a;UserInfoMapper 所有的准备工作都在如下文章。 MyBati…