3、OTA系统安全目标与功能安全概念:安全目标导出、功能安全概念(FSC)设计、安全机制分配

好,我们进入第三章。这一章可以说是整个功能安全设计的核心环节——从危害分析到安全目标,再到功能安全概念。说白了,就是回答三个问题:「系统可能会出什么致命问题?」「出问题后允许有多严重?」「怎么用设计来兜住这个底?」

我个人习惯把这一章叫做「从危险到方案的翻译过程」。你想想看,前面我们做的HARA分析,产出了一堆ASIL等级和危害事件。但那些东西工程师没法直接拿去写代码。我们需要把它们翻译成可量化、可验证、可分配的安全需求。这就是安全目标和FSC要做的事。

3.1 安全目标导出:从危害事件到顶层安全要求

安全目标(Safety Goal, SG)是功能安全设计的顶层约束。它描述的是:「当系统发生某种故障时,必须避免什么后果。」

举个例子,我在一个OTA项目中遇到过这样的情况:HARA分析发现,如果刷写过程中ECU意外断电,可能导致A/B分区都不可用,车辆无法启动。那安全目标怎么定?

SG-01:在OTA刷写过程中,若发生电源中断,系统必须确保至少一个可启动的软件分区可用。[ASIL B]

导出安全目标时,有几个关键原则:

  • 每个危害事件至少对应一个安全目标——但可以多个危害事件共享同一个SG
  • 安全目标必须是「可验证」的——你不能写「系统要足够安全」,要写「系统在X条件下,Y事件不发生」
  • ASIL等级继承——安全目标的ASIL取它所覆盖的危害事件中的最高等级

我给大家整理一个常见的OTA系统安全目标示例表:

编号 安全目标描述 关联危害 ASIL
SG-01 刷写过程中,必须防止写入错误的软件版本到目标分区 软件版本错配导致功能异常 ASIL B
SG-02 刷写中断后,系统必须回滚至上一个已知良好版本 刷写中断导致系统不可用 ASIL B
SG-03 OTA下载的软件包必须通过完整性校验,否则不得执行刷写 恶意软件或传输损坏 ASIL C
SG-04 车辆行驶过程中,禁止执行影响动力或制动系统的刷写操作 行驶中刷写导致动力中断 ASIL D

一个小技巧:我习惯在安全目标编号后面加一个后缀,比如「SG-01_F」表示功能安全目标,「SG-01_S」表示信息安全目标。因为OTA系统里功能安全和信息安全经常交织在一起,这样方便追溯。

3.2 功能安全概念(FSC)设计:把安全目标拆成可执行的需求

安全目标定好了,但它是「顶层要求」。怎么落地?这就需要功能安全概念(Functional Safety Concept, FSC)

FSC说白了就是:为了实现某个安全目标,系统需要具备哪些功能?这些功能由谁来完成?

嗯,这里要注意:FSC是系统层面的设计,不是软件或硬件层面的。它描述的是「系统应该做什么」,而不是「代码怎么写」。

举个例子,针对上面的SG-02(刷写中断后回滚),FSC可以这样设计:

FSC-02.1:系统必须维护一个「当前活跃分区」的标识,该标识存储在非易失性存储器中。

FSC-02.2:刷写开始时,先将目标分区标记为「待更新」状态,刷写完成后原子性地切换活跃标识。

FSC-02.3:若刷写过程中检测到故障(如电源中断、校验失败),系统应自动切换至上一个活跃分区。

你看,每个FSC条目都是可分配、可测试的。它不涉及具体是用A/B分区还是其他方案,但明确了系统必须有的行为。

我在做第一个OTA项目时,犯过一个错误:FSC写得太细,直接写到了「使用CRC32校验」这种实现细节。结果评审时被安全经理怼了——「你这是详细设计,不是功能安全概念。」后来我学乖了,FSC只写「什么」和「为什么」,把「怎么做」留给技术安全概念(TSC)。

3.3 安全机制分配:谁来做?怎么做?

FSC定义好了功能需求,接下来就是安全机制分配。这一步是把FSC中的每个安全需求,分配给具体的系统元素——可能是硬件、软件,或者两者的组合。

分配的时候,我一般遵循这个思路:

  1. 先看有没有现成的机制——比如MCU自带的ECC、WDT、MPU,能复用就复用
  2. 再看软件能不能兜底——比如状态机检查、超时监控、心跳检测
  3. 最后才考虑加硬件——比如外部看门狗、独立的监控芯片

给大家看一个实际项目中的分配示例:

FSC编号 安全需求 分配对象 安全机制 覆盖的故障
FSC-02.1 维护活跃分区标识 Bootloader软件 双备份存储 + 位反转校验 存储单元失效
FSC-02.2 原子性切换分区 刷写管理软件 状态机 + 写后读回校验 写操作中断
FSC-02.3 故障时自动回滚 Bootloader + 硬件WDT 超时触发回滚 + 看门狗复位 软件卡死、电源异常
FSC-03.1 软件包完整性校验 安全通信模块(HSM) HMAC-SHA256硬件加速 数据篡改、传输错误

避坑指南:我曾经在一个项目里,把安全机制全部分配给了应用层软件。结果发现应用层本身可能因为故障而失效——你让一个可能出错的模块去保护自己,这不合理。后来我学会了多样性分配:关键安全机制要分配给不同层级(比如硬件+软件、主控+监控),避免单点失效。

3.4 一个完整的实战案例:OTA刷写中断保护

光讲理论太干,我拿一个真实案例串一下整个过程。

背景:某Tier1的OTA网关项目,要求支持远程刷写,但车辆可能在刷写过程中进入地下车库(信号丢失)或电瓶亏电。

第一步:安全目标导出

从HARA中提取出关键危害:「刷写中断导致ECU变砖」。对应的安全目标:

  • SG-OTA-01:刷写中断后,系统必须在100ms内切换至安全模式,并确保至少一个可启动的软件版本可用。[ASIL B]

第二步:FSC设计

针对SG-OTA-01,我设计了三个功能安全概念:

  • FSC-01.1:系统必须实时监控刷写进度和电源状态
  • FSC-01.2:检测到异常时,系统必须执行预定义的回滚流程
  • FSC-01.3:回滚完成后,系统必须自检并上报状态

第三步:安全机制分配

分配结果如下:

  • FSC-01.1 → 硬件:电源监控芯片(独立于主控) + 软件:刷写进度状态机
  • FSC-01.2 → 软件:Bootloader中的回滚逻辑 + 硬件:外部看门狗(防止回滚过程卡死)
  • FSC-01.3 → 软件:自检程序(POST) + 通信模块:上报诊断事件

我个人的一个习惯:在分配完安全机制后,我会画一张安全机制覆盖矩阵。横轴是故障模式,纵轴是安全机制,交叉点打勾表示覆盖。这样一眼就能看出有没有遗漏——如果某个故障模式没有机制覆盖,那就是设计缺陷。

3.5 本章小结

这一章的内容,说白了就是一条线:

  • 危害事件 → 安全目标(翻译成顶层约束)
  • 安全目标 → 功能安全概念(拆成系统级功能需求)
  • 功能安全概念 → 安全机制分配(落实到具体模块)

每一步都有明确的输入输出,也有常见的坑。我记得刚入行时,总觉得FSC就是写文档,没什么技术含量。直到有一次,因为FSC写得太模糊,开发团队理解偏差,导致回滚逻辑实现错误,差点造成量产延期。从那以后,我对FSC的严谨性再也不敢马虎。

下一章我们会讲技术安全概念(TSC)和软硬件层面的具体实现。到时候你会看到,今天这些顶层设计是怎么一步步变成代码和电路的。