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

PDUR路由基本功能

一、PduR路由基本功能概述PduRPDU Router模块是AutoSAR架构通信协议栈的通用模块也就是CAN、Lin、Eth、FlexRay等总线通信、诊断报文传输的时候都会经过PduR模块。为什么需要PduR模块可以理解PduR作为一个软件中间件统一管理所有报文的传输方向比如说接收的报文就管理它接收上来之后传递到上层的哪个模块如果是发送的报文也会管理这条报文向下通过哪条总线发送出去的上层COM、DCM等模块是公共模块会连接各种总线通信诊断数据有了PduR起到了软件解耦只需要在PduR这一层决定报文上下层连接即可。比如说要修改一条报文的传输方向就只需要在PduR这一层修改PduR是如何实现报文路由的PduR这一层有一个路由表相当于一个数组路由表里有很多条报文根据DBC文件在开发之前定义好比如说有5条报文前三条是发送TX后面两条是接收RX第一条是CAN报文第二条是LIN报文如果是发送报文路由表里面会定义这条CAN报文的源模块COM和目的模块CanIfLIN报文的源模块COM和目的模块LinIf。如果是接收报文比如说CAN的接收报文源模块是CanIf目的模块是COM如果COM发送CAN报文会带着这条报文的PduID发给PduRPduID其实就是路由表的数组下标比如PduID是0PduR这边获取到PduID是0就去找数组的第0个成员是一条CAN报文源地址是COM目的地址是CanIf就会把这条报文路由到CanIf去这样就实现了COM到PduR然后PduR到CanIfCanIf把这条报文发到CAN驱动然后发出去。如果CanIf接收一条报文接收的时候带着的PduID是4那PduR就索引到数组的第4个成员源地址是CanIf目的地址是COM就会把这条报文路由到COM去了PduR主要是提供I-PDUinteraction layer – protocal data unit的路由作用。对于AutoSAR的通信协议栈PduR以上传输的就是交互层的Pdu了PduR中的路由关系都是静态配置好的也就是编译前就定好了的比如需要接收CAN报文0x103为通信报文CAN报文0x203为诊断报文则在配置PduR这一层的时候定义好两条报文的源和目的模块。0x103CanIf-PduR-com0x203CanIf-PduR-DCM常见的路由上下层为1、 通信数据发送路由COM-PDUR-通信接口层IF2、 通信数据接收路由通信接口层IF-PDUR-COM3、 诊断数据发送路由DCM-PDUR-通信传输层TP4、 诊断数据接收路由通信传输层TP-PDUR-DCM二、函数调用关系1、发送CAN通信报文函数调用COM模块调用PduR_Transmit()函数发送报文函数参数里面带有PDU的信息PduInfoPDU信息是PduID和要传的报文的内容的Buffer指针PduR根据PduID索引到路由表里面就知道发送的目的是哪个模块比如说是CanIf然后把这条报文通过CanIf_Transmit发到CanIf去从上到下的发送过程中真正的数据存储是存储到COM这边的Buffer到CAN驱动才会把Buffer里面的内容拷到驱动的Buffer里面去然后把这个数据发出去中间是没有数据的拷贝的全是指针传递驱动发到总线上去之后CAN报文有个Ack位Ack代表报文发送成功了ACK回来的是肯定应答驱动就会告诉CanIfCANif告诉PduRPduR就会告诉COM这帧报文已经发送成功了往上告诉的部分是TxConfirmation发送确认实现的2、接收CAN通信报文函数调用CAN驱动接收到数据数据给到CanIfCanIf会调PduR_RxIndication(PduIdTypeconst PduInfoType*)接口把PDU的信息传上去PduIdType里面包含了两个信息一个是PduID还有一个是Buffer指针Buffer是存在驱动里面的PduR拿到PduID索引路由表找到对应的路由的位置目的是前往COM模块PduR调用COM的Com_RxIndication(PduIdTypeconst PduInfoType*)接口把PduID和Buffer传到COM模块COM模块才会把数据里面的内容拷贝到COM自己的Buffer里面去3、接收CAN诊断报文驱动收到诊断仪给的请求报文驱动就会把报文给到CanTpCanTp收到之后就会调用PduR的PduR_StartOfReception(BufReq_ReturnType.PduIdTypeconst PduInfoType*PduLengthType. PduLengthType*)函数告诉PduR当前外面诊断仪已经开始一次诊断传输了要开始接受了CanTp能识别出诊断报文的PCI信息CanTp把PCI的信息解析出来之后会把报文的长度和PduID告诉PduRPduR这边根据PduID找到路由表发现目的是到DCM就调用Dcm_StartOfReception(BufReq_ReturnType.PduIdTypeconst PduInfoType*PduLengthType PduLengthType*)告诉DCM要开始接收诊断请求了DCM这边有个缓存用于存诊断请求的报文当DCM收到开始接收的请求时DCM就会把存诊断报文的Buffer锁住因为我们诊断有可能是多帧传输要耗很长的时间把完整的报文全部传过来所以先把这个Buffer锁住防止其他的程序使用这段Buffer。第一步是先通知上层要开始接收了通知的时候带的这些参数有些是DCM需要填指针的PduLengthType是CanTP解析PCI信息之后诊断请求要发的长度。DCM也会把自己的缓存能力填充到指针PduLengthType里面去告诉CanTP自己的缓存能力。第二步CanTP就会调PduR_CopyRxDataBufReq_ReturnType.PduIdTypeConst PduInfoTypePduLengthType*,PduR也会调Dcm_ CopyRxDataBufReq_ReturnType.PduIdTypeConst PduInfoType*PduLengthType*将这帧报文的数据拷到Dcm的buffer里面去。诊断的传输跟通信的传输不一样因为通信传输就是一条报文一条报文从上到下就是RxIndication把报文的指针传上去就可以了Com模块就直接把指针里面的内容copy出来就可以了但是诊断传输不能这样做因为诊断传输有可能存在多帧传输并且诊断传输里面有服务ID、PCI的内容PCI的信息只有CanTp能解析出来这帧报文带了几个字节的长度所以必须要CanTp这边先告诉DCM要开始接收了然后CanTp才会调上层的CopyRxData的函数接口将一条条报文解析出来之后再拷贝到上层去到最后所有诊断报文全部传输完然后就会调用上层的RxIndication通知上层这次诊断传输完毕4、发送诊断报文诊断仪发了一个诊断请求之后DCM模块做完了诊断请求给诊断仪发送诊断应答需要把数据发给诊断仪DCM调用PduRTransmit(Std_ReturnTypePduIdTypeConst PduInfoType*)然后PduR调用CanTp_ Transmit(Std_ReturnTypePduIdTypeConst PduInfoType*)CanTp_ Transmit带的信息里面会有DCM模块应答数据长度和Buffer诊断数据长度比如说发10个字节的诊断应答数据CanTp这边就会根据10个字节的数据去拼装成两帧报文首帧和续帧填充对应的PCI和RSID然后CanTp就会去拷贝上层想要发的数据只有CanTp知道这一帧数据要组多少个字节才能填满所以必须要CanTp主动向上去拷贝完整的诊断应答发送完之后CanTp就会告诉上层此次传输完毕传输确认三、PduR总线间网关功能PduR除了实现基础的通信报文、诊断报文上下层路由的功能。还有一个非常常见的功能就是总线间通信或者诊断报文路由。最常见的有CAN1通信报文转到CAN2通信报文比如说有多路CAN第一路CAN到PduR之后没有到COM直接转到第二路CAN发出去了CAN诊断报文转LIN诊断报文CAN1诊断报文转CAN2诊断报文ETH诊断报文转CAN诊断报文为什么需要诊断报文网关呢这里贴上一张CAN诊断报文转LIN诊断报文的图这里实现的功能是外部诊断仪读取LIN从机的诊断数据诊断仪通过CAN通信发送诊断报文给MasterMaster内部将CAN诊断报文转换成LIN诊断报文发给LIN从机完成对LIN从节点的诊断功能Master内部的时候就是由PduR模块实现Can-Lin诊断报文网关路由。LIN的诊断诊断仪现在想去诊断从机节点从机节点一般是最末端的电子单元它不会对外提供接口我们车上都是OBD口诊断仪通过CAN线接到车上去但是它又想去诊断从机设备就需要把诊断信息发给LIN的主节点通过CAN,LIN的主节点会把诊断仪发的诊断请求的内容通过CAN转LIN的形式转到LIN线上面去告诉从节点LIN的从节点收到之后回响应通过LIN回到主节点主节点通过CAN发给诊断仪。这是CAN转LIN的诊断网关的典型应用。两个CAN网络诊断报文网关多帧单播CAN1的诊断报文收上来之后通过CAN2的诊断报文发出去CAN1节点收到报文调用PduR的StartOfReception通知上层开始接收CanTp就会调用PduR的CopyRxData拷贝第一帧数据这个时候PduR是需要缓存数据的因为PduR不会把数据再往上传了会把数据拷到自己的缓存里面去马上PduR就会调CanTp_Transmit把这个诊断报文发到CAN2节点上面去这就是CAN1节点报文转CAN2节点报文的形式CanTp_Transmit就是告诉CanTp我要向Can2发诊断报文CanTp就会向上拷贝发送的数据两个CAN通信报文的网关CAN1这边收到一条报文到CanIfCanIf调PduR的RxIndication把数据给到PduRPduR这边不往上传了直接调用CanIf_Transmit把数据传给CAN2发送完之后会有个TxConfirmation发送确认PduR缓存机制基本通信、诊断上下层路由的时候PduR模块是不需要而外提供缓存的只需要将数据指针进行传递减少数据拷贝次数提高系统运行效率但是在不同总线间网关路由的时候是需要提供缓存机制的CAN1通信报文网关到CAN2PduR先将收到的CAN1报文缓存起来等到CAN2触发传输的时候再拷贝PduR中缓存的数据。PduR提供FIFO缓存为了减少数据I-PDU的丢失PduR提供了一个深度可配置的FIFO缓存。CAN转LIN诊断网关传输的时候由于两边传输速度不同PduR会提供专有缓存区或者 缓存池来保证诊断数据网关传输时候的正确性。缓存机制的细节设计请参考AutoSAR规范四、总结PduR作为通信的通用模块在通信诊断数据传输中起到重要作用特别是总线之间报文网关路由的时候该模块就需要实现内部逻辑。随着AutoSAR使用场景的复杂性可能会要求PduR有很多的功能支持比如不同总线部署在不同核中PduR作为公共模块需要跨核支持。

相关文章:

PDUR路由基本功能

一、PduR路由基本功能概述   PduR(PDU Router)模块是AutoSAR架构通信协议栈的通用模块,也就是CAN、Lin、Eth、FlexRay等总线通信、诊断报文传输的时候都会经过PduR模块。 为什么需要PduR模块:   可以理解PduR作为一个软件中间…...

C语言第五章数组

1. 一维数组概念数组的定义数组:是相同类型元素的一个集合。在内存中是一段连续的空间。可以将C语言中的一维数组通俗地理解为「一排储物柜」或「一条有序的盒子序列」。每个储物柜(数组元素)可以存放一件物品(数据)&a…...

2026年免费视频文字提取工具对比:微信小程序vs桌面软件实操清单

做短视频内容的时候经常卡在几个问题上:录好的素材怎么快速出文案、会议视频转录要花多少时间、链接视频能不能直接提取文字而不用下载。这些需求看似小,但如果工具选不对,能把整个制作流程拉长。我会先讲微信里有个叫提词匠的小程序在这类需…...

clawsquire:基于RAG与知识图谱的智能代码助手设计与实战

1. 项目概述:一个面向开发者的智能代码助手最近在GitHub上看到一个挺有意思的项目,叫Jiansen/clawsquire。乍一看这个名字,可能有点摸不着头脑,但点进去研究后,我发现这是一个定位非常清晰的开发者工具。简单来说&…...

微信小程序、在线工具、桌面软件,2026年视频转文字工具怎么选

同样是需要把视频转成文字,用微信小程序和用专业转录软件的体验差别比较大。前者即开即用无需等待,后者功能完整但操作流程略显复杂。我在工作中经常需要处理视频素材提取文案,下面会分享一些实用的工具方案,其中微信搜索「提词匠…...

录音转文字免费工具有哪些?免费录音转文字工具对比与推荐

开头做视频素材处理的时候,经常卡在一个问题:怎么把录音、视频里的人声快速提取成文字。大多数人默认想到的是找个桌面软件或者网页工具,但其实微信小程序里有个叫提词匠的工具在这块需求上效率比较高,下面会重点拆解它,因为它能覆盖大多数人的日常场景——无论是会议录音、课程…...

桌面/在线/小程序三种路线,2026年免费录音转文字工具怎么选?

同样是处理音频文件,用桌面软件和用微信小程序的体验差别比较大。前者需要下载安装、学习界面逻辑,后者搜一下就能用,等待时间也更短。如果你的需求很简单——比如临时转几段录音、快速提取视频文案,那小程序路线省事得多。本文主要拆解免费录音转文字工具的几种主流方案,重点讲…...

终极指南:用RPFM轻松打造你的《全面战争》梦想模组

终极指南:用RPFM轻松打造你的《全面战争》梦想模组 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcod…...

免费开源:用League Director制作专业级《英雄联盟》高光视频的完整指南

免费开源:用League Director制作专业级《英雄联盟》高光视频的完整指南 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirec…...

告别TF卡!保姆级教程:让Orange Pi 5从SATA SSD启动Ubuntu系统(含VNC远程桌面配置)

告别TF卡!Orange Pi 5从SATA SSD启动Ubuntu全流程指南 在单板计算机的世界里,存储性能往往是制约整体体验的关键瓶颈。Orange Pi 5作为一款性能出众的开发板,当搭配传统TF卡运行时,其IO性能损失可能高达70%。本教程将带你完成从TF…...

关于OFIRM(本源场直觉共振模型)理论体系的深度解析:数学,检验,预测,证伪【这是对几篇核心基础论文的总结】

关于OFIRM(本源场直觉共振模型)理论体系的深度解析:数学,检验,预测,证伪Authors: Haiting Allen ChenAffiliations: Chen Xiao’er Creative Workshop, Independent Researcher, Guangzhou, China.Corres…...

copaw:命令行驱动的个人代码片段管理工具,提升开发效率

1. 项目概述:一个为开发者量身定制的代码片段管理工具在日复一日的编码工作中,我们总会遇到一些“似曾相识”的场景:一段处理日期格式的通用函数、一个封装好的网络请求方法、或者是一套复杂的数据库查询逻辑。这些代码片段就像工具箱里的螺丝…...

文化与文明是两回事!弄不懂这一点,再努力也是“庸人自扰”

我们常听到一句话:“中华文化博大精深,源远流长。”也常听人说:“现代文明带来了便利,也带来了困扰。”但你有没有想过一个问题——文化和文明,到底是不是一回事?很多人觉得它们差不多,甚至混着…...

Maven基础架构与整体认识

🚗🚗🚗🚗🚗🚗🚗 数据结构专栏🚗🚗🚗🚗🚗🚗🚗🚗🚗🚗 🛹&#x1…...

NVIDIA Isaac Sim与OSMO构建机器人仿真工作流实践

1. 项目概述:基于NVIDIA Isaac Sim与OSMO的端到端机器人工作流构建在机器人技术快速发展的当下,我经常被同行问到一个核心问题:如何高效训练适应复杂动态环境的机器人策略?经过在工业物流场景的多次实践验证,采用物理精…...

Weft轻量级Web框架:高性能路由与中间件设计实践

1. 项目概述:Weft,一个轻量级Web框架的诞生在Web开发的世界里,框架的选择往往决定了项目的起点和未来的走向。对于许多开发者,尤其是那些构建中小型API服务、需要快速原型验证或追求极致性能与简洁性的场景,像Spring B…...

Stakater Application:云原生应用部署的声明式框架与GitOps实践

1. 项目概述:一个云原生时代的应用部署“瑞士军刀”如果你和我一样,在Kubernetes上折腾过一段时间,肯定遇到过这样的场景:一个应用上线,背后跟着一堆YAML文件——Deployment、Service、ConfigMap、Secret、Ingress………...

Java之循环结构

一、语言中的结构:顺序结构、分支结构、循环结构二、循环的概念1.通过某个条件,重复并且有规律的执行一段程序代码。2.组成:循环变量的初始化、循环条件、循环变量的改变(增加、减少)、循环体(需要重复运行…...

Cursor智能体开发:令牌与定价

现在我们已经从宏观层面了解了 AI 模型的工作原理,接下来看看一个既能帮助你理解模型如何“思考”,又能帮助你理解使用成本的概念:令牌(tokens)。 你可以把令牌理解为 AI 模型实际处理的“词”。但它们并不等同于我们…...

仿照Muduo的高并发服务器:EventLoop模块及与TimeWheel模块联调

本期接着深入编写项目代码 相关代码上传至gitee:喜欢可以点个赞谢谢 目录 EventLoop模块 Eventfd机制 设计思路 源码 TimeWheel时间轮模块整合 设计思想 源码 EventLoop模块与TimeWheel模块联调整合 EventLoop模块 Eventfd机制 eventfd是本项目中的一种事件通知…...

三生原理文章被AtomGit‌开源社区收录的意义探析?

AI辅助创作:AtomGit‌ 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台,致力于构建一个中立、开放、公益的开发者生态。AtomGit‌ 在中国开源与人工智能融合生态中处于领先地位‌,是推动国产AI基础设施发…...

Three.js 代码云效果 | 三维可视化 / AI 提示词

Three.js 代码云效果 | 三维可视化 / AI 提示词 📋 AI 提示词 使用 Three.js 的 ShaderMaterial 创建代码云效果,通过多个代码纹理的随机切换和下落动画,实现代码雨的视觉效果。🖼️ 效果预览 🎮 案例演示 立即体验…...

内存增强语言模型:TRIBL2与IGTree架构对比与实践

1. 项目背景与核心价值在自然语言处理领域,内存增强型语言模型近年来展现出独特的优势。TRIBL2和IGTree作为两种典型的内存架构,通过外部记忆模块扩展了传统神经网络的上下文处理能力。这类模型特别适合需要长期依赖关系的任务场景,比如对话系…...

扩散模型记忆增强框架MemDLM技术解析与应用

1. 项目背景与核心价值在自然语言处理领域,扩散模型近年来展现出惊人的文本生成能力。然而传统扩散语言模型存在一个致命缺陷——它们像金鱼一样只有7秒记忆,每次生成都像从头开始思考。MemDLM框架的提出,相当于给扩散模型装上了"外接大…...

别再手动K帧了!Blender 3.6自动关键帧与插值曲线实战避坑指南

Blender 3.6动画效率革命:自动关键帧与曲线调优的工业级解决方案 在数字内容创作领域,动画师们常陷入效率与质量的二元困境。传统手动K帧如同用钢笔绘制赛璐璐动画,每一帧都需要精确控制;而现代三维软件提供的自动化工具则像智能绘…...

TensorFlow模型在NPU上的性能优化实战指南

1. 项目背景与核心价值在边缘计算和移动端AI应用爆发的当下,模型推理效率直接决定了产品体验的生死线。去年我们在部署某工业质检系统时,就曾因为TensorFlow模型在NPU上的性能不达标,导致产线节拍从每分钟120件暴跌到80件。这个惨痛教训促使我…...

告别DHCP!Ubuntu 22.04 LTS下给Wi-Fi设置固定IP的保姆级教程(附DNS避坑指南)

Ubuntu 22.04 LTS无线网络固定IP配置全攻略:从图形界面到系统级解决方案 刚接触Ubuntu桌面环境的开发者常会遇到这样的困境:好不容易配置好本地开发环境,却因为Wi-Fi动态IP的变化导致服务无法稳定访问。更让人抓狂的是,按照网上教…...

差分信号传输原理与高速电路设计实践

1. 差分信号传输基础与核心优势在高速数字电路设计中,差分信号传输技术已经成为应对噪声干扰的黄金标准。这种传输方式采用两根紧密耦合的传输线,分别承载相位相反的信号。当一条线上的电压为逻辑高电平时,另一条线必然为逻辑低电平&#xff…...

强化学习中推理长度对语言模型训练的影响与调优

1. 项目背景与核心问题在强化学习(RL)与语言模型结合的领域里,推理长度(reasoning length)的选择一直是个容易被忽视却至关重要的超参数。去年我在训练一个基于PPO算法的对话模型时,发现当把推理长度从128调…...

GPRS技术原理与测试方法全解析

1. GPRS技术原理深度解析GPRS(General Packet Radio Service)作为2G向3G过渡的关键技术,彻底改变了传统GSM网络的电路交换模式。我在2005年首次接触GPRS模块开发时,这种"永远在线"的特性让远程数据采集项目变得可行。其…...