当前位置: 首页 > news >正文

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

文章包含了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
    #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.

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

相关文章:

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

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中PduR模块相关的内容详解。本文从AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解PduR这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都是依托于ETAS提供的…...

[控制理论]—差分变换法与双线性变换法的基本原理和代码实现

差分变换法与双线性变换法的基本原理和代码实现 1.差分变换法 差分变换法就是把微分方程中的导数用有限差分来近似等效&#xff0c;得到一个与原微分方程逼近的差分方程。 差分变换法包括后向差分与前向差分。 1.1 后向差分法 差分变换如下&#xff1a; d e ( t ) d t e…...

【JavaEE】——多线程常用类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;Callable和FutureTask类 1&#xff1a;对比Runnable 2&#xff1a…...

Cilium-实战系列-(二)Cilium-Multi Networking-多网络

一、Cilium必要开启的功能 1、enable-multi-network 2、ipam模式选择:multi-pool 二、涉及的CRD资源 1、 ciliumpodippools.cilium.io *通过Cilium管理节点上的pod cidr.网络分为主网络和第二网络。 *主网络的 ciliumpodippools.cilium.io default根据配置文件默认生成的。 …...

springboot自动配置

自动配置的核心就在SpringBootApplication注解上&#xff0c;SpringBootApplication这个注解 底层包含了3个注解&#xff0c;分别是&#xff1a; SpringBootConfiguration ComponentScan EnableAutoConfiguration EnableAutoConfiguration这个注解才是自动配置的核心,它 封…...

mock数据,不使用springboot的单元测试

业务代码 package com.haier.configure.service.impl;import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.haier.common.util.RequestUtil; import com.haier.configure.entity.Langua…...

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化&#xff08;Pooling&#xff09;是深度学习中常用的一种操作&#xff0c;用于降低卷积神经网络&#xff08;CNN&#xff09;或循环神经网…...

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络&#xff0c;人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队&#xff0c;提升工作效率&#xff0c;甚至影响职业发展。在职场中&#xff0c;我们需要了解一些关键要素&#xff0c;以更好地处理人际关系&#xf…...

Python | Leetcode Python题解之第456题132模式

题目&#xff1a; 题解&#xff1a; class Solution:def find132pattern(self, nums: List[int]) -> bool:candidate_i, candidate_j [-nums[0]], [-nums[0]]for v in nums[1:]:idx_i bisect.bisect_right(candidate_i, -v)idx_j bisect.bisect_left(candidate_j, -v)if…...

【重学 MySQL】五十四、整型数据类型

【重学 MySQL】五十四、整型数据类型 整型类型TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff09;BIGINT 可选属性UNSIGNEDZEROFILL显示宽度&#xff08;M&#xff09;AUTO_INCREMENT注意事项 适合场景TINYINTSMALLINTMEDIUMINTINT&#xff08;或INTEGER&#xff0…...

查看 Git 对象存储中的内容

查看 Git 对象存储中的内容 ls -C .git/objects/<dir>ls: 列出目录内容的命令。-C: 以列的形式显示内容。.git/objects/<dir>: .git 是存储仓库信息的 Git 目录&#xff0c;objects 是其中存储对象的子目录。<dir> 是对象存储目录下的一个特定的子目录。 此…...

Redis 中热 Key 的判定及其解决方案

引言 Redis 作为高效的内存数据库&#xff0c;常用于缓存、消息队列等场景。随着数据量和并发量的增加&#xff0c;某些数据的访问频率会远远高于其他数据&#xff0c;这些被频繁访问的 Key 被称为 热 Key。热 Key 问题是 Redis 应用中常见的性能瓶颈之一&#xff0c;它可能导…...

elasticsearch创建索引

1对比关系型数据库&#xff0c;创建索引就等同于创建数据库 在postman中&#xff0c;向ES服务器发PUT请求 显示已经创建成功了 http://192.168.1.108:9200/shopping 请求方式get http://192.168.1.108:9200/shopping 请求全部的index的url地址 get 请求 http://192.168.1.10…...

【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…...

计算机网络:物理层 —— 信道复用技术

文章目录 信道信道复用技术信道复用技术的作用基本原理常用的信道复用技术频分复用 FDM时分复用 TDM波分复用 WDM码分复用 CDM码片向量基本原理 信道 信道是指信息传输的通道或介质。在通信中&#xff0c;信道扮演着传输信息的媒介的角色&#xff0c;将发送方发送的信号传递给…...

期权懂|期权交易涨跌幅限制会随时调整吗?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;期权交易涨跌幅限制会随时调整吗&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权交易涨跌幅限制会随时调整吗&#xff1f; 涨跌幅…...

阿里面试: RocketMQ如何实现每秒上十万QPS的超高吞吐量读取的?

这玩意儿表面看上去挺牛逼&#xff0c;但其实背后的逻辑和套路&#xff0c;在咱们开发里见过的那些招数&#xff0c;都能找到影子。 今天小北和大家一起系统化的梳理梳理一遍&#xff0c;让大家功力猛增&#xff0c;吊打面试官。 1. 消息存储&#xff1a;巧妙利用顺序写 先说…...

web:js原型污染简单解释

1. 什么是对象&#xff1f; 在 JavaScript 中&#xff0c;对象是一种包含属性和方法的数据结构。你可以把对象想象成一个存储键值对的容器。每个键&#xff08;key&#xff09;都有一个对应的值&#xff08;value&#xff09;&#xff0c;这个值可以是数据或者函数。 let per…...

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…...

实战OpenCV之模板匹配

基础入门 模板匹配是计算机视觉中一种常用的图像处理技术,用于在较大的目标图像中寻找与给定模板图像相似的子区域。这项技术的基本思想是在主图像中寻找与模板图像最相似的子区域,广泛应用于目标检测、图像识别等领域。模板匹配的主要流程包括如下三点。 1、滑动窗口。将模板…...

【C++ 11】for 基于范围的循环

文章目录 【 1. 基本用法 】【 2. for 新格式的应用 】2.1 for 遍历字符串2.2 for 遍历列表2.3 for 遍历的同时修改元素 问题背景 C 11标准之前&#xff08;C 98/03 标准&#xff09;&#xff0c;如果要用 for 循环语句遍历一个数组或者容器&#xff0c;只能套用如下结构&#…...

创建索引时需要考虑的关键问题详解

引言 在数据库中&#xff0c;索引是加快数据查询速度的重要工具。通过索引&#xff0c;数据库可以快速定位需要的数据&#xff0c;而无需扫描整个表的数据。尽管索引能极大提高查询效率&#xff0c;但不合理的索引设计也可能导致性能下降&#xff0c;甚至增加不必要的系统开销…...

【JavaEE】【多线程】Thread类讲解

目录 Thread构造方法Thread 的常见属性创建一个线程获取当前线程引用终止一个线程使用标志位使用自带的标志位 等待一个线程线程休眠线程状态线程安全线程不安全原因总结解决由先前线程不安全问题例子 Thread构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用…...

硬件面试(一)

网上别人的硬件面试记录&#xff0c;察漏补缺&#xff1a; 1.骄傲容易被打脸&#xff01; 励磁电感和谐振电感的比值K大小有什么含义: 励磁电感和谐振电感的比值 KKK 通常用来衡量电路的特性。当 KKK 较大时&#xff0c;表示励磁电感相对于谐振电感较强&#xff0c;可能导致…...

9-贪心算法

PDF文档下载&#xff1a;LeetCode-贪心算法-java 参考&#xff1a;代码随想录 题目分类大纲如下&#xff1a; 贪心算法理论基础 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff…...

前端编程艺术(3)---JavaScript

目录 1.JavaScript 1.输出 2.变量和数据类型 3.运算符 4.数组 5.函数 6.面向对象 7.ES6面向对象 2.BOM 1.document对象 3.DOM 4.JSON 1.JavaScript JavaScript是一种脚本编程语言&#xff0c;通常用于为网页增加交互性和动态效果。它是一种高级语言&#xff…...

动态规划算法题目练习——91.解码方法

1.题目解析 题目来源&#xff1a;91.解码方法——力扣 测试用例 2.算法原理 基础版本 1.状态表示 由于题目只要求返回第i个位置的可能情况&#xff0c;则只需要开辟n(ns.size())个大小的dp表即可 2.状态转移方程 题目可知第i个位置可以单独解码也可以与前一个位置组合解码&am…...

每天一个数据分析题(四百九十二)- 主成分分析与因子分析

在因子分析中&#xff0c;因子载荷矩阵是用来表示&#xff08; &#xff09;。 A. 变量和因子之间的关系 B. 样本和因子之间的关系 C. 变量和样本之间的关系 D. 因子和因子之间的关系 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案…...

Linux shell编程学习笔记86:sensors命令——硬件体温计

0 引言 同事们使用的Windows系统电脑&#xff0c;经常莫名其妙地装上了鲁大师&#xff0c;鲁大师的一项功能是显示系统cpu等硬件的温度。 在Linux系统中&#xff0c;sensors命令可以提供类似的功能。 1 sensors命令 的安装和配置 1.1 sensors命令 的安装 要使用sensors命…...

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…...