2、AUTOSAR分层架构详解:应用层(ASW)、运行时环境(RTE)、基础软件层(BSW)的职责与交互
好,咱们今天来聊聊AUTOSAR最核心的东西——分层架构。
很多刚接触AUTOSAR的朋友,一上来就被那几十个模块吓住了。什么BSW、RTE、ASW,还有一堆缩写。其实你把它拆开看,没那么复杂。
我个人习惯把AUTOSAR想象成一栋楼:应用层是住在楼里的住户,基础软件层是水电管网,而RTE就是连接每家每户的电梯和走廊。这个比喻虽然简单,但抓住了精髓。
2.1 应用层(ASW)—— 真正干活的
应用层,全称Application Software Layer,简称ASW。说白了,这就是你写的业务逻辑代码。
比如车窗控制、雨刮器逻辑、空调温度调节、ADAS的决策算法……这些统统属于ASW。它只关心“我要做什么”,不关心“底层硬件怎么实现”。
我在项目中遇到过一件事:有个同事把硬件寄存器操作直接写在了应用层代码里。结果换了一个MCU平台,整个应用层几乎重写。这就是典型的没有分层意识。
ASW由一个个SWC(Software Component,软件组件)组成。每个SWC就像一个小黑盒,有自己的输入输出端口。它通过RTE与其他SWC或BSW通信。
核心要点:应用层代码应该是纯逻辑的,不包含任何硬件相关代码。如果你在ASW里看到了寄存器地址、DMA通道号、中断向量号……那一定是设计出了问题。
2.2 运行时环境(RTE)—— 默默无闻的“快递员”
RTE,Runtime Environment。这个名字听起来很唬人,其实它的职责非常单纯:为SWC提供通信服务。
你想想看,ASW里的SWC之间要传数据,SWC要读写传感器值,SWC要控制执行器……这些数据怎么传递?
答案就是RTE。
RTE生成在应用层和基础软件层之间。它不是一个运行时动态加载的东西,而是在代码生成阶段就静态生成好的。说白了,RTE就是一堆函数调用和API接口。
举个例子:
/* SWC_A 发送数据 */
void SWC_A_Runnable(void)
{
uint8 speed = 100;
/* 通过RTE发送给SWC_B */
Rte_Write_AppSpeed_SpeedSignal(speed);
}
/* SWC_B 接收数据 */
void SWC_B_Runnable(void)
{
uint8 speed;
/* 通过RTE读取 */
Rte_Read_AppSpeed_SpeedSignal(&speed);
/* 处理speed */
}
你看,SWC_A和SWC_B完全不知道对方是谁,也不知道数据是怎么传的。它们只跟RTE打交道。这就是解耦。
我的经验:RTE生成的代码量很大,但千万别手动修改它。我曾经手痒改了一行RTE代码,结果调试了三天才发现是生成的文件被覆盖了。记住,RTE是工具生成的,你只管配置好,剩下的交给工具链。
2.3 基础软件层(BSW)—— 硬件的“翻译官”
BSW,Basic Software Layer。这一层才是真正跟硬件打交道的。
BSW又细分为四部分:
- 服务层(Services Layer):提供操作系统、存储管理、诊断服务、通信管理等。比如OSEK OS、NVRAM Manager、DCM(诊断通信管理器)都在这里。
- ECU抽象层(ECU Abstraction Layer):对MCU内外设进行抽象。比如I/O驱动、ADC驱动、PWM驱动等。它让上层不用关心具体是哪个MCU。
- MCU抽象层(Microcontroller Abstraction Layer):最底层的驱动,直接操作寄存器。比如GPT(通用定时器)、SPI、CAN等。
- 复杂驱动(CDD,Complex Device Driver):处理那些标准模型搞不定的特殊硬件。比如某些非标传感器、专用ASIC等。
我画个简单的层级关系:
| 层级 | 职责 | 举例 |
|---|---|---|
| 应用层(ASW) | 业务逻辑 | 车窗防夹算法、空调PID控制 |
| 运行时环境(RTE) | SWC间通信、SWC与BSW通信 | Rte_Read、Rte_Write、Rte_Call |
| 服务层 | 系统服务 | OS、NvM、Dcm、ComM |
| ECU抽象层 | 外设抽象 | I/O抽象、ADC抽象 |
| MCU抽象层 | MCU驱动 | GPT、SPI、CAN驱动 |
| 复杂驱动(CDD) | 特殊硬件驱动 | 非标传感器驱动 |
2.4 三层之间的交互——数据怎么流动?
好,现在三个角色都认识了。它们之间怎么配合?
我举个实际例子:读取车速传感器。
- MCU抽象层:SPI驱动从传感器芯片读取原始数据(比如0x3F2A)。
- ECU抽象层:把原始数据转换成物理值(比如85 km/h)。
- 服务层:通过COM模块把车速值打包成CAN信号,或者直接提供给RTE。
- RTE:把车速值路由到需要这个数据的SWC(比如仪表盘SWC、限速报警SWC)。
- ASW:仪表盘SWC拿到车速值,决定指针转到85的位置。
你看,数据从最底层一路向上,每一层只做自己分内的事。这就是分层的魅力。
避坑指南:我曾经见过一个项目,为了性能优化,把BSW的某个函数直接暴露给了ASW调用。结果换了一个BSW版本,那个函数名变了,整个应用层编译不过。记住:ASW只能通过RTE访问BSW,这是铁律。
2.5 为什么非要这么分层?
你可能会问:搞这么复杂,直接写个main函数不香吗?
嗯,这个问题我当年也问过。但当你面对一个项目有几十个ECU、几百个SWC、多个供应商协作时,你就明白了。
分层的好处:
- 复用性:BSW可以跨项目复用。换一个MCU,只需要换MCU抽象层,上层代码不用动。
- 可移植性:ASW代码可以轻松移植到不同平台。我见过一个团队把ASW从英飞凌移植到瑞萨,只改了一天。
- 分工明确:应用工程师只写逻辑,底层工程师只写驱动。各管各的,互不干扰。
- 标准化:所有接口都是标准化的。供应商A的BSW和供应商B的ASW可以无缝对接。
说白了,AUTOSAR的分层架构,就是为了让汽车软件开发从“手工作坊”走向“工业化流水线”。
好,这一章就到这里。下一章我们深入RTE,看看它到底是怎么生成出来的,以及那些让人头疼的配置项到底该怎么填。