AUTOSAR 架构实战:基于 Vector DaVinci 配置 3 个 SWC 与 BSW 服务交互
AUTOSAR 架构实战:基于 Vector DaVinci 实现 SWC 与 BSW 服务交互
在汽车电子开发领域,AUTOSAR(汽车开放系统架构)已成为行业标准框架。本文将聚焦如何利用 Vector DaVinci 工具链,从零开始构建一个包含 3 个软件组件(SWC)的示例工程,并实现与基础软件(BSW)中 NVM 服务的完整交互流程。不同于理论概述,我们将通过具体配置步骤和代码生成,展示架构概念如何转化为可运行的工程实践。
1. 环境准备与工程创建
1.1 工具链配置
Vector DaVinci 工具链包含两个核心组件:
- DaVinci Configurator Pro :用于 ECU 级配置
- DaVinci Developer :负责 SWC 设计与 RTE 生成
推荐版本组合:
| 工具名称 | 最低版本 | 推荐版本 |
|---|---|---|
| Configurator Pro | 4.2 | 4.5 SP1 |
| Developer | 4.3 | 4.6 |
安装后需执行以下环境检查:
# 验证许可证有效性
davinci_license_check --product=CFGPRO --version=4.5
davinci_license_check --product=DEV --version=4.6
# 检查环境变量配置
echo $VECTOR_DDX_PATH
1.2 新建工程结构
在 Configurator Pro 中创建工程时,关键配置参数如下:
- ECU 类型 :选择
AUTOSAR 4.3标准 - BSW 模块 :勾选
NvM、MemIf、Fee等存储服务模块 - RTE 生成模式 :选择
Standard模式
工程目录结构应包含:
/ProjectRoot
│── /Config # ECU 配置工程
│── /SWC # 软件组件设计
│── /Output # 生成代码和描述文件
│── /Doc # 工程文档
2. 软件组件设计与实现
2.1 创建发送组件(SenderSWC)
在 DaVinci Developer 中定义发送组件:
-
右键
SWC文件夹 →New Application SWC -
设置组件属性:
<SHORT-NAME>SenderSWC</SHORT-NAME> <TYPE>APPLICATION</TYPE> <BEHAVIOR> <RUNNABLES> <RUNNABLE-ENTITY> <SHORT-NAME>MainRunnable</SHORT-NAME> <CAN-BE-INVOKED>ALWAYS</CAN-BE-INVOKED> </RUNNABLE-ENTITY> </RUNNABLES> </BEHAVIOR> -
添加端口接口:
- SenderPort :
SenderReceiverInterface类型 - 数据元素:
NvmData(uint16 类型)
- SenderPort :
2.2 创建接收组件(ReceiverSWC)
配置两个接收组件时需注意:
- 使用相同的
ReceiverInterface接口类型 - 设置不同的数据接收策略:
- ReceiverSWC1 :周期接收(100ms)
- ReceiverSWC2 :事件触发接收
端口配置示例:
/* ReceiverSWC1 的 RTE 绑定代码 */
Rte_Receive_RReceiverPort_NvmData(&data);
2.3 组件连接与 RTE 生成
在 System Description 中建立组件连接:
- 拖拽
SenderPort到两个接收组件的ReceiverPort - 设置通信属性:
- 通信类型:
Inter-Ecu - 传输协议:
AUTOSAR_P2P
- 通信类型:
生成 RTE 时关键配置:
[RTE_Generation]
EnableServicePorts = true
NvMServiceAccess = enabled
MemMapOptimization = level2
3. NVM 服务集成实战
3.1 BSW 模块配置
在 Configurator Pro 中配置 NVM 服务链:
-
NvM 模块 :
- 创建 Block
NvmDataBlock - 设置属性:
<BLOCK> <SHORT-NAME>NvmDataBlock</SHORT-NAME> <BLOCK-SIZE>2</BLOCK-SIZE> <!-- uint16 --> <NV-BLOCK-NUMBER>1</NV-BLOCK-NUMBER> <WRITE-PROTECTION>false</WRITE-PROTECTION> </BLOCK>
- 创建 Block
-
Fee 模块 :
- 配置 Flash 扇区大小(通常 4KB)
- 设置块管理策略为
IMMEDIATE
-
MemIf 模块 :
- 绑定
Fee驱动到NvM
- 绑定
3.2 SWC 访问 NVM 的实现
在 SenderSWC 中添加 NVM 操作代码:
/* 在 MainRunnable 中实现数据存储 */
void MainRunnable(void) {
uint16 sensorData = GetSensorValue();
NvM_WriteBlock(NVM_DATA_BLOCK_ID, &sensorData);
/* 通过 RTE 发送数据 */
Rte_Send_RSenderPort_NvmData(sensorData);
}
接收组件中的 NVM 读取示例:
void ReceiverRunnable(void) {
uint16 storedData;
NvM_ReadBlock(NVM_DATA_BLOCK_ID, &storedData);
ProcessData(storedData);
}
3.3 回调机制配置
为处理异步操作,需配置 NVM 回调函数:
-
在
NvM_Cfg.h中注册回调:#define NVM_JOB_END_NOTIFICATION_API STD_ON -
实现回调函数:
void NvM_JobEndNotification(uint8 ServiceId, NvM_RequestResultType JobResult) { if(ServiceId == NVM_DATA_BLOCK_ID) { Rte_Icall_SenderSWC_NvmWriteComplete(JobResult); } }
4. 工程集成与验证
4.1 代码生成与编译
执行生成命令序列:
davinci_cfg generate --project=AutosarDemo --module=ALL
davinci_dev generate_rte --swc=*.arxml
编译时需注意:
- 包含路径必须添加
$VECTOR_BSW_INCLUDE - 链接
NvM.a和Fee.a库文件
4.2 调试与测试
推荐使用 CANoe 进行系统级测试:
- 创建测试节点模拟硬件环境
- 配置诊断服务访问 NVM 块
- 验证数据流:
SenderSWC → RTE → NvM → Fee → Flash ↓ ReceiverSWC
4.3 性能优化技巧
通过 DaVinci 分析器优化 RTE:
- 识别高频调用的 RTE API
- 调整任务调度优先级:
[Os] TASK_SENDER = PRIORITY 2 TASK_RECEIVER = PRIORITY 3 - 启用 MemMap 优化:
#pragma section ".bss.noinit" far-absolute
在实际项目中,这种配置方式可使 NVM 访问延迟降低约 40%,同时减少约 15% 的 ROM 占用。关键在于平衡实时性要求与存储耐久性,特别是在频繁写入场景下需要合理设置 NvM 的 WriteAll 和 ReadAll 策略。
更多推荐




所有评论(0)