4. AUTOSAR工程创建:基于EB tresos创建BSW工程、基于DaVinci创建SWC工程、工程结构解析(BSW、SWC、RTE、OS)
好,咱们进入实操环节。说实话,很多刚接触AUTOSAR的朋友,最头疼的就是工具链那一套。EB tresos、DaVinci Developer、DaVinci Configurator……光听名字就晕了。别急,我带你捋一遍,保证你听完就能上手。
4.1 基于EB tresos创建BSW工程
EB tresos Studio,说白了就是用来配置BSW(基础软件层)的。你想想看,MCAL、OS、通信栈、诊断栈……这些底层的东西,总不能手写吧?EB tresos就是干这个的。
4.1.1 新建工程
打开EB tresos,点击 File → New → AUTOSAR Project。这时候会让你选芯片型号。我习惯先选好MCU,比如NXP的S32K3系列,然后工具会自动加载对应的MCAL模块。
4.1.2 配置BSW模块
工程建好后,左侧会列出所有可配置的模块。比如:
- MCU:配置时钟、PLL、电源模式
- PORT:管脚复用功能
- DIO:数字输入输出
- CAN:CAN控制器和收发器配置
- OS:操作系统配置(任务、中断、资源)
每个模块点进去,都是一堆参数。嗯,这里要注意:不要试图一次性配完所有模块。我刚开始做项目时,恨不得把所有参数都填满,结果配到后面自己都忘了前面设了什么。正确的做法是:先配核心模块(MCU、PORT、OS),能跑起来再说。
4.1.3 生成代码
配置完成后,点击 Generate Code。EB tresos会生成一堆 .c 和 .h 文件。这些文件就是BSW的源码,包括MCAL驱动、OS内核、RTE的底层部分。
4.2 基于DaVinci创建SWC工程
BSW搞定了,接下来是应用层。DaVinci Developer就是用来画SWC(软件组件)的。说白了,就是把你的功能逻辑,拆成一个个组件,然后定义它们之间的接口。
4.2.1 创建SWC
打开DaVinci Developer,新建一个 Application Component。给它起个名字,比如 Swc_EngineControl。然后定义它的端口:
- 提供端口(PPort):比如输出油门开度
- 需求端口(RPort):比如读取车速信号
- 内部行为(Internal Behavior):这里可以关联到你的C代码函数
我个人习惯,每个SWC只做一件事。比如发动机控制一个SWC,变速箱控制另一个SWC。这样后期维护起来,脑子不会乱。
4.2.2 配置RTE
SWC画好了,但SWC之间怎么通信?靠RTE(运行时环境)。DaVinci Configurator会根据你的SWC设计,自动生成RTE代码。你不需要手写RTE,只需要告诉工具:哪个SWC发数据,哪个SWC收数据。
4.3 工程结构解析(BSW、SWC、RTE、OS)
好,现在两个工具都生成了代码。我们来看看整个工程长什么样。一个典型的AUTOSAR工程,目录结构大概是这样的:
Project_Root/
├── BSW/
│ ├── MCAL/ # 微控制器抽象层
│ │ ├── Can/
│ │ ├── Lin/
│ │ ├── Dio/
│ │ └── Mcu/
│ ├── Services/ # 基础服务
│ │ ├── EcuM/ # ECU管理器
│ │ ├── BswM/ # BSW管理器
│ │ └── SchM/ # 调度管理器
│ └── OS/ # 操作系统
│ ├── os.c
│ └── os.h
├── SWC/
│ ├── Swc_EngineControl/
│ │ ├── src/
│ │ └── inc/
│ ├── Swc_Transmission/
│ │ ├── src/
│ │ └── inc/
│ └── Swc_Diagnostics/
│ ├── src/
│ └── inc/
├── RTE/
│ ├── Rte.c # RTE核心代码
│ ├── Rte.h # RTE头文件
│ └── Rte_Swc_EngineControl.h # 每个SWC对应的RTE接口
└── build/
└── Makefile
4.3.1 BSW层
BSW是底层软件,直接和硬件打交道。它包含:
- MCAL:直接操作寄存器,比如CAN收发、GPIO读写
- Services:提供一些通用服务,比如ECU状态管理、错误处理
- OS:任务调度、中断管理、资源锁
你想想看,BSW就像一个操作系统,但它比Linux轻量得多。它只做一件事:为上层提供硬件抽象。
4.3.2 SWC层
SWC是你的业务逻辑。每个SWC都是一个独立的单元,有自己的数据和函数。SWC之间不直接调用,而是通过RTE通信。这样做的好处是:你可以单独测试每个SWC,不影响其他模块。
4.3.3 RTE层
RTE是连接SWC和BSW的桥梁。它负责:
- 数据路由:把SWC的输出,送到另一个SWC的输入
- 通信转换:把SWC的接口调用,映射到BSW的API
- 任务映射:把SWC的运行实体,绑定到OS的任务上
说白了,RTE就是AUTOSAR的「中间人」。没有它,SWC和BSW就是两座孤岛。
4.3.4 OS层
OS是AUTOSAR的调度核心。它管理着所有任务的执行顺序和优先级。常见的配置包括:
| 配置项 | 说明 | 典型值 |
|---|---|---|
| Task数量 | 定义多少个任务 | 10-20个 |
| 任务优先级 | 0最低,255最高 | CAN接收任务设为200 |
| 中断优先级 | 硬件中断的优先级 | 定时器中断设为最高 |
| 调度策略 | 抢占式或协作式 | 通常用抢占式 |
嗯,今天就先聊到这儿。下一章我们讲如何把BSW和SWC集成到一起,然后编译烧录。到时候我会分享一个我踩过的坑——RTE配置错误导致任务死循环,排查了整整两天……