当前位置: 首页 > 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的分层和解耦思想。

相关文章:

  • Flutter基础(控制器)
  • eTools 开源发布
  • 如何用VS Code、Sublime Text开发51单片机
  • Mysql架构
  • 顺序表的常见算法
  • 【编程实践】利用python在Blender生成三维模型
  • Stable Diffusion入门-ControlNet 深入理解 第四课:风格迁移与重绘控制模型——让AI也有“艺术天赋”!
  • FPGA设计的上板调试
  • 微信小程序实现简版点赞动画
  • 【linux】文件与目录命令 - iconv
  • Kafka 消费者重平衡问题排查与优化实践
  • 下载最新版本的OpenOCD
  • (LeetCode 每日一题) 2099. 找到和最大的长度为 K 的子序列 (排序)
  • 【C++】transform, reduce, scan是什么意思?理解常用并行算法及其实现原理
  • [Andrej Karpathy_2] vibe coding | 大型语言模型的1960年代 | 自主性滑块
  • 【云桌面容器KasmVNC】如何关闭SSL使用HTTP
  • [Linux]从零开始的STM32MP157移植Ubuntu根文件系统教程
  • Linux软连接和硬连接
  • git 挑选:git cherry-pick
  • DeepSeek改写glaredb的示例实现自定义CLI界面程序