3、安全生命周期(上):概念阶段、产品开发阶段、生产与运行阶段

各位工程师朋友,咱们今天聊聊安全生命周期。说实话,这个概念刚入行时我觉得挺虚的——不就是画个流程图吗?直到我在一个项目中,因为忽略了生产阶段的某个环节,导致批量返工……嗯,从那以后,我对这个生命周期是真心敬畏。

ISO 26262把安全生命周期分成三个阶段:概念阶段产品开发阶段生产与运行阶段。今天咱们先讲前两个,第三个留到下一章细说。

3.1 概念阶段:从零到一的基石

概念阶段说白了就是「想清楚再动手」。我见过太多项目,上来就写代码、画原理图,结果做到一半发现安全目标没对齐,推倒重来。你想想看,那得多痛?

3.1.1 项目定义

这一步是安全生命周期的起点。你要回答几个核心问题:

  • 这个系统是干什么的?
  • 用在什么车型上?
  • 有哪些功能?
  • 边界在哪里?

我个人习惯,在项目定义阶段就拉上系统工程师、硬件工程师、软件工程师一起开会。别小看这个会,它能避免后面80%的沟通问题。

小技巧:项目定义文档里,一定要写清楚「系统不做什么」。有时候,明确边界比明确功能更重要。

3.1.2 危害分析与风险评估(HARA)

HARA是概念阶段的重头戏。它的目标就是找出所有可能的危害,然后评估风险等级。

怎么做?我一般分三步:

  1. 场景分析:想象所有可能的驾驶场景。比如高速行驶、城市拥堵、雨雪天气……
  2. 危害识别:每个场景下,系统失效会导致什么后果?比如刹车失灵、转向卡死。
  3. 风险等级评定:用ASIL等级(A、B、C、D)来量化风险。

举个例子,我在做电动助力转向项目时,发现一个场景:车辆在高速上行驶,如果转向助力突然消失,驾驶员需要更大的力才能转动方向盘。这个危害的ASIL等级是D——最高等级。

重要提醒:HARA不是一次性工作。随着项目推进,你会发现新的场景、新的危害。所以,HARA文档要持续更新。

3.1.3 安全目标定义

有了HARA的结果,接下来就是定义安全目标。安全目标是对每个危害的「安全要求」。比如:

  • 「转向助力不能无故消失」
  • 「制动系统必须在200ms内响应」
  • 「电池温度不能超过60°C」

每个安全目标都要有明确的ASIL等级。我记得有个项目,安全目标写得太模糊,比如「系统要安全」。这等于没写。安全目标必须可验证、可测试。

3.2 产品开发阶段:把安全目标落地

概念阶段结束后,就进入产品开发阶段。这个阶段分两条线:系统层面硬件/软件层面

3.2.1 系统层面开发

系统层面开发,核心是技术安全概念。说白了,就是把安全目标翻译成技术方案。

举个例子,安全目标是「转向助力不能无故消失」。技术安全概念可能包括:

  • 双路供电设计(一路失效,另一路顶上)
  • 故障检测机制(每10ms自检一次)
  • 降级模式(助力失效时,切换到机械模式)

我建议,技术安全概念一定要写清楚「正常模式」和「故障模式」分别怎么工作。很多项目只关注正常模式,忽略了故障模式,结果测试时才发现问题。

避坑指南:我曾经在一个项目中,技术安全概念写得过于理想化,忽略了实际硬件的延迟。结果仿真通过,实车测试时故障响应慢了200ms。从那以后,我要求所有技术安全概念必须包含「时序分析」。

3.2.2 硬件层面开发

硬件层面开发,核心是硬件安全需求硬件设计

硬件安全需求包括:

  • 失效率指标(比如FIT值)
  • 诊断覆盖率(比如90%的故障能被检测到)
  • 安全机制(比如看门狗、冗余设计)

硬件设计时,我习惯用FMEA(失效模式与影响分析)来评估每个元器件的风险。比如一个电阻短路会怎样?一个电容开路会怎样?把这些都列出来,然后设计对应的安全机制。

这里有个表格,是硬件安全需求的一个示例:

安全目标 硬件安全需求 安全机制 ASIL等级
转向助力不能无故消失 主电源失效率 < 10 FIT 双路供电、电压监控 D
制动响应时间 < 200ms MCU处理延迟 < 50ms 看门狗、任务监控 C
电池温度不能超过60°C 温度传感器精度 ±1°C 冗余传感器、交叉校验 B

3.2.3 软件层面开发

软件层面开发,核心是软件安全需求软件架构设计

软件安全需求要细化到每个函数、每个接口。比如:

  • 「故障检测函数每10ms执行一次」
  • 「错误处理函数必须在5ms内完成」
  • 「通信接口必须使用CRC校验」

软件架构设计时,我推荐使用分层架构。把安全相关的功能和非安全相关的功能分开。这样,安全相关的代码更容易验证,也更容易维护。

举个例子,一个简单的安全监控代码:

// 安全监控任务,每10ms执行一次
void SafetyMonitor_Task(void)
{
    // 1. 读取传感器数据
    uint16_t sensor_value = ReadSensor();
    
    // 2. 检查是否超出阈值
    if (sensor_value > MAX_THRESHOLD)
    {
        // 3. 触发安全机制
        EnterSafeState();
        SetFaultCode(FAULT_OVERTEMP);
    }
    
    // 4. 记录诊断信息
    UpdateDiagnosticCounter();
}

这段代码看起来简单,但要注意:安全代码不能有死循环、不能有动态内存分配、不能有递归调用。这些都是安全编码规范里的硬性要求。

个人经验:软件安全需求写完后,一定要做「需求追溯」。每个安全需求都要能追溯到对应的安全目标。我习惯用Excel或者需求管理工具,建立一个追溯矩阵。这样审核时一目了然。

3.3 生产与运行阶段:安全不止于设计

很多工程师觉得,安全生命周期到产品开发就结束了。其实不然。生产与运行阶段同样重要。

生产阶段要确保:

  • 生产工艺符合安全要求
  • 每个产品都经过安全测试
  • 生产过程中的变更要受控

运行阶段要确保:

  • 车辆在使用过程中,安全功能正常工作
  • 出现故障时,系统能正确响应
  • 有完善的售后维护和召回机制

我记得有个项目,设计阶段做得很好,但生产时因为某个供应商换了元器件,导致安全机制失效。还好在生产测试阶段发现了,不然批量装车后果不堪设想。

核心观点:安全生命周期不是一条直线,而是一个闭环。从概念到生产,再到运行,每个阶段都要有反馈机制。发现问题,及时修正,持续改进。

3.4 本章小结

好了,咱们今天讲了安全生命周期的前两个阶段:

  • 概念阶段:项目定义、HARA、安全目标
  • 产品开发阶段:系统层面、硬件层面、软件层面
  • 生产与运行阶段:简单提了一下,下一章细讲

你可能会问,这些阶段之间怎么衔接?我的答案是:文档。每个阶段的输出都是下一个阶段的输入。文档写得好,衔接就顺畅。文档写得差,后面全是坑。

下一章,咱们继续聊生产与运行阶段的细节,以及安全生命周期的维护和变更管理。到时候见。