AutoSar CP 通信服务核心—Com模块详解

news2024/11/23 22:39:49

文章目录

    • Com模块的主要功能
    • Com模块的配置
    • 与其他模块的交互
    • 应用举例
      • 应用层通过Com模块接收CAN报文
      • 应用层通过Com模块发送CAN报文

在AUTOSAR Classic Platform (CP) 中, Com模块(Communication模块)是负责实现 应用层与通信栈之间的接口。它主要管理与通信相关的数据传输,并确保应用层数据通过CAN、LIN、FlexRay、以太网等通信总线正确传输。

Com模块的主要功能

  1. 信号的处理和映射

    • Com模块负责将应用层的信号映射到PDU(Protocol Data Unit,协议数据单元),并将接收到的PDU解析回应用层的信号。
    • 信号可以是标量、数组,甚至是复合数据类型,Com模块对这些不同类型的数据提供相应的打包和解包功能。
  2. 信号组

    • Com模块还支持信号组的概念,可以将多个信号组合在一起作为一个单元来进行处理,以提高效率。
  3. 数据的传输和接收

    • Com模块通过调用底层的PDU Router(PduR模块),将打包好的PDU发送给下层的通信接口模块(如CAN、LIN、FlexRay等)。
    • 接收到的PDU也通过PDU Router传递给Com模块进行解包。
  4. 定期传输

    • Com模块能够为周期性数据传输提供支持,确保在预定义的时间间隔内发送和接收消息。
  5. 事件驱动传输

    • 支持基于事件触发的数据传输,当某个信号的值发生变化时,会触发数据传输。
  6. 数据更新通知

    • 当通信总线接收到新的数据时,Com模块会通知应用层数据已更新。
  7. 缓冲管理

    • 对于需要发送和接收的数据,Com模块提供缓冲区以便进行数据存储和管理。
  8. 信号网关

    也就是针对单个信号进行处理和转发。通过信号网关,系统可以实现信号从一个网络到另一个网络的透明转发,而不必对整个PDU(Protocol Data Unit)进行处理。信号网关可以将不同总线之间的信号转发。例如,将来自CAN总线的信号转发到LIN总线或Ethernet网络。

Com模块的配置

AUTOSAR CP中的Com模块通常通过AUTOSAR工具链进行配置。典型的配置包括:

  • 定义应用层信号及其属性(如数据类型、大小、发送周期等)。
  • 映射应用层信号到PDU。
  • 定义通信接口和相关参数,如信号的刷新率、延迟时间等。

与其他模块的交互

  • PduR模块:Com模块通过PduR模块与具体的总线通信模块(如CanIf、LinIf)交互,完成PDU的发送与接收。
  • 应用层模块:Com模块直接与RTE (Run-Time Environment)进行交互,应用层通过RTE调用Com模块的API来发送和接收信号。

应用举例

应用层通过Com模块接收CAN报文

在AUTOSAR CP中,Com模块接收CAN信号的过程大致可以分为以下几个步骤:CAN Driver接收CAN报文,通过CAN Interface(CanIf)、PDU Router(PduR)模块传递给Com模块,最终由Com模块解包,将信号传递给应用层。

注意:报文与信号的不同,一条CAN报文可能包含很多个信号,当Com模块接收到CAN报文,会将报文解析出对应的信号传递给应用层。比如ID为123的CAN报文组成 报文(Message) 与 不同颜色的Signals

在这里插入图片描述

假设:

  • 我们要接收一个CAN报文,其中包含三个信号:
    • Signal_A(1字节)
    • Signal_B(2字节)
    • Signal_C(4字节)
  • 报文通过CAN总线接收后,Com模块需要从PDU中提取出这三个信号并传递给应用层。
  1. CAN Driver接收CAN报文

CAN控制器接收到CAN总线上的报文,并通过CAN Driver模块处理。CAN Driver会将收到的CAN报文放入缓冲区,并通知上层CAN Interface(CanIf)

void CanIf_RxIndication(Can_HwType* Mailbox, PduInfoType* PduInfoPtr)

在此函数中,PduInfoPtr包含了接收到的CAN报文数据。CanIf_RxIndication负责将收到的CAN报文传递给PDU Router(PduR)

  1. CanIf模块传递PDU

CanIf模块会根据接收的CAN报文的ID,查找与其对应的PDU ID,并将数据传递给**PDU Router(PduR)**模块。

PduR_CanIfRxIndication(PduId, &PduInfo);
  • PduId:与接收到的CAN报文相关联的PDU ID。
  • PduInfo:包含接收到的CAN报文数据(即PDU)。
  1. PDU Router传递给Com模块

PduR模块根据PDU ID,找到相应的接收路径,将PDU传递给Com模块进行解包处理。

Com_RxIndication(PduId, &PduInfo);
  • PduId:对应于此报文的PDU ID。
  • PduInfo:包含接收到的PDU数据。
  1. Com模块解包PDU并更新信号

Com模块在接收到PDU后,按照预先配置好的信号映射,将PDU中的数据解包为各个信号。

  • Signal_A从PDU的第0字节解包。
  • Signal_B从PDU的第1和第2字节解包。
  • Signal_C从PDU的第3到第6字节解包。
void Com_RxIndication(PduIdType PduId, const PduInfoType* PduInfoPtr) {
    // 从PDU中提取信号值
    uint8_t Signal_A = PduInfoPtr->SduDataPtr[0];  // 提取第0字节
    uint16_t Signal_B = (PduInfoPtr->SduDataPtr[1] << 8) | PduInfoPtr->SduDataPtr[2];  // 提取第1、2字节
    uint32_t Signal_C = (PduInfoPtr->SduDataPtr[3] << 24) |
                        (PduInfoPtr->SduDataPtr[4] << 16) |
                        (PduInfoPtr->SduDataPtr[5] << 8) |
                        PduInfoPtr->SduDataPtr[6];  // 提取第3-6字节
    
    // 更新信号值到信号缓存
    Com_UpdateSignal(Signal_A_ID, Signal_A);
    Com_UpdateSignal(Signal_B_ID, Signal_B);
    Com_UpdateSignal(Signal_C_ID, Signal_C);
}

在这个过程中,Com模块会将解包后的信号值存入内部缓存,并根据配置,可能会向应用层触发数据更新通知。

  1. Com模块通知应用层

如果信号配置了通知回调函数,当信号值更新时,Com模块会调用该回调函数通知应用层数据已更新,应用层可以随时获取最新的信号值。

void Com_UpdateSignal(SignalIdType SignalId, SignalType SignalValue) {
    // 更新信号值
    Com_SignalBuffer[SignalId] = SignalValue;
    // 如果信号配置了更新通知回调,则调用回调函数通知应用层
    if (Com_SignalCallback[SignalId] != NULL) {
        Com_SignalCallback[SignalId](SignalValue);
    }
}

应用层通过Com模块的API可以随时获取最新的信号值,例如:

Com_ReceiveSignal(Signal_A_ID, &value_A);
Com_ReceiveSignal(Signal_B_ID, &value_B);
Com_ReceiveSignal(Signal_C_ID, &value_C);

应用层通过Com模块发送CAN报文

在AUTOSAR CP中,Com模块负责将应用层的信号打包成CAN报文,并通过底层的通信模块(如CAN Interface,CAN Driver)将报文发送到CAN总线。整个过程涉及信号处理、PDU打包、路由传输等步骤。

假设:

  • CAN报文包含三个信号:
    • Signal_A(1个字节)
    • Signal_B(2个字节)
    • Signal_C(4个字节)
  • 这些信号映射到一个PDU,最终封装成CAN报文,并通过CAN总线发送出去。
  1. 信号定义与配置

在AUTOSAR的配置工具中,工程师需要预先定义好CAN报文和其包含的信号:

  • Signal_A:1 byte
  • Signal_B:2 bytes
  • Signal_C:4 bytes 这些信号将映射到一个CAN PDU中。

信号映射到PDU的配置:

  • Signal_A从第0字节开始,占用第0字节。
  • Signal_B从第1字节开始,占用第1和第2字节。
  • Signal_C从第3字节开始,占用第3到第6字节。
  1. 应用层更新信号

在应用层,RTE(Run-Time Environment)调用Com模块的API来更新信号值。假设应用层代码更新了三个信号的值:

Com_SendSignal(Signal_A_ID, &value_A);
Com_SendSignal(Signal_B_ID, &value_B);
Com_SendSignal(Signal_C_ID, &value_C);

在调用这些API时,Com模块将会缓存这些信号的值,等待触发条件(如周期性或事件驱动)发送报文。

  1. 信号打包成PDU

当满足发送条件时(例如:周期性发送,或某个信号更新导致触发发送),Com模块会将这些信号按照配置打包成一个PDU。

打包过程

  • Signal_A的值被放置在PDU的第0字节。
  • Signal_B的值被放置在PDU的第1、2字节。
  • Signal_C的值被放置在PDU的第3-6字节。

PDU最终被组装成如下形式:

PDU = [Signal_A | Signal_B | Signal_C]
PDU = [0xAA | 0xBBBB | 0xCCCCCCCC]  // 假设Signal_A=0xAA, Signal_B=0xBBBB, Signal_C=0xCCCCCCCC
  1. PDU发送到PDU Router(PduR)

Com模块完成PDU的打包后,通过PduR模块进行路由,将打包好的PDU传递给下层的CAN Interface模块(CanIf)

PduR_ComTransmit(PduId, &PduInfo);

PduInfo包含了PDU的数据和长度。

  1. PDU传递给CAN Interface模块(CanIf)

PduR模块将PDU传递给CanIf模块,CanIf模块根据PDU ID将PDU映射到具体的CAN报文(CAN Message)。

CanIf_Transmit(CanTxPduId, &CanPduInfo);

在这一步,CanIf模块会根据配置的CAN ID和PDU内容构建CAN报文,将数据放入CAN控制器的发送缓冲区。

CAN Driver发送CAN报文

CanIf模块调用底层CAN Driver模块,CAN Driver模块负责通过CAN控制器将报文发送到CAN总线。

Can_Write(CanTxPduId, &CanPduInfo);

最终,CAN报文如下:

CAN Message = [CAN ID | Data]
Data = [0xAA | 0xBBBB | 0xCCCCCCCC]  // 打包好的信号数据

该报文通过CAN总线发送给其他节点。

通过这种模块化的方式,AUTOSAR CP的Com模块确保了应用层数据可以按照预定义的方式正确发送到CAN总线,并解耦了应用层和底层通信协议的复杂性。

对于应用层来讲,无需关注底层如何实现,只需要将对应的信号传递给Com,对于底层来讲,无需关注应用层如何解析,只需要提供原始的CAN报文(Message),极大提高了开发效率!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站&#xff1a;Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符&#xff0c;拉取 GitLab 镜像&#xff1a; docker pull gitlab/gitlab-ee:latest或则使用社区版&#xff1a; docker pull gitlab/gitlab-ce…

【五分钟学会】YOLO11 自定义数据集从训练到部署

数据集地址 数据集包含 360 张红血细胞图像及其注释文件&#xff0c;分为训练集与验证集。训练文件夹包含 300 张带有注释的图像。测试和验证文件夹都包含 60 张带有注释的图像。我们对原始数据集进行了一些修改以准备此 CBC 数据集&#xff0c;并将数据集分成三部分。在360张…

feign文件上传

记录一下 feign文件上传 环境 spring-boot 2.3.7 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath/> <!-- lo…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

通过 LLMs 自动探索量化投资策略

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的al…

SpringBoot项目:前后端打包与部署(使用 Maven)

文章目录 IDEA后端打包与部署&#xff08;使用 Maven&#xff09;1. 确保 Maven 已安装&#xff0c;并引入 pom 插件2. 清理并安装项目3. 定位生成的 JAR 包和配置文件4. 创建部署文件夹5. 上传到服务器 前端打包与部署&#xff08;使用 npm&#xff09;1. 确保 Node.js 和 npm…

提升LLM结果:何时使用知识图谱RAG

通过知识图谱增强 RAG 可以帮助检索&#xff0c;使系统能够更深入地挖掘数据集以提供详细的响应。 译自Boost LLM Results: When to Use Knowledge Graph RAG&#xff0c;作者 Brian Godsey。 有时&#xff0c;检索增强生成 (RAG) 系统无法深入文档集以找到所需的答案。我们可能…

同质化的卷需要支撑多样化的环境来调和

(*^__^*) 代价高昂的免费机器人课程{人工智能与机器人教育之个人感悟}_从事机器人工程专业或机器人方向相关课程开发3年多的时间,从编写控制机器人的第一-CSDN博客 如上这篇写于2016&#xff0c;发表在博客的时间是2018。 总是觉得要补充些什么&#xff0c;但是&#xff0c;…

【模板进阶】std::true_type和std::false_type

一、 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_type的实现 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_t…

Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)

反向代理与跨域描述 什么是跨域&#xff1f; 跨域&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;是指在浏览器中&#xff0c;当一个网页的脚本试图从一个域名&#xff08;协议、域名、端口&#xff09;请求另一个域名的资源时&#xff0c;浏览器会阻止这种请求…

php常用的注释符号

如果没有安装vscode和小皮&#xff0c;请点击下方链接安装&#xff1a; Vscode、小皮面板安装-CSDN博客 在学习php过程中&#xff0c;肯定少不了注释&#xff0c;也可以理解为备注的信息&#xff0c;来提醒自己这段代码有什么用&#xff0c;是什么意思等&#xff0c;接下来就介…

JS测试框架——Jest

文章目录 安装yarn安装jestvscode支持jest的智能提示创建JS测试用例 安装yarn yarn是meta发布的一款取代npm的包管理工具。 npm install -g yarn查看yarn软件源 yarn config get registry换源 yarn config set registry https://registry.npmmirror.com恢复官方源 yarn co…

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

华为---MUX VLAN简介及示例配置

目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN&#xff08;Multiplex VLAN&#xff09;提供了一种通过VLA…

【C++力扣】917.仅仅反转字母|387.字符串中第一个唯一字符|415.字符串相加

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f525; 所属专栏&#xff1a;C深入学习笔记 &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 一、917.仅仅反转字母 1.1 题目描述…

VMware tools菜单为灰色无法安装

这个工具之前为灰色&#xff0c;无法安装&#xff0c;导致无法实现跟主机的共享文件夹等操作。极为不便。 根据其他教程提示&#xff1a;看到软件是这个配置。 修改为自动检测&#xff0c;tools就可以安装了。之前没注意到。 也有说dvd光盘也要设置。但是经过我测试。只设置软…

各省份消费差距(城乡差距)数据(2005-2022年)

消费差距&#xff0c;特别是城乡消费差距&#xff0c;是衡量一个国家或地区经济发展均衡性的重要指标。 2005年-2022年各省份消费差距&#xff08;城乡差距&#xff09;数据&#xff08;大数据&#xff09;.zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

总结TypeScript相关知识

目录 引入认识特点安装使用变量声明类型推导 JS 和 TS 共有类型number类型boolean类型string类型Array类型null和undefined类型object类型symbol类型对象类型函数类型 可选和只读type 和 interface索引签名类型断言非空类型断言类型缩小严格赋值检测现象TS 新增类型字面量类型a…