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 中定义发送组件:

  1. 右键 SWC 文件夹 → New Application SWC

  2. 设置组件属性:

    <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>
    
  3. 添加端口接口:

    • SenderPort SenderReceiverInterface 类型
    • 数据元素: NvmData (uint16 类型)

2.2 创建接收组件(ReceiverSWC)

配置两个接收组件时需注意:

  • 使用相同的 ReceiverInterface 接口类型
  • 设置不同的数据接收策略:
    • ReceiverSWC1 :周期接收(100ms)
    • ReceiverSWC2 :事件触发接收

端口配置示例:

/* ReceiverSWC1 的 RTE 绑定代码 */
Rte_Receive_RReceiverPort_NvmData(&data);

2.3 组件连接与 RTE 生成

在 System Description 中建立组件连接:

  1. 拖拽 SenderPort 到两个接收组件的 ReceiverPort
  2. 设置通信属性:
    • 通信类型: Inter-Ecu
    • 传输协议: AUTOSAR_P2P

生成 RTE 时关键配置:

[RTE_Generation]
EnableServicePorts = true
NvMServiceAccess = enabled
MemMapOptimization = level2

3. NVM 服务集成实战

3.1 BSW 模块配置

在 Configurator Pro 中配置 NVM 服务链:

  1. 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>
      
  2. Fee 模块

    • 配置 Flash 扇区大小(通常 4KB)
    • 设置块管理策略为 IMMEDIATE
  3. 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 回调函数:

  1. NvM_Cfg.h 中注册回调:

    #define NVM_JOB_END_NOTIFICATION_API STD_ON
    
  2. 实现回调函数:

    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 进行系统级测试:

  1. 创建测试节点模拟硬件环境
  2. 配置诊断服务访问 NVM 块
  3. 验证数据流:
    SenderSWC → RTE → NvM → Fee → Flash
                ↓
            ReceiverSWC
    

4.3 性能优化技巧

通过 DaVinci 分析器优化 RTE:

  1. 识别高频调用的 RTE API
  2. 调整任务调度优先级:
    [Os]
    TASK_SENDER = PRIORITY 2
    TASK_RECEIVER = PRIORITY 3
    
  3. 启用 MemMap 优化:
    #pragma section ".bss.noinit" far-absolute
    

在实际项目中,这种配置方式可使 NVM 访问延迟降低约 40%,同时减少约 15% 的 ROM 占用。关键在于平衡实时性要求与存储耐久性,特别是在频繁写入场景下需要合理设置 NvM 的 WriteAll ReadAll 策略。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐