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

autoas/as 工程的RTE静态消息总线实现与端口数据交换机制详解

0. 概述

autoas/as 工程的RTE(Runtime Environment)通过自动生成C代码,将各SWC(软件组件)之间的数据通信全部静态化、结构化,实现了类似“静态消息总线”的通信模型。所有端口的数据交换都必须经过RTE接口完成,从而保证了组件之间的彻底解耦和AUTOSAR风格的分层设计。

1. RTE自动生成与代码主流程

1.1 配置与建模

  • 每个SWC用 Python 脚本(如 rte.py)描述端口(P-Port / R-Port)、Runnable(行为)等。
  • 这些脚本定义了端口名称、方向、数据类型、定时事件等信息,作为RTE代码生成的输入。

1.2 RTE生成工具

  • 工程中的 tools/generator/Rte.py 脚本会读取配置,自动导入并执行各 SWC 的 rte.py
  • 这些脚本会调用 main(genDir),输出针对每个 SWC 的 RTE C 代码和头文件。

1.3 生成的RTE代码内容

  • 生成的C代码(如 Rte_SwcTelltale.c)会包括:
    • 端口数据的静态变量(数据缓冲区)
    • 针对每个端口的读写函数(如 Rte_Write_TPMS(...)Rte_Read_TPMS(...)Rte_Write_Led1Sts(...)Rte_Read_Led1Sts(...)
    • Runnable 相关的调度函数和事件定义

2. 端口访问机制(静态“消息总线”)

  • 每个端口的数据都用静态C变量存储。
  • 写端口:调用RTE生成的写函数,将数据写入对应变量。
  • 读端口:调用RTE生成的读函数,从变量读取数据。
  • 所有SWC都通过这些RTE函数访问数据,实现了解耦和统一调度。

3. 代码与建模示例

3.1 Python建模

class Telltale(autosar.Template):@classmethoddef addPorts(cls, swc):swc.apply(TPMS.Send)        # P-Portswc.apply(Led1Sts.Receive)  # R-Port@classmethoddef addBehavior(cls, swc):swc.behavior.createRunnable('Telltale_run', portAccess=[...])swc.behavior.createTimingEvent('Telltale_run', period=20)

3.2 生成的C代码

static OnOff_T TPMS_Buffer;      // 静态缓冲区
static OnOff_T Led1Sts_Buffer;   // 静态缓冲区Std_ReturnType Rte_Write_TPMS(OnOff_T value) {TPMS_Buffer = value;return E_OK;
}
Std_ReturnType Rte_Read_TPMS(OnOff_T* value) {*value = TPMS_Buffer;return E_OK;
}
Std_ReturnType Rte_Write_Led1Sts(OnOff_T value) {Led1Sts_Buffer = value;return E_OK;
}
Std_ReturnType Rte_Read_Led1Sts(OnOff_T* value) {*value = Led1Sts_Buffer;return E_OK;
}
  • SWC通过Rte_Write_TPMSRte_Read_TPMS完成TPMS端口数据的写入和读取。
  • 通过Rte_Write_Led1StsRte_Read_Led1Sts完成Led1Sts端口的数据通信。
  • 数据存储在静态变量,实现“静态消息总线”功能。

4. 端口数据交换的原理与时序

4.1 背景说明

  • AUTOSAR架构下,SWC间不能直接访问彼此的数据,而只能通过端口通信。
  • 端口是数据传递的通道,例如SWC_A有P-Port(输出),SWC_B有R-Port(输入),二者通过端口和RTE关联。
  • 所有数据交换都必须通过RTE接口(如Rte_Write_TPMS、Rte_Read_TPMS、Rte_Write_Led1Sts、Rte_Read_Led1Sts)进行。

4.2 场景举例与流程

假设有两个SWC:

  • SWC_A(发送者):有P-Port(如TPMS输出)
  • SWC_B(接收者):有R-Port(如Led1Sts输入)
数据流动流程
  1. SWC_A想要发送TPMS数据
    • SWC_A调用Rte_Write_TPMS(value),不是直接赋值给SWC_B的变量。
  2. RTE接口实现
    • Rte_Write_TPMS函数把数据写入RTE内部的静态缓冲区(如TPMS_Buffer)。
  3. SWC_B想要读取TPMS数据
    • SWC_B不直接访问SWC_A变量,而是调用Rte_Read_TPMS(&value)
  4. RTE接口实现
    • Rte_Read_TPMS函数从RTE缓冲区读取SWC_A写入的数据,返回给SWC_B。

同理,Led1Sts端口的通信流程一致。

5. Mermaid逻辑结构与时序图

5.1 静态结构图

SWC_B
RTE
SWC_A
写入数据
赋值给
读取数据
读取自
调用 Rte_Read_TPMS
静态变量 TPMS_Buffer
Rte_Write_TPMS
Rte_Read_TPMS
调用 Rte_Write_TPMS

说明:

  • SWC_A 用 RTE 的写函数写入TPMS端口数据,数据保存在 RTE 的静态变量中。
  • SWC_B 用 RTE 的读函数读取TPMS端口数据,读取的就是同一份静态变量,实现“总线”式数据传递。

5.2 时序图

SWC_A RTE SWC_B Rte_Write_TPMS(value) RTE将value存入TPMS_Buffer Rte_Read_TPMS(&value) RTE从TPMS_Buffer取出数据 返回最新的value SWC_A RTE SWC_B

6. 详细说明与总结

  • SWC_A 只管调用RTE提供的写接口,不关心谁会用数据,也不知道数据会被谁用。
  • RTE 就像一个中介或“数据中转站”,把数据缓存在自己的缓冲区里。
  • SWC_B 只管调用RTE的读接口,不关心数据是哪里来的,只管要。
  • 整个过程中,SWC_A和SWC_B完全没有直接联系,一切都通过RTE接口完成。

代码片段示意

// 写入端口数据
Std_ReturnType Rte_Write_TPMS(OnOff_T value) {TPMS_Buffer = value;return E_OK;
}// 读取端口数据
Std_ReturnType Rte_Read_TPMS(OnOff_T* value) {*value = TPMS_Buffer;return E_OK;
}
  • SWC_A调用Rte_Write_TPMS(new_value);,数据写进RTE缓冲区。
  • SWC_B调用Rte_Read_TPMS(&myValue);,从RTE缓冲区读取数据。

总结

“端口的所有数据交换都通过RTE接口完成”就是:每个软件组件之间的数据传递,都必须通过RTE生成的读写接口函数,数据实际存放在RTE的缓冲区里,谁也不能直接访问别人的数据,所有交互都是中转。

这种设计保证了组件间彻底解耦,便于管理、测试和安全性分析,也使得@autoas/as工程的RTE如同一个静态高效的消息总线,完全契合AUTOSAR的分层和解耦思想。

http://www.lqws.cn/news/558217.html

相关文章:

  • 解决flash-attn安装报错的问题
  • 【C】陷波滤波器
  • 鸿蒙开发:资讯项目实战之底部导航封装
  • MySQL之MVCC实现原理深度解析
  • 类和对象(中)
  • springboot+Vue驾校管理系统
  • 开疆智能ModbusTCP转CClinkIE网关连接台达DVP-ES3 PLC配置案例
  • Java-正则表达式
  • 测量 Linux 中进程上下文切换需要的时间
  • cocos creator 3.8 - 精品源码 - 挪车超人(挪车消消乐)
  • 同步日志系统深度解析【链式调用】【宏定义】【固定缓冲区】【线程局部存储】【RAII】
  • 蚂蚁百宝箱体验:如何快速创建“旅游小助手”AI智能体
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • AlphaGenome:基因组学领域的人工智能革命
  • Linux离线搭建Redis (centos7)详细操作步骤
  • 深入解析 Electron 核心模块:构建跨平台桌面应用的关键
  • 《Go语言高级编程》玩转RPC
  • Vue.js 中的 v-model 和 :value:理解父子组件的数据绑定
  • 网络 : 传输层【UDP协议】
  • (线性代数)矩阵的奇异值Singular Value
  • WPS之PPT镂空效果实现
  • 笔记07:网表的输出与导入
  • spring中maven缺少包如何重新加载,报错java: 程序包org.springframework.web.reactive.function不存在
  • FPGA产品
  • 深入理解Java四大引用:强引用、软引用、弱引用与虚引用
  • 2.2.3、CAN总线-位时间特性、中断
  • 开源项目推荐:MCP Registry——管理MCP服务器的利器
  • git 变基:git rebase
  • 使用cmake+vs2022编译win环境下grpc(不建议拉取最新版本grpc(注意本文时间是2025/6/28))
  • 解决clion远程编程发现不了部分头文件问题