针对用户问题 “如果用达芬奇配置要怎么配置”,结合上下文(用户前序提问为“总结一下”,且当前参考资料聚焦于 AUTOSAR NvM 模块 与 达芬奇平台(DaVinci)工具链),可明确:该问题实质是——
在达芬奇(DaVinci)开发环境中,如何对 AUTOSAR NvM(非易失性存储器管理器)模块进行工程化配置?
需注意:“达芬奇”在此语境下并非指代硬件平台(如 TI DaVinci OMAP 系列芯片),而是 Vector 公司的 AUTOSAR 基础软件(BSW)配置工具 DaVinci Configurator / DaVinci Developer(常简称 DaVinci),这是汽车电子 ECU 开发中广泛使用的标准配置环境,与 ETAS ISOLAR、EB tresos 等并列为 AUTOSAR 工具链主流方案。参考资料 中提及的 “ETAS ISOLAR 中主要配置内容”,其逻辑结构与 DaVinci 的配置视图高度一致,因此可跨工具迁移理解。
一、问题解构
| 维度 | 分析 |
|---|---|
| 目标模块 | AUTOSAR NvM(NVRAM Manager)—— 非易失性数据持久化核心服务 |
| 配置载体 | DaVinci Configurator(.arxml 项目驱动)或 DaVinci Developer(基于模型的配置) |
| 核心诉求 | 将抽象的 AUTOSAR 标准规范(如 NvMBlockJobPriority, NvMJobPrioritization)映射为可生成代码的可视化/结构化参数 |
| 关键约束 | 需协同底层驱动(Fee/Ea)、RTE 接口、BswM 状态管理,并满足 crash data 实时性要求 |
二、方案推演:达芬奇中 NvM 配置全流程
达芬奇配置遵循 “模块→实例→参数→依赖关联” 四层结构。以 NvM 为例,典型配置路径如下:
✅ 步骤 1:导入/创建 NvM 模块实例
- 在
BSW Modules视图中右键 →Add Module→ 选择NvM(版本需匹配 AUTOSAR 版本,如 4.3.1) - 自动生成
NvM实例(如NvM0),并挂载至 ECU Extract(.ecuc)或 ARXML 包中
✅ 步骤 2:配置全局参数(NvMCommon 类别)
对应参考资料 中 NvMCommon 章节,关键参数在 DaVinci 中表现为树形节点:
| 参数名(DaVinci 显示名) | 含义 | 推荐值 | 说明 |
|---|---|---|---|
NvMJobPrioritization | 是否启用基于优先级的任务调度 | true | 启用立即队列(Immediate Queue)与标准队列分离 |
NvMSizeImmediateJobQueue | 立即队列长度 | ` | |
2~ | |||
| 5` | 仅容纳 ImmediateBlock(Crash Data)写任务 | ||
NvMSizeStandardJobQueue | 标准队列长度 | ` | |
8~ | |||
| 16` | 存储普通读写、擦除、恢复等任务 | ||
NvMMainFunctionPeriod | 主函数调用周期(秒) | ` | |
| 0.01`(10ms) | 控制 NvM_MainFunction() 执行频率,影响响应延迟 | ||
NvMDrvModeSwitch | 写入时是否切换驱动至快速模式 | true | 优化 NvM_WriteAll 性能 |
⚠️ 注意:所有参数均需在
NvM0实例的General或Configuration Parameters子节点中设置,修改后触发Generate Code。
✅ 步骤 3:定义 NvM Block(NvMBlockDescriptor)
每个需持久化的数据对象(如:车速校准值、故障码历史、用户偏好设置)必须封装为一个 NvMBlock。在 DaVinci 中:
- 右键
NvM0→Add NvM Block→ 输入唯一NvMNvramBlockIdentifier(如NVM_BLOCK_ENGINE_TEMP) - 配置核心属性(对照 表格):
# 示例:Crash Data Block(发动机急停标志位)
NvMNvramBlockIdentifier: NVM_BLOCK_EMERGENCY_STOP_FLAG
NvMBlockJobPriority: 0 # 最高优先级,立即写入
NvMBlockManagementType: NVM_BLOCK_NATIVE # 单块管理(非冗余/非数据集)
NvMNvBlockLength: 1 # 1字节布尔标志
NvMRamBlockDataAddress: &g_EmergencyStopFlag # RAM镜像地址(C变量)
NvMBlockUseCrc: true # 启用CRC16校验
NvMBlockUseAutoValidation: true # 下电前自动校验RAM一致性
| 配置项 | DaVinci 路径 | 作用 |
|---|---|---|
NvMBlockJobPriority | NvMBlock → General → Priority | 决定任务入队顺序与抢占行为 |
NvMBlockUseSyncMechanism | NvMBlock → Synchronization → Enable | 启用显式同步回调(NvM_ReadRamBlockFromNvCallback) |
NvMSelectBlockForWriteAll | NvMBlock → WriteAll → Enable | 是否参与 NvM_WriteAll() 批量写入 |
✅ 步骤 4:关联底层驱动与硬件抽象
NvM 不直接操作 Flash/EEPROM,需通过 Memory Abstraction Layer(MAL):
- 在 DaVinci 中配置
Fee(Flash EEPROM Emulation)或Ea(EEPROM Abstraction)模块 - 设置
NvMNvramDeviceId指向对应 MAL 实例(如Fee0) - 通过
NvMNvBlockBaseNumber映射到 MAL 的物理块号(如Fee_Block_0x10) - ✅ 验证依赖:DaVinci 自动检查
NvM↔Fee↔Dcm(诊断)↔Rte的接口一致性
✅ 步骤 5:生成代码与集成验证
- 执行
Generate BSW Source Code→ 输出NvM_Cfg.c/h,NvM_Types.h,NvM_Lcfg.c - 关键生成物示例(C 代码片段):
// NvM_Cfg.c —— 自动生成的配置结构体
CONST(NvM_ConfigType, NVM_CONST) NvM_ConfigRoot = {
.NvMBlockDescriptors = {
[NVM_BLOCK_EMERGENCY_STOP_FLAG] = {
.NvMBlockJobPriority = 0U, // 立即优先级
.NvMBlockLength = 1U,
.NvMRamBlockDataAddress = &g_EmergencyStopFlag,
.NvMNvBlockBaseNumber = 0x10U, // 对应 Fee 块号
.NvMBlockUseCrc = TRUE,
},
// ... 其他 Block
},
.NvMJobPrioritization = TRUE,
.NvMSizeImmediateJobQueue = 3U,
};
- 编译链接后,在应用层调用标准 API:
// 写入 Crash Data(立即触发) NvM_RequestResultType result; NvM_WriteBlock(NVM_BLOCK_EMERGENCY_STOP_FLAG, &flag_value); // 在 NvM_MainFunction() 中被立即队列调度执行
三、达芬奇配置 vs ISOLAR 配置对比(关键差异点)
| 维度 | DaVinci Configurator | ETAS ISOLAR() | 说明 |
|---|---|---|---|
| UI 风格 | 树形导航 + 属性表格 | 多 Tab 页签(NvMCommon / BlockDescriptor / RB Specific) | 功能一致,入口组织不同 |
| RB Specific 支持 | 通过 Vendor Specific 扩展区启用(需导入 Vector Vendor-Specific ARXML Schema) | 原生支持(如 NvMRbInitAtLayoutChange) | DaVinci 需额外加载 vendor 插件 |
| 代码生成粒度 | 生成 .c/.h + RTE 接口声明 + BswM 状态通知配置 | 同样生成完整 BSW 代码,但 ISOLAR 更强调 BswM 集成 | 二者均符合 AUTOSAR SWS 规范 |
| 调试支持 | 集成 CANoe/CANalyzer 仿真,支持 NvM 状态机跟踪 | 支持 ISOLAR-EVE 实时监控 | 工具生态差异,非配置逻辑差异 |
四、典型错误与规避策略(达芬奇实战经验)
| 错误现象 | 根本原因 | 解决方案 |
|---|---|---|
NvM_WriteBlock() 返回 NVM_REQ_NOT_OK | NvMBlockJobPriority=0 但未启用 NvMJobPrioritization=true | 检查 NvMCommon 全局开关 |
NvM_ReadAll() 后 RAM 数据未更新 | NvMBlockUseSyncMechanism=false 且未配置 NvMReadRamBlockFromNvCallback | 启用同步机制或手动实现回调函数 |
编译报错 undefined reference to NvM_Init | NvM 模块未添加到 ECU Extract 的 BSW Module List | 在 ECU Configuration → BSW Modules 中勾选 NvM0 |
Immediate Queue overflow 日志 | NvMSizeImmediateJobQueue 过小 + 高频 Crash Data 写入 | 增大队列尺寸,或合并多个标志至单个 Block |
综上,达芬奇中配置 NvM 是一项结构化、强依赖、需闭环验证的工程活动。其本质是将 AUTOSAR 标准文本(如 SWS_NVRAMManager.pdf )转化为可执行的 C 配置结构体,并确保与底层驱动、上层 RTE 及整车通信协议(如 UDS DTC 存储)无缝衔接。正确配置后,ECU 即具备按需、可靠、分级保障的非易失数据管理能力,为功能安全(ISO 26262 ASIL-B/C)与 OTA 升级提供底层支撑 。
参考来源
- 【AUTOSAR】 项目和代码详解(十五)----AUTOSAR NvM 配置
- 达芬奇模块配置
- 达芬奇PWM模块
- 达芬奇平台-EMCV移植和测试
- 达芬奇平台-EMCV移植和测试
- 【雕爷学编程】MicroPython手册之达芬奇 TKM32F499 ADC (模数转换)

248

被折叠的 条评论
为什么被折叠?



