4. 功能安全概念(FSR):安全目标定义、功能安全需求导出、安全机制分配

好,咱们进入功能安全概念阶段。说白了,FSR 就是把前面 Hazard Analysis 的结果,翻译成工程团队能看懂、能执行的具体要求。

我个人习惯把这一步叫做「从危险到需求的桥梁」。你想想看,HARA 分析完了,我们得到一堆 ASIL 等级和危险事件。但这些东西怎么变成工程师能写进代码、画进原理图的东西?嗯,这就是 FSR 要解决的问题。

4.1 安全目标定义:从危险到目标的转化

安全目标,英文叫 Safety Goal,简称 SG。它是对每个危险事件提出的顶层安全要求。

定义安全目标时,我一般遵循三个原则:

  • 每个危险事件至少对应一个安全目标。但一个安全目标可以覆盖多个危险事件。
  • 安全目标要描述「避免什么」,而不是「做什么」。比如「避免显示错误的车速信息」,而不是「车速显示要正确」。
  • 安全目标要包含 ASIL 等级。这个等级直接继承自 HARA 分析结果。

举个例子:

假设 HARA 分析发现:HUD 显示的车速比实际车速高 20km/h,导致驾驶员误判,引发追尾风险。ASIL 等级为 B。

那么安全目标可以定义为:

SG-01: 避免 HUD 显示的车速信息与实际车速偏差超过 5km/h [ASIL B]

我在项目中遇到过一个问题:安全目标写得太笼统。比如「避免显示错误信息」,这等于没说。错误信息有很多种——亮度错误、位置错误、内容错误。每个错误的风险等级可能完全不同。所以,安全目标一定要具体到「什么信息、什么偏差、什么后果」。

4.2 功能安全需求导出:把目标拆成可执行的任务

安全目标定义好了,接下来就是导出功能安全需求,也就是 Functional Safety Requirement,简称 FSR。

FSR 是安全目标的细化。一个安全目标通常会拆成多个 FSR。每个 FSR 要描述:

  • 什么条件下(比如车速 > 30km/h)
  • 什么行为(比如检测到车速信号异常)
  • 什么响应(比如切换到默认安全车速显示)
  • 什么时间要求(比如 100ms 内完成切换)

我常用的导出方法是「5W1H」法:

要素 说明 示例
What 要做什么 检测车速信号有效性
When 什么时候做 每次接收到 CAN 车速报文时
Where 在哪个模块做 HUD 主控 MCU
Who 谁负责 软件团队
Why 为什么需要 避免显示错误车速
How 怎么做 CRC 校验 + 超时检测

拿刚才的 SG-01 举例,可以导出以下 FSR:

FSR-01: HUD 系统应每 20ms 校验一次 CAN 总线上的车速信号 CRC [ASIL B]
FSR-02: 若连续 3 次 CRC 校验失败,HUD 应在 100ms 内切换至默认安全车速显示 [ASIL B]
FSR-03: 默认安全车速显示值应为 0 km/h,并伴有闪烁警告图标 [ASIL B]
FSR-04: 车速信号源切换(如从 CAN 切换到备用信号)应在 50ms 内完成 [ASIL B]

我的经验:FSR 不要写得太细,细到具体寄存器或 API 调用。那是技术安全需求(TSR)的事。FSR 要保持在「系统级」和「功能级」,让不同团队(硬件、软件、光学)都能理解。

4.3 安全机制分配:谁来做、怎么做

安全机制,就是用来检测故障、防止违反安全目标的具体手段。分配安全机制时,我习惯问自己三个问题:

  1. 这个故障能被检测到吗?——如果不能,那就要考虑故障容错设计。
  2. 检测到之后怎么办?——进入安全状态,还是降级运行?
  3. 谁来执行?——硬件、软件,还是两者配合?

常见的 HUD 安全机制分类:

安全机制类型 示例 分配对象
检测机制 CRC 校验、超时检测、回读校验 软件
响应机制 切换到安全状态、显示警告 软件 + 硬件
容错机制 双通道冗余、看门狗 硬件
诊断机制 开机自检、周期性自检 软件

举个例子,针对 FSR-02(CRC 校验失败后的响应),我们可以分配以下安全机制:

SM-01: 软件 CRC 校验模块 [ASIL B, 软件实现]
  - 检测对象: CAN 车速信号
  - 检测方法: 每帧报文计算 CRC 并与发送端对比
  - 覆盖故障: 数据传输错误、位翻转

SM-02: 安全状态切换模块 [ASIL B, 软件 + 硬件]
  - 触发条件: 连续 3 次 CRC 失败
  - 执行动作: 清除显示缓冲区,写入默认安全值
  - 硬件支持: 独立电源域保证切换不受主电源干扰

SM-03: 看门狗定时器 [ASIL B, 硬件]
  - 监控对象: 主控 MCU 运行状态
  - 超时动作: 硬件复位,强制进入安全状态

我曾经踩过一个坑:安全机制分配时,只考虑了「检测」和「响应」,忽略了「诊断」。结果有一次 CRC 校验模块本身出了故障,但没有任何机制能检测到「检测模块失效」这件事。后来我学乖了,每个安全机制都要配一个「自检机制」——说白了,就是「检查检查的人」。

4.4 一个完整的 FSR 示例(HUD 亮度异常)

咱们来个完整的例子,把前面讲的串起来。

场景:HUD 亮度异常升高,夜间行驶时导致驾驶员眩目,引发事故风险。HARA 分析 ASIL 等级为 A。

安全目标:

SG-02: 避免 HUD 显示亮度超过环境光自适应亮度的 120% [ASIL A]

功能安全需求:

FSR-05: HUD 应每 100ms 读取一次环境光传感器数据 [ASIL A]
FSR-06: HUD 应每 100ms 计算一次目标亮度值,并与当前亮度对比 [ASIL A]
FSR-07: 若当前亮度超过目标亮度 20%,HUD 应在 200ms 内将亮度降低至目标值 [ASIL A]
FSR-08: 环境光传感器故障时,HUD 应切换至预设的安全亮度(50% 最大亮度)[ASIL A]

安全机制分配:

SM-04: 环境光传感器有效性检测 [ASIL A, 软件]
  - 检测方法: 传感器自检状态位 + 数值范围检查(0-100000 lux)
  - 故障响应: 标记传感器故障标志位

SM-05: 亮度闭环控制 [ASIL A, 软件 + 硬件]
  - 控制逻辑: PID 控制器,目标亮度与实际亮度偏差 < 5%
  - 硬件支持: PWM 调光电路,分辨率 10bit

SM-06: 亮度超限保护 [ASIL A, 硬件]
  - 检测对象: 实际输出亮度
  - 保护动作: 硬件比较器检测到亮度超过阈值,直接切断 PWM 输出
  - 恢复条件: 系统复位

我个人习惯:每个安全机制分配完后,一定要做一次「覆盖度检查」。拿一张表,左边列所有可能的故障模式,右边列对应的安全机制。如果有故障模式找不到对应的安全机制,那就是遗漏了。这个习惯帮我避免了好几次设计返工。

好了,FSR 阶段的核心内容就是这些。说白了,就是「定义目标 → 拆成需求 → 分配机制」三步走。下一章咱们会讲技术安全概念(TSR),那是把 FSR 进一步细化到具体的技术实现层面。到时候见。