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模块。

小技巧: 选芯片时,注意看版本号。我曾经遇到过MCAL版本和EB tresos版本不匹配,编译报一堆莫名其妙的错。后来学乖了,每次先查Release Notes。

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的底层部分。

核心要点: EB tresos生成的代码,不要手动修改!你改了一行,下次重新生成就被覆盖了。所有定制化需求,都应该通过配置参数来实现。

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收数据。

避坑指南: 我曾经犯过一个错——在SWC里直接调用BSW的API。这在AUTOSAR里是禁止的!SWC只能通过RTE和BSW交互。如果你发现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管通信,OS管调度。四者各司其职,缺一不可。你只要把每个层的职责搞清楚,AUTOSAR工程就不再神秘了。

嗯,今天就先聊到这儿。下一章我们讲如何把BSW和SWC集成到一起,然后编译烧录。到时候我会分享一个我踩过的坑——RTE配置错误导致任务死循环,排查了整整两天……