2. AUTOSAR架构基础:分层架构概览、应用层与RTE、基础软件层(BSW)简介
好,咱们进入正题。AUTOSAR这个架构,说白了就是一套标准化的汽车软件分层方案。我当年刚接触它的时候,第一反应是——这也太复杂了吧?但干过几个项目之后,你会发现,这套分层设计其实是在帮你省大钱。
为什么这么说?你想想看,没有AUTOSAR之前,每个ECU的软件都是“铁板一块”。换个MCU?重写。换个通信协议?重写。那叫一个痛苦。AUTOSAR的核心思想,就是把应用和硬件彻底解耦。怎么解耦?靠分层。
2.1 分层架构概览:三层两接口
AUTOSAR经典平台,分三层:
- 应用层(Application Layer):写业务逻辑的地方。比如车窗控制、雨刮策略。
- 运行时环境(RTE):虚拟功能总线,负责应用层和BSW之间的通信。
- 基础软件层(BSW):提供标准化的基础服务,比如CAN通信、存储、诊断。
嗯,这里要注意。这三层之间有两个关键接口:
- 应用层通过RTE接口调用BSW服务。
- BSW内部又分了很多子模块,它们之间通过标准API通信。
我个人习惯,把AUTOSAR架构想象成一个“三明治”。应用层是顶层的面包,BSW是底层的面包,RTE就是中间那块火腿。没有火腿,两层面包直接贴在一起,咬一口就散了。
我在项目中遇到过一件事。有个同事想绕过RTE,直接在应用层调用BSW的CAN驱动。结果呢?换了个MCU平台,所有代码都得重写。这就是不遵守分层规则的代价。
2.2 应用层与RTE:你的业务逻辑在这里
应用层,说白了就是SWC(Software Component)的集合。每个SWC封装了一组功能。比如一个“车窗控制SWC”,它内部有算法、有状态机,但它不关心底层用的是CAN还是LIN。
那RTE是干什么的?它负责两件事:
- 通信:SWC之间、SWC与BSW之间的数据交换。
- 调度:决定SWC里的Runnable(可运行实体)什么时候执行。
举个例子。你写了一个车窗防夹功能。这个功能需要读取电机电流,然后判断是否触发反转。在AUTOSAR里,你会把电流读取放在一个Runnable里,把防夹算法放在另一个Runnable里。RTE负责在合适的时机调用它们。
避坑指南:我曾经在配置RTE时,把两个Runnable的触发事件搞反了。一个本应是周期触发的,我配成了事件触发。结果车窗在特定条件下不响应。排查了两天才找到原因。所以,RTE配置一定要仔细核对触发事件。
你可能会问:RTE是怎么生成的?答案是——工具链。比如Vector的DaVinci、EB的tresos。你只需要在工具里画好SWC的接口和连接,工具会自动生成RTE代码。说白了,RTE是“自动生成的胶水代码”。
2.3 基础软件层(BSW)简介:汽车的“操作系统”
BSW,是AUTOSAR里最庞大的一层。它又分四个子层:
| 子层 | 功能 | 我常说的比喻 |
|---|---|---|
| 服务层(Services Layer) | 提供系统级服务,如操作系统、存储管理、诊断 | “汽车的Windows内核” |
| ECU抽象层(ECU Abstraction Layer) | 统一MCU外设的接口,比如ADC、PWM | “硬件驱动的大管家” |
| MCU抽象层(MCU Abstraction Layer) | 直接操作MCU寄存器,最底层 | “跟芯片寄存器打交道的苦力” |
| 复杂驱动(Complex Drivers) | 处理非标准硬件,比如某些专用ASIC | “特事特办的VIP通道” |
嗯,这里要展开说一下服务层。它里面有个很重要的模块——操作系统(OS)。AUTOSAR OS是基于OSEK/VDX标准的,支持多任务、事件、资源锁。在多核MCU上,OS还要负责核间通信和同步。
我记得有一次,我们在一个四核芯片上做调度优化。一开始任务分配不均匀,三个核在忙,一个核在闲。后来通过调整OS的核间任务映射,才把负载均衡做好。这个后面章节会细讲。
注意:BSW的配置非常繁琐。一个典型的项目,BSW配置项可能有上千个。我建议你从“最小系统”开始配——先配好OS、通信栈、存储栈,跑通基础功能,再逐步添加其他模块。别想一口吃成胖子。
2.4 一个简单的分层示例
咱们用代码来感受一下。假设你有一个SWC,它要发送一条CAN消息。在应用层,你只需要调用RTE接口:
/* 应用层SWC代码 */
void SendWindowStatus(void)
{
uint8 status = GetWindowPosition();
/* 调用RTE接口发送CAN信号 */
Rte_Write_WindowStatus_Signal(&status);
}
这个Rte_Write函数,是RTE生成的。它内部会调用BSW的CAN通信栈。你作为应用层开发者,根本不需要知道CAN驱动怎么初始化、怎么配置邮箱。这就是分层的好处。
而在BSW侧,CAN通信栈大概长这样:
/* BSW层 - CAN通信栈简化示意 */
void Can_Write(Can_HwHandleType hth, const Can_PduType* pdu)
{
/* 硬件抽象层调用 */
Can_WriteDataToMailbox(hth, pdu);
}
你看,应用层和BSW层之间,通过RTE隔开了。换MCU?只需要重写MCU抽象层和ECU抽象层,应用层代码纹丝不动。
核心观点:AUTOSAR分层的终极目标,就是让应用层开发者“忘记”硬件。你只管写业务逻辑,剩下的交给BSW和RTE。
2.5 本章小结
这一章咱们聊了AUTOSAR的三层架构:应用层、RTE、BSW。说白了,就是一套“分而治之”的思想。应用层写逻辑,RTE做通信,BSW管硬件。
我个人觉得,理解分层架构的关键,不在于记住每个模块的名字,而在于理解“接口”和“抽象”这两个概念。接口定义了契约,抽象隐藏了实现。只要接口不变,底层随便换。
下一章,咱们会深入BSW的服务层,重点聊聊AUTOSAR OS的任务调度机制。那才是多核优化的主战场。
课后思考:如果你现在要设计一个车窗控制ECU,你会把哪些功能放在应用层?哪些放在BSW?试着画一张分层图,标出每个SWC和BSW模块的接口。
公众号:蓝海资料掘金营,微信deep3321