【小猫爪】AUTOSAR学习笔记07-Communication Stack之PduR,IpduM模块
创始人
2025-05-31 02:33:34
0

【小猫爪】AUTOSAR学习笔记07-Communication Stack之PduR,IpduM模块

  • 前言
  • 1 PduR简介
  • 2 PduR功能介绍
    • 2.1 I-PDU的传输
    • 2.2 路由路径
    • 2.3 Zero Cost Operation
  • 3 IpduM模块简介
    • 1 I-PDU Multiplexing
    • 2 Multiple PDU to Container Mapping
  • END

前言

  因为一个偶然的机会让我接触到了AUTOSAR,所以就花一点小小的时间来记录一下学习它的坎坷大道。这其中复制粘贴了很多,也包括了我的一些个人的小小见解和废话连篇,不爱看忽略即可,这其中如果有什么错误,欢迎大家来指正哦,嘿嘿。AUTOSAR参考版本:4.3.1

  前面对Communication Stack的通信管理理部分介绍清楚了,接下来就来看看Communication Stack中负责通信数据的部分了,第一就不得不说一个最核心的模块,那就是负责消息分发的PduR模块。

1 PduR简介

  首先介绍一个在Communication Stack中出现频率很高的词I-PDU, 全称为Interaction Layer Protocol Data Unit, 意思就是交互PDU,可以理解成是软件协议层面上的一个完整性消息。

  PduR即为PDU Router,看一看它在Communication Stack架构中的位置:
在这里插入图片描述
  PduR 模块位于 AUTOSAR 的通信服务的核心位置, 作为上层模块与下层接口模块或传输层模块传输 I-PDU 的桥梁。说的简单一点就是个内部消息路由器,当PduR 收到底层传输层或者interface抽象层传输的 I-PDU后,将其传输到对应的服务模块,而上层服务模块需要发送 I-PDU时,PduR模块则会将消息传输到相应的传输层或者interface抽象层。

  通信模块根据其在 AUTOSAR 架构中的位置和传输 I-PDU时的角色,可以分为三类:上层模块、下层接口模块和下层传输层模块。
  上层模块位于 PduR 上层,一般包括 Com、 Dcm 和 Cdd。
  下层接口模块位于 PduR 下层,一般包括 CanIf、 LinIf、 SoAdIf、 FrIf、 CddIf 等。
  下层传输层模块同样位于 PduR 下层,一般包括 CanTp、 LinTp、 SoAdTp、 DoIPTp、FrTp 和 CddTp 等。
  而PduR模块则是连接这些模块的枢纽,位于上层模块和下层模块之间,充当一个终极消息中转站。

2 PduR功能介绍

  如下图所示:
在这里插入图片描述
  PduR模块主要包含两部分,分别是路由表和路由引擎,其中路由表非常好理解,就是它会给上层服务的所有 I-PDU编号,静态确定消息路径,里面会包含各种总线特征,比如CAN ID,这样PduR模块就可以根据路由表来进行消息路由,路由引擎则就是用来传输消息的搬运工,负责把 I-PDU从源方路由到目标方。

  PduR 模块主要功能如下:
  1. 初始化
  2. 接收下层模块(接口模块、传输层模块) I-PDU并传递给上层模块
  3. 发送上层模块 I-PDU到低层模块
  4. 接收接口层 I-PDU并传递给其他接口层模块
  5. 接收传输层 I-PDU并传递给其他传输层模块

2.1 I-PDU的传输

  下面举一个最简单的例子,如果PduR的下层模块为接口模块,以CAN为例子,那下层接口模块即为CanIf模块。如果Com模块需要通过CAN总线发送一条消息,那么这条消息的流向应该如下:

在这里插入图片描述
  Com调用PduR_ComTransmit发起消息发送, PduR模块接收到消息查表后确认消息目的方为CAN,然后调用CanIf_Transmit触发CAN消息的发送,消息发送成功后,最终由CanIf模块传来发送确认。

  当PduR的下层模块为传输层模块的时候,则当传输层接收到 FF 或 SF 时,传输层将调用 PduR_StartOfReception 通知 PduR模块接收开始, PduR 模块通过调用_StartOfReception 传递给相应的上层模块,例如StartOfIReception。传输层通过调用函数 PduR_CopyRxData 将数据传递给 PduR, PduR 模块通过调用CopyRxData 将数据传递给上层模块。当接收完成时传输层模块将调用 PduRRxIndication 通知 PduR 模块, PduR 将此指示传递给上层模块通过_TpRxIndication 函数。

2.2 路由路径

  PduR 通过路由路径实现路由。一个路由路径由一个源 Id 和一个(或多个)目的 Id组成。当路由路径只包含一个目的 Id 时,称为单播,当路由路径包含多个目的 Id 时,称为多播。路由路径全部静态配置,不支持动态路由。

  某个路由路径的目的可能同时包含多个接口,如 CanIf 接口和 LinIf 接口,为了能够支持整体关闭某种接口, PduR 具有路由路径组的概念。一个路由路径组包含多个目的 Id,它们可以属于同一个路由路径,也可以属于不同路由路径。反过来一个路由路径的不同目的 Id 可以属于不同的路由路径组。

  路由路径组也是静态配置的。路由路径组可以单独使能或关闭。每个路由路径组的初始状态由配置决定。 PduR 提供了两个接口函数来动态使能或关闭某个路由路径组,分别为 PduR_EnableRouting()和PduR_DisableRouting(),它们主要由 BswM 模块调用。

2.3 Zero Cost Operation

  Zero Cost Operation是指当 PduR 只充当简单的路由功能时,为了优化性能而将各主要函数实现为宏的形式。该功能通过配置项 ZeroCostOperation 使能。要使用该功能,必须同时满足如下条件:
1)用户配置的 PduRRoutingTable 路径中仅包含 Com-CanIf, CanIf-Com, Dcm-CanTp,CanTp-Dcm , CanNm-Com , Com-CanNm时;
2) PduRGeneral 里 PduRVersionInfoApi 为 FALSE 时;
3)不包含 Routing Group 时。

3 IpduM模块简介

  仔细看上面的结构图,可以看到在PduR的旁边有一个IpduM(Interaction PDU multiplexer)模块,该模块看上去比较独立,它在AUTOSAR架构中,只和PduR模块和Com模块有交互。PDU多路复用即PDU的PCI相同而SDU布局不同,简单的来说就是使用相同的 IpduM I-PDU 发送或接收不同的 Com I-PDU,再简单一点说就是使用同一个PDU ID来发送不同的报文内容。对于多路复用的I-PDU来说,它的数据流向则变成了Com->PduR->IpduM->PduR->CanIf。

  那么IpduM模块是怎么实现PDU复用的呢?IpduM 提供了两种模式来实现多路复用,分别是I-PDU Multiplexing和Multiple PDU to Container Mapping这两种形式。

1 I-PDU Multiplexing

   其实现方式则为将一个多路复用的I-PDU分为一个静态部分和一个动态部分,其中静态部分由零个或多个信号或信号组组成,静态部分信号或者信号组的位置大小都是固定的,不会随着PDU多路复用而变化; 动态部分由Selector Field和一个或多个信号或信号组组成,这一部分除了Selector Field的位置不会变动外,信号和信号组的位置是可以随意发生变化的。如下图所示:
在这里插入图片描述

  静态部分和动态部分的位置可根据I-PDU进行配置,静态部分和动态部分可以被细分为不同的段。对于每个多路复用的I-PDU,只能定义一个Selector Field,所以IpduM模块就是通过Selector Field的值来进行PD路由,根据其不同的值来解包I-PDU的动态部分的内容。Selector Field大小可以配置为1到16个连续位,其位置也可以通过配置来定义。

2 Multiple PDU to Container Mapping

  这种方式就更好理解了,即创建一个容器,然后将多路复用的每一种PDU layout都分配一个Header,当Com层出发信号发送时,则会根据该信号的I-PDU layout的所对应的Header在容器中来进行查找,然后进行数据组装最好进行发送,接收同理。
在这里插入图片描述

END

相关内容

热门资讯

python基础语法【模块 包... 模块 包 异常捕获 1.模块 python一个py文件就是一个模块 1.1 使用方法 1)前提&#x...
在recyclerview中使... 问题描述 最近在使用RecycerView的瀑布流布局,我想直接用ViewBindin...
java中Long型数据大小比... 起因 今天在做项目的时候,想构建一个树形结构,从数据库中查询出了所有数据...
智能控制 | AIRIOT智慧... 许多行业客户在智慧楼宇的建设中主要面临运营管理低效,楼宇内部各个系统相互独立ÿ...
Redis 数据结构 这里写目录标题Redis 数据结构一、String类型String数据类型的使用场景key 的设置约...
基于 MM32SPIN0280... M32SPIN0280 是灵动微电机新推出的针对电机控制市场的专用 MCU,该系列 M...
C++学习(指针、引用、结构体... 1编译软件Visual Studio2基本语法2.1指针2.1.1指针的使用//定义一个指针int ...
【UML】项目开发流程 以下模型是一个项目从启动到最终部署,逐步细化(精化)、实现...
docker-java应用部署 目录          1端口映射 2.Mysql部署 3.Tomcat部署 4.Nginx部署 5...
CentOS操作系统libc.... 使用xshell登陆Linux后查看jdk版本提示 /lib64/libc.so.6: versio...
Linux串口实现树莓派与电脑... 目录 一  串口说明 二  USB—TTL模块 ● usb-ttl模块接口  三  串口通信常用的A...
BeanPostProcess... 文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期...
2023.3.22 文章目录@13:static关键字**一:static修饰变量&...
模糊PID控制双容水箱液位控制... 资源:双容水箱液位模糊PID控制MATLAB仿真-电子商务文档类资源-CSDN文库模糊...
基于springboot家政服... 大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里...
提升代码质量,使用插件对 ja... 目录前言一、使用maven-checkstyle-plugin插件1. maven-checksty...
VSCode配置git bas... 打开左下角齿轮图标      打开Settings 搜索框输入 terminal.integrat...
Winform控件开发(21)... 一、属性 1、Name 用于获取控件对象 2、Anchor 锚定控件对于父控件的位置 3、BackC...
【kubernetes云原生】... 目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性 ...
重构条件-Replace Ne... 重构条件-Replace Nested Conditional with Guard Clauses...