1. OTA升级需求分析与功能定义

OTA升级需求分析与功能定义 学习卡片

任务目标

为某车型的整车控制器(VCU)规划首次OTA升级能力,输出一份可评审的需求定义。本次升级聚焦于VCU固件应用层(Bootloader不动),升级包大小约2.3MB,目标是将VCU应用软件从v1.2.0升级至v1.3.0,修复低温环境下电池SOC估算偏差问题。

业务需求定义

1. 升级目标

  • 修复VCU在-10℃以下SOC跳变超过8%的缺陷
  • 优化低温蠕行工况下的扭矩响应平顺性
  • 升级过程不得影响BMS、MCU等其它控制器通信

2. 用户场景

场景触发条件升级窗口约束
4S店保养升级车辆进店,技师发起高压下电,整车休眠后全程约15分钟,需保持蓄电池供电
OTA远程升级用户APP确认,车辆满足条件驻车(P挡)+电量>30%+发动机未启动升级期间禁止行车,需防盗锁定

3. 升级频率

  • 本版本为紧急修复,发布后3个月内完成不低于80%的目标车辆升级
  • 后续常规版本按每季度1次的节奏规划

4. 回滚策略

  • 升级包内同时携带v1.3.0新版本与v1.2.0回滚镜像
  • 升级失败(校验错误、写入超时、升级后VCU无法正常唤醒)时,自动回退至v1.2.0
  • 同一VIN最多允许2次自动回滚,超过后需进店处理

需求文档结构(输出物)

以下为需求文档的章节骨架与关键验收项,可直接作为评审基线:


1. 范围
   - 适用车型:VIN前缀 LSVAM4
   - 升级对象:VCU应用软件(地址0x08010000-0x0803FFFF)
   - 不涉及:Bootloader、BMS、MCU、TBOX

2. 功能需求
   FR-01 升级包完整性校验(CRC32)
   FR-02 升级前置条件检查(P挡/电量/休眠状态)
   FR-03 升级进度上报(10%步进,通过CAN 0x3E1周期发送)
   FR-04 升级失败自动回滚(回滚触发条件见4.2)

3. 非功能需求
   NFR-01 升级包下载时间 ≤ 5分钟(4G网络)
   NFR-02 刷写时间 ≤ 8分钟
   NFR-03 升级失败率 ≤ 1%(同一VIN重试2次后统计)

4. 回滚策略
   4.1 回滚触发条件
       - 条件A:升级包CRC校验失败
       - 条件B:写入Flash后读回校验不一致
       - 条件C:升级完成后VCU 3秒内未发送0x3E2唤醒应答帧
   4.2 回滚执行流程
       - 从备份分区读取v1.2.0镜像 → CRC校验 → 写入应用区 → 复位重启
   4.3 回滚次数限制:2次/VIN,超出后置位故障码U1A00,需进店处理

5. 验收标准
   AC-01 在台架上模拟-15℃环境,升级后SOC估算误差 ≤ 3%
   AC-02 升级过程中BMS报文无丢失(丢帧率=0)
   AC-03 人为中断升级(断电),重新上电后VCU运行v1.2.0且无异常

关键实现:需求追踪矩阵(代码示例)

以下Python脚本将上述需求条目与测试用例建立映射,用于验证需求覆盖率:

```python # requirements_traceability.py # 运行: python requirements_traceability.py requirements = { "FR-01": {"desc": "升级包CRC32校验", "test_cases": ["TC-001", "TC-002"]}, "FR-02": {"desc": "前置条件检查", "test_cases": ["TC-003", "TC-004", "TC-005"]}, "FR-03": {"desc": "升级进度上报", "test_cases": ["TC-006"]}, "FR-04": {"desc": "失败自动回滚", "test_cases": ["TC-007", "TC-008"]}, "NFR-01": {"desc": "下载时间≤5min", "test_cases": ["TC-009"]}, "NFR-02": {"desc": "刷写时间≤8min", "test_cases": ["TC-010"]}, "NFR-03": {"desc": "失败率≤1%", "test_cases": ["TC-011"]}, } test_cases = { "TC-001": "篡改升级包1字节后刷写,应报CRC错误", "TC-002": "正常升级包刷写,CRC校验通过", "TC-003": "P挡+电量35%时允许升级", "TC-004": "D挡时禁止升级", "TC-005": "电量25%时禁止升级", "TC-006": "监听CAN 0x3E1,确认进度值10%步进递增", "TC-007": "刷写中拔出蓄电池,重新上电后运行v1.2.0", "TC-008": "连续回滚3次,第3次置位U1A00", "TC-009": "4G网络下载2.3MB包,计时≤5min", "TC-010": "从刷写开始到复位完成,计时≤8min", "TC-011": "统计100次升级,失败次数≤1", } def check_coverage(): all_tc = set() for req_id, data in requirements.items(): for tc in data["test_cases"]: all_tc.add(tc) assert tc in test_cases, f"{tc} 未在测试用例中定义" untested_reqs = [rid for rid, d in requirements.items() if not d["test_cases"]] orphan_tcs = [tc for tc in test_cases if tc not in all_tc] print(f"需求总数: {len(requirements)}") print(f"测试用例总数: {len(test_cases)}") print(f"需求-用例映射覆盖率: {len(all_tc)}/{len(test_cases)}") if untested_reqs: print(f"[警告] 无测试用例的需求: {untested_reqs}") if orphan_tcs: print(f"[警告] 未关联需求的用例: {orphan_tcs}") print("\n验证通过" if not untested_reqs and not orphan_tcs else "\n存在缺口,请补充") if __name__ == "__main__": check_coverage() ```

运行与验证

  1. 将上述代码保存为 requirements_traceability.py
  2. 执行 python requirements_traceability.py
  3. 通过条件:输出显示"验证通过",且需求-用例映射覆盖率为11/11

需求评审检查单

  • 升级目标是否量化(SOC误差≤3%)?——已定义
  • 是否明确不升级的控制器范围?——已定义(BMS/MCU/TBOX不动)
  • 回滚触发条件是否可测试?——已定义(3个具体条件)
  • 升级频率是否有时限约束?——已定义(3个月80%)
  • 是否包含失败后的用户告知机制?——待补充(建议增加:升级失败后TBOX推送通知,提示用户进店处理)