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

一.前言
前两期,我们讲了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应该下发给哪些下层模块.同理对于接收也是这样。

研发投入超过630亿 华为加速追赶苹果三星
AMD庆成立50周年;Intel重制核显控制面板将发布
英飞凌2023大中华区生态创新峰会举行 全芯打造“融合”创新生态
无声语音识别,脖颈贴合传感器AI转换皮肤震动信息
双十二苏宁支付钜惠来袭,助您省钱囤货过暖冬
PduR模块的发送机制 PduR这个模块对什么进行了抽象呢?
无线充市场细分的热点在哪里?
小众厂商正面刚知名品牌 努比亚M2和荣耀V9对比评测
PRT车辆维保管理系统的研究及应用
KUKA电伺服焊钳测量原理分析
基于Nios II系统实现LCD显示控制IP核的设计
七彩缤纷的Wi-Fi电波
ST25TN NFC标签荣获IOTE 2022金奖创新产品!
Acer已正式发布掠夺者X27显示器,即将上市
关于对象存储提供的五个主要优点
4425-001D模拟差压传感器的应用
红米Pro2最新消息!红米Pro2即将发布:骁龙660+6G运存,售价1599起
Galaxy S21和Galaxy S21+性能差异介绍
POWERPCB快捷键 pads快捷键
飞凌嵌入式RK3399开发板试用体验分享(一)