1. 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() ```运行与验证
- 将上述代码保存为
requirements_traceability.py - 执行
python requirements_traceability.py - 通过条件:输出显示"验证通过",且需求-用例映射覆盖率为11/11
需求评审检查单
- 升级目标是否量化(SOC误差≤3%)?——已定义
- 是否明确不升级的控制器范围?——已定义(BMS/MCU/TBOX不动)
- 回滚触发条件是否可测试?——已定义(3个具体条件)
- 升级频率是否有时限约束?——已定义(3个月80%)
- 是否包含失败后的用户告知机制?——待补充(建议增加:升级失败后TBOX推送通知,提示用户进店处理)