0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PduR模块的发送机制 PduR这个模块对什么进行了抽象呢?

冬至子 来源:汽车电子过山车 作者:皮皮欢乐小学 2023-07-17 15:54 次阅读

一.前言

前两期,我们讲了CAN模块的发送逻辑,Canif模块的发送逻辑和发送确认逻辑,可以看到MCAL的CAN模块是对MessgeBuffer这个CAN邮箱机制 做了抽象,将其抽象成一个个的HOH。而Canif则是从报文层面做了抽象,抽象成了一个个的PDUID。再往上会有CANtp以及PDUR模块调用Canif,本期我们讲解PDUR的发送路由功能,请思考PduR这个模块对什么进行了抽象呢?

通信架构中PduR的位置如图所示:

图片

PDUR作用是对IPDU进行路由,分发到正确的模块,它是双向的,即上层的COM DCM的报文数据发送,会经由PDUR分发到canif 或cantp或其他底层通信模块.而下层的报文接收,也会经由PDUR进行分发 告知对应的COM或者DCM,除此之外还有一些buffer功能等不在我们此系列介绍范围内。

二.PduR模块及其发送函数,发送确认函数

在PDUR中实现发送报文的函数是PduR_Transmit

这个函数被PduR_ComTransmit和PduR_DcmTransmit调用,上层模块COM以及DCM模块通过这两个函数和PduR模块交互,实现发送报文的。在这个PduR_Transmit中,同样是按照IPDUID去索引对应的配置结构体数组成员,找到对应PDU的对应RoutingPaths,对RoutingPaths中配置的目标PDU进行分发,根据配置的目标模块调用对应的下层CAN发送函数如Canif_transmit或者CanTp_Transmit…. 说起来比较抽象,我们看看一个具体的配置实例。

下面是RoutingPaths的配置:

const PduRRoutingPath_type * const PduRRoutingPaths[] = { 
  &PduRRoutingPath_PDU_ID_UDS_PHYS_TX,
  &PduRRoutingPath_PDU_ID_UDS_FUNC_TX,
  &PduRRoutingPath_PDU_ID_UDS_PHYS_RX,
  &PduRRoutingPath_PDU_ID_UDS_FUNC_RX,
  &PduRRoutingPath_Pdu_Tx_272T,
  &PduRRoutingPath_Pdu_Tx_273T,
  &PduRRoutingPath_Pdu_Rx_256R,
  NULL_PTR
};

在配置中,对每个IPDU都配置了对应的RoutingPaths,

其中的一个RoutingPath配置实例如下:

const PduRRoutingPath_type PduRRoutingPath_PDU_ID_UDS_PHYS_TX = {
  .SrcModule = PDUR_DCM,
  .SrcPduId = 0,
  .SduLength = 0,
  .PduRDestPdus = PduRDestinations_PDU_ID_UDS_PHYS_TX
};

RoutingPath中定义了SrcModule,用以说明这个PDU来源于什么模块,同时也定义了他要传输到的目标pdu组。

const PduRDestPdu_type * const PduRDestinations_PDU_ID_UDS_PHYS_TX[] = {
  &PduRDestination_PDU_ID_UDS_PHYS_TX_PduRDestination,
  NULL_PTR
};

在目标PDU组中你可以定义多个PduRDestPdu,在PduRDestPdu中定义了目标模块。即这个pdu数据需要去的模块。

const PduRDestPdu_type PduRDestination_PDU_ID_UDS_PHYS_TX_PduRDestination = {
    .DestModule = PDUR_CANTP,
    .DestPduId = CANTP_PDU_ID_UDS_PHYS_TX,
    .DataProvision = PDUR_NO_PROVISION,
    .TxBufferRef = NULL_PTR
};

按照示例配置分析分配过程,假如现在上层传过来一个pduid为0的PDU,按照0索引找到

PduRRoutingPath_PDU_ID_UDS_PHYS_TX作为RoutingPath。遍历这个RoutingPath配置的所有目标PDU组

获取对应PDU的destination.根据destination的DestModule(PDUR_DCM),调用对应的Transmit函数(CanTp_Transmit)。向对应模块的Transmit函数传入DestPduId。完成报文发送。这是整个PduR_Transmit的报文发送的路由过程

Std_ReturnType PduR_Transmit(PduIdType PduId, const PduInfoType* PduInfo, uint8 serviceId) {
  PDUR_VALIDATE_INITIALIZED(serviceId,E_NOT_OK);
  PDUR_VALIDATE_PDUPTR(serviceId, PduInfo, E_NOT_OK);
  PDUR_VALIDATE_PDUID(serviceId, PduId, E_NOT_OK);


  Std_ReturnType retVal = E_OK;
  const PduRRoutingPath_type *route = PduRConfig- >RoutingPaths[PduId];
  uint8 i = 0;
  for (i = 0; route- >PduRDestPdus[i] != NULL; i++) {
    const PduRDestPdu_type * destination = route- >PduRDestPdus[i];


    retVal |= PduR_RouteTransmit(destination, PduInfo);
  }
  return retVal;
}
Std_ReturnType PduR_RouteTransmit(const PduRDestPdu_type * destination, const PduInfoType * pduInfo) {
  Std_ReturnType retVal = E_NOT_OK;
  switch (destination- >DestModule) {
  case PDUR_CANIF:
#if PDUR_CANIF_SUPPORT == STD_ON
    retVal = CanIf_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_COM:
#if PDUR_COM_SUPPORT == STD_ON
    Com_RxIndication(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_LINIF:
#if PDUR_LINIF_SUPPORT == STD_ON
    retVal = LinIf_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_CANTP:
#if PDUR_CANTP_SUPPORT == STD_ON
    retVal = CanTp_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_SOADIF:
#if PDUR_SOAD_SUPPORT == STD_ON
    retVal = SoAdIf_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_SOADTP:
#if PDUR_SOAD_SUPPORT == STD_ON
    retVal = SoAdTp_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  case PDUR_J1939TP:
#if PDUR_J1939TP_SUPPORT == STD_ON
    retVal = J1939Tp_Transmit(destination- >DestPduId, pduInfo);
#endif
    break;
  default:
    retVal = E_NOT_OK;
    break;
  }


  return retVal;
}

在PDUR中实现报文发送确认的函数是PduR_TxConfirmation,其被PduR_CanIfTxConfirmation调用,也被PduR_CanTpTxConfirmation调用。其和报文发送的逻辑类似。只不过最后调用的是对应模块的Confirmation函数。

总结:PDUR这个模块把各个报文收发的分配路径做了抽象。上层调用PDUR的发送接口传输数据,传入IPDU ID即可根据PDUR的Routing Path配置知道这些IPDU应该下发给哪些下层模块.同理对于接收也是这样。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN总线
    +关注

    关注

    145

    文章

    1812

    浏览量

    129600
  • 路由器
    +关注

    关注

    22

    文章

    3505

    浏览量

    111347
  • PDU
    PDU
    +关注

    关注

    0

    文章

    91

    浏览量

    16822
  • DCM
    DCM
    +关注

    关注

    0

    文章

    145

    浏览量

    26177
  • CAN模块
    +关注

    关注

    0

    文章

    19

    浏览量

    8676
收藏 人收藏

    评论

    相关推荐

    CBE1系列SDI视音频数字光发送机

    CBE1系列SDI视音频数字光发送机丞播CBE1系列视音频数字光发送机的输入视频信号为复合视频CVBS、分量视频YUV或半分量视频YC,输入音频信号为模拟音频AUDIO或数字音频AES/EBU;输出
    发表于 03-12 02:33

    零基础学FPGA(十二)一步一脚印之基于FIFO的串口发送机

    与DSP连接时就可以使用FIFO来达到数据匹配的目的。 下面我们开始设计。 这次设计我们要设计一个串口发送机,想一下的话,我们要发送数据,总得有一个数据产生模块和数据发送
    发表于 08-21 15:35

    零基础学FPGA(十二)基于FIFO的串口发送机设计全流程

    设计一个串口发送机,想一下的话,我们要发送数据,总得有一个数据产生模块和数据发送模块吧。好,那么在我们的脑海里就出现了这两个
    发表于 04-07 17:03

    关于“小墨同学”推出的零基础FPGA“基于FIFO的串口发送机设计全流程”相关部分讨论

    链接为“小墨同学”推出的零基础FPGA“基于FIFO的串口发送机设计全流程”,https://bbs.elecfans.com/jishu_475408_1_1.html其中,有几个部分不是很明白小墨同学的设计思路,希望大家拍砖(见图片红色框体部分)
    发表于 07-27 19:34

    为什么NRF24L01模块作为发送机时却发不出数据

    为什么NRF24L01模块作为发送机时却发不出数据?如何去解决
    发表于 12-17 07:38

    有线电视系统调幅激光发送机和接收机入网技术条件和测量方法 G

    有线电视系统调幅激光发送机和接收机入网技术条件和测量方法 GY T 143-2000
    发表于 11-22 16:45 57次下载

    GYT_143-2000_有线电视系统调幅激光发送机和接收机

    GYT_143-2000_有线电视系统调幅激光发送机和接收机入网技术条件和测量方法
    发表于 08-10 12:01 32次下载

    分时计费用负荷期信号载波发送机电路图

    分时计费用负荷期信号载波发送机电路图
    发表于 05-26 14:11 513次阅读
    分时计费用负荷期信号载波<b class='flag-5'>发送机</b>电路图

    CBE2系列SDI数字视音频光发送机

    丞播CBE2系列SDI数字视音频光发送机的输入视频信号为SDI数字视频流,输入音频信号为模拟音频AUDIO或数字音频AES/EBU。输出为符合数字电视国际标准的SDI数字视频(音频嵌入式)信号,与
    发表于 04-05 16:20 32次下载

    FPGA视频教程:SF-EP1C开发板-基于FIFO的串口发送机设计

    发送机是指产生并送出信号或数据的设备。光发送机是光传输网中的一类设备,和光接收机成对使用。光发送机将电信号转成光信号,通过光纤发送,光接收机则将光信号转成电信号。
    的头像 发表于 12-13 07:03 1445次阅读
    FPGA视频教程:SF-EP1C开发板-基于FIFO的串口<b class='flag-5'>发送机</b>设计

    DLS11 网关中继器(LTE-LoRA) 数据发送机制

    DLS11 网关中继器(LTE-LoRA) 数据发送机制 DLS11 网关中继器(LTE-LoRA)  DLS11 是 LoRA-LTE 网关设备,专用于接收其它 LoRA 设备发来的数据包存储并在
    的头像 发表于 09-13 10:19 611次阅读
    DLS11 网关中继器(LTE-LoRA) 数据<b class='flag-5'>发送机制</b>

    CAN、LIN报文的发送过程详解

    还是Com_TriggerIPDUSend最后都是调用PDUR模块PduR_ComTransmit来发送报文,且传入到PduR
    的头像 发表于 11-14 10:02 8996次阅读

    AUTOSAR通信之CanIf模块简介2

    CAN接口模块(下文简“CanIf”)位于底层CAN驱动(CanDrv)、CAN收发器(CanTrcv)和上层通信服务层(CanSm、CanNm)、CAN传输协议(CanTp)、PDU路由器(PduR)之间。它表示上层通信层的CAN驱动程序服务接口。
    的头像 发表于 02-13 14:29 1636次阅读
    AUTOSAR通信之CanIf<b class='flag-5'>模块</b>简介2

    DSL与其他模块的交互

    DSP(Diagnostic Service Processing)用于分发不同的诊断服务请求。 DSL与其他模块的交互 与PduR模块交互: ● PduR
    的头像 发表于 10-04 11:08 320次阅读
    DSL与其他<b class='flag-5'>模块</b>的交互

    DSL模块的功能有哪些

    ” 诊断响应处理 DSD子模块应请求DSL子模块进行诊断响应数据的传输。 ● 转发DSD子模块传入的诊断响应数据到PduR
    的头像 发表于 10-04 11:22 346次阅读