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):
@classmethod
def addPorts(cls, swc):
swc.apply(TPMS.Send) # P-Port
swc.apply(Led1Sts.Receive) # R-Port
@classmethod
def 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_TPMS
和Rte_Read_TPMS
完成TPMS端口数据的写入和读取。 - 通过
Rte_Write_Led1Sts
和Rte_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输入)
数据流动流程
- SWC_A想要发送TPMS数据
- SWC_A调用
Rte_Write_TPMS(value)
,不是直接赋值给SWC_B的变量。
- SWC_A调用
- RTE接口实现
Rte_Write_TPMS
函数把数据写入RTE内部的静态缓冲区(如TPMS_Buffer
)。
- SWC_B想要读取TPMS数据
- SWC_B不直接访问SWC_A变量,而是调用
Rte_Read_TPMS(&value)
。
- SWC_B不直接访问SWC_A变量,而是调用
- RTE接口实现
Rte_Read_TPMS
函数从RTE缓冲区读取SWC_A写入的数据,返回给SWC_B。
同理,Led1Sts端口的通信流程一致。
5. Mermaid逻辑结构与时序图
5.1 静态结构图
说明:
- SWC_A 用 RTE 的写函数写入TPMS端口数据,数据保存在 RTE 的静态变量中。
- SWC_B 用 RTE 的读函数读取TPMS端口数据,读取的就是同一份静态变量,实现“总线”式数据传递。
5.2 时序图
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的分层和解耦思想。