【Autosar】RTE(Runtime Environment)层详解
在阅读之前请先了解AutoSar的基本层级
运行时环境 RTE
AUTOSAR 的 RTE(Runtime Environment) 是整个架构的“胶水层”和“调度中枢”,它把 Application 层(SW-C)和 Basic Software(BSW)层完全解耦,同时提供运行时的通信、调度、资源管理等服务。
作为应用层软件组件和基础软件之间的中间件,也是一个虚拟的功能总线,负责组件间通信、数据路由、服务调用等功能,为应用层提供统一的运行环境,使软件组件能够在不同硬件平台上运行,提高了软件的可移植性。类似餐厅的服务员,在厨师(BSW)和顾客(Application)之间的交互。
RTE是一个静态概念,他需要在运行之前将SWC(Software Component,软件组件,Application层中的基本组件,下面统称SWC)和一个Task关联起来。RTE其实是通过Autosar生成的,它会根据配置自动生成,RTE 对每个 ECU 来说都是不同的,并且根据 SWC 的要求进行定制,也就是每个ECU有不同的SWC,这会生成各自的RTE。
功能类别 | 具体职责 | 举例 |
---|---|---|
通信中介 | 把 SW-C 的端口(PPort/RPort)自动映射到 BSW 服务(COM、DEM、NM…)或直接映射到另一个 SW-C | 把车速信号从 Sensor SW-C 路由到 Engine SW-C |
调度执行 | 根据 OS Alarm/Events 周期或事件触发 Runnable;管理 Runnable 的优先级、嵌套、抢占 | 10 ms 触发一次 Runnable_CalcTorque |
数据一致性 | 提供 Direct / Buffered / Queued 三种传输模式,保证并发读写的一致性 | 防止 ABS 和 ESP 同时写“制动压力”变量 |
资源仲裁 | 管理Application对共享资源(如 ADC、EEPROM)的互斥访问,避免冲突 | 两个 SW-C 不能同时调用 NvM_WriteBlock |
模式管理 | 处理 ECU 状态机(RUN/SLEEP/SHUTDOWN)、通信状态机(FULLCOM/SILENTCOM) | 网络唤醒后把 CAN 切换到 FULLCOM |
诊断服务 | 把 DCM 的 UDS 服务请求路由到 DEM、SW-C 或 NVM | 收到 0x22 服务后读取故障码 |
标定 & 测量 | 通过 XCP 把 SW-C 变量暴露给测量工具(如 INCA) | 实时观测空燃比 PID 参数 |
一、RTE作为runnable SWC的运行时环境
使用RTE触发Runnable的SWC有很多种方法,包括如下几种:
SWC是Application层里面的Software Component的缩写,是Application层里的组件单元
二、RTE作为通信接口
可以用作一个Virtual Function Bus赖沟通SWC和BSW
Send/Receiver模式
其中包含了直接传输方式、Buffer缓冲区模式和Queue队列模式
- Direct(直接访问)
- 原理:RTE提供一个全局变量(数据地址),发送方和接收方直接读写该地址,无数据副本。
- 特点:
- 零运行时开销,效率高(“Last is best”原则)。
- 适用于实时性要求高的数据传输。
- 在1:n的场景下会导致数据覆盖问题,新的writer将原有的未读取的数据直接覆盖
- 接口示例:
Std_ReturnType Rte_Write_<Port>_<Data>(<DataType> data); Std_ReturnType Rte_Read_<Port>_<Data>(<DataType>* data);
- Buffered(缓存访问)
在AUTOSAR中,多个Runnable可能同时读写同一个数据元素(如通过RTE的全局变量),导致脏读,写冲突,原子性破坏等风险,AUTOSAR通过**“Copy-In + Copy-Out”**的缓冲模型解决上述问题,这就是Buffered访问,分为以下几步:
- RTE在Runnable启动前,将全局数据复制到Runnable的私有副本(Buffer)。复制是原子操作(通过禁用中断或任务锁保护)。
- Runnable内部操作私有副本,与全局数据完全隔离 ,不会出现多个Runnable同时操作导致的脏读,写冲突,原子性破坏等风险
- Copy-Out(退出Runnable时)Runnable结束前,RTE将私有副本写回全局变量,同样通过原子操作
- 特点:
- 保证Runnable执行期间数据一致性。
- 适用于数据一致性要求高的场景(如多个Runnable并发访问同一数据)。
- 代价是增加了两次内存复制(Copy-In/Out)和写回延迟,适用于对一致性敏感但实时性要求适中的场景(如状态机同步、标定参数)。
- 接口示例:
<DataType> Rte_IRead_<Runnable>_<Port>_<Data>(void); void Rte_IWrite_<Runnable>_<Port>_<Data>(<DataType> data);
- Queued(队列机制)
- 原理:RTE维护一个FIFO队列,发送方将数据写入队列,接收方按顺序读取,不会丢失数据。
- 特点:
- 支持周期性不一致的场景(如发送周期1ms,接收周期5ms)。
- 支持阻塞/非阻塞读取(可配置超时)。
- 接口示例:
Std_ReturnType Rte_Send_<Port>_<Data>(<DataType> data); Std_ReturnType Rte_Receive_<Port>_<Data>(<DataType>* data);
模式 | 实时性 | 数据一致性 | 是否丢数据 | 典型应用场景 |
---|---|---|---|---|
Direct | 高 | 低 | 是 | 高频传感器数据、控制信号 |
Buffered | 中 | 高 | 是 | 多个Runnable共享数据 |
Queued | 低 | 中 | 否 | 事件记录、诊断数据、日志传输 |
Client/Server模式
一种N:1的通信模式,Client会请求Server执行某个动作或函数,类似于我们常见的CS模式。支持同步/异步模式。