1. 功能安全架构设计为什么不能只停留在框图
功能安全架构设计不是画几张系统框图那么简单。它是在安全目标和具体实现之间,用一套明确的约束把“万一哪里坏了”这件事逐级约束住。我见过不少项目,HARA做完,安全目标也定了,但进入架构设计时,图纸上只剩几个方框和几条线,评审专家一问“这条安全机制放在哪里、由谁触发、进入什么安全状态”,当场答不上来。这个系列前面几篇讲了安全需求和系统层面的拆解,这篇把重心落在架构设计上:到底该按什么思路拆功能、布安全机制、做ASIL分解,以及在硬件软件架构落地时有哪些容易翻车的地方。如果你正在做控制器类产品的功能安全开发,或者准备迎接第三方审核,这篇内容应该能帮你省不少返工时间。
1.1 安全需求到架构:不是画图,是建立约束
架构设计听起来抽象,但落地时它是一堆约束。比如“电源监控必须在50ms内检测到欠压,并触发安全状态”,这句话本身就限定了硬件监控电路的位置、软件中断的优先级、通信延时的上限。所以我做架构设计时,不是先开画图工具,而是先把所有安全需求转成约束条件列表。
实用做法是:把每条技术安全需求拆成三个问题——由谁检测,传给谁,执行什么反应。检测方可以是传感器、硬件比较器、软件自检、外部看门狗;接收方可以是MCU、独立逻辑控制单元;反应则是切断输出、进入安全状态、降级运行。这三个问题都能给出明确回答,架构基本已经成型,框图只是把这个结果视觉化而已。
1.2 架构设计的输入与输出:一条可追溯的链路
ISO 26262里,架构设计的输入通常包括功能安全概念、技术安全概念、系统需求、相关项定义,以及HARA阶段得到的风险分析结果。输出则包括系统架构设计说明、硬件和软件架构说明、安全机制说明、FMEA/FTA分析结果、ASIL分解论证、软硬件接口定义和追溯矩阵。
很多工程师把“架构设计文档”当成“系统框图加几句话”。但审计时真正需要的是“为什么这样设计”。例如框图里放了两颗MCU,为什么需要两颗?如果其中一颗失效,另一颗能不能独立把系统拉回安全状态?供电是独立还是共享?这些内容如果只画不写,评审很难通过,整改项也往往集中在这些地方。
1.3 不基于架构就动手的常见后果
我看到一些项目,需求还没拆完,已经有人开始写软件FMEA、画PCB了。最后通常出现两种结果:要么需求映射到原理图时找不到对应实现,要么设计评审时被追问“这条安全需求为什么没有体现在架构中”。架构设计做得好,反而能减少后面大量返工。千万别以为它只是文档工作,它本质上是把“安全策略”固化成工程决策的第一步。
2. 功能安全架构设计的核心逻辑:拆解、分解与机制布局
架构设计真正难的不是画图,而是如何往下拆。安全目标通常是一个顶层描述,比如“防止非预期加速”,但落到具体执行器、传感器、通信链路时,需要一层一层拆成可以设计、可以验证的技术指标。这个拆解过程决定了后面硬件选型、软件划分、诊断策略和故障注入测试的成败。
2.1 从安全目标到技术安全需求的拆解方法
我习惯按“功能线”和“失效线”两条路径同时拆。功能线解决“正常时系统要做什么”,失效线解决“失效时如何保证安全”。每条安全目标都可以写成“安全目标 + 触发条件 + 安全状态”的结构。举例:安全目标是“防止转向扭矩意外丢失”,触发条件是“扭矩传感器信号失效”,安全状态是“进入机械回正,并通过仪表提示驾驶员”。
拆到这一层还不算完,还需要继续追问:传感器失效怎么检测?信号偏差多少认为是故障?在多少毫秒内做出反应?反应动作是部分降级还是完全停机?这些指标会直接决定架构上需要哪些监测模块,MCU主频够不够,CAN通信速率能不能满足实时性要求。技术安全需求写不清楚,后面架构就是空中楼阁。
2.2 ASIL分解:不是简单的等级减半
ASIL分解是很多项目踩坑的重灾区。ISO 26262允许把一个ASIL D的目标分解成两个ASIL B的子目标,但前提是两条实现路径要足够独立。独立性不是口头说说,要落到硬件资源、软件分区、通信路径、甚至开发团队上。
举个例子:你打算用两颗MCU做ASIL D分解,那就要回答两个MCU是否共享电源轨、共享晶振,PCB上两条供电通路是否可能因为同一颗LDO失效而同时掉电。如果共享了,独立性就不够,不能直接按分解后的低等级设计。我见过一个控制器,安全目标拆成了两个ASIL B,硬件也放了两颗MCU,但复位电路和调试接口只做了一套。分析之后发现,调试接口的复用逻辑一旦失效,两颗MCU可能同时复位,独立性论证彻底不成立。ASIL分解方案必须细化到硬件原理图去确认,停留在框图层面是靠不住的。
2.3 安全机制的类型与布局原则
安全机制不都是“加个看门狗”这么简单。我一般把它们分成三大类:
- 检测类:感知故障,比如片内自检、RAM测试、信号合理性检测。
- 反应类:故障后的动作,比如请求安全状态、限功率输出、断开执行器。
- 容错类:即使故障发生也能维持安全功能,比如冗余通道、双路比较。
安全机制的布局原则是“检测措施尽量靠近故障源头,反应措施尽量覆盖整个失效链”。比如传感器采集到的信号,如果只在应用层做合理性检查,一旦前置调理电路发生共模失效,传感器输出本身就是错的,应用层检查往往发现不了。这时更好的做法是在模拟前端加入诊断通道,或者对两个传感器信号做交叉比较。安全机制本身也可能失效,所以还要考虑“安全机制的安全机制”,比如看门狗超时后的动作是直接复位还是先切断输出,要让整个链条闭环。
2.4 独立性与资源共享是评审重点
独立性问题在架构评审中占了一半以上的提问。常见现象包括:安全监控功能和普通功能跑在同一个CPU核上;看门狗和主控制器共用同一个参考时钟;两个安全通道共用同一个通信总线段。这些都会引入共因失效,需要在架构设计时明确列出“共享资源清单”,并逐个解释是否接受该风险。
资源竞争同样容易被忽略。多核MCU即使核心独立,但总线仲裁、中断优先级、DMA访问内存等仍然存在竞争。架构设计时最好预留负载余量,并在测试阶段做多工况的时序验证。不要等到软件联调时才发现安全监控任务被普通任务饿死,这种情况在功能安全审核中是很低级的“不符合项”。
3. 硬件架构、软件架构与软硬件接口落地要点
架构设计最终要落实成可实现的硬件和软件结构。这一步对产品形态、成本、性能和功能安全指标都有决定性影响。很多团队在这一阶段才开始做FMEA,但我的经验是FMEA需要从架构评估阶段就介入,否则边设计边补分析,很难保证覆盖完整性。
3.1 硬件架构设计:先画单元再画电路
硬件架构设计不要急着画原理图,先把硬件单元划分清楚。我通常按以下顺序走:
- 列出所有安全相关信号和电源轨。
- 按安全机制分类,明确每个信号的检测点和控制点。
- 选择MCU或SoC,评估内部自检能力能否满足诊断覆盖率。
- 确定外部安全监控路径,例如专用安全芯片、独立看门狗、双通道比较。
- 评估硬件随机失效指标,比如SPFM、LFM和PMHF是否达标。
实际操作中,我会先做一张“技术安全需求与硬件单元映射表”,把每条安全需求对应到具体单元,包括单元失效后被谁检测、检测后谁来响应。这张表做完,原理图设计就有了骨架。诊断覆盖率的预估在架构阶段做一次初算,等FMEDA完成后再修正,不要等板子回来才做。
3.2 软件架构设计:分区、调度与监控
软件架构里,ISO 26262特别强调安全相关软件与安全无关软件之间的分区。在缺乏MMU或MPU支持的裸机系统上,至少要保证指针使用不乱穿;在带操作系统的平台上,要利用内存保护机制把安全相关组件隔离开。如果安全相关代码和普通应用代码混在同一块内存区域,一个模块的缓冲溢出就可能把另一个模块的关键变量冲掉,这种问题在安全审计中被视为严重不符合。
软件架构还要定义清楚时序调度:哪些安全监控任务必须在固定周期内执行,允许的抖动是多少,异常时如何报告。程序流监控也是个核心设计点。你不仅要知道函数跑没跑,还要知道跑的顺序对不对,有些失效会导致函数跳转错乱,比如跳过了关键校验环节直接执行了输出动作。这类问题靠单纯看门狗是发现不了的。
3.3 软件组件鉴定报告怎么审才靠谱
软件组件鉴定是ISO 26262第8部分第12章的要求,简单说就是评估一个现成的、不是你按完整V流程开发的软件组件,是否可以用于安全系统。很多人只让供应商给一份鉴定报告,没有深究支持条件。鉴定报告里至少要看:组件的已知失效模式、使用假设、验证测试报告、集成说明、异常行为限制。
更重要的是“鉴定支持条件”是否真的适合你的项目场景。比如供应商在报告里写“本组件适用于ASIL B及以下,不支持在安全状态下进行动态内存分配”,那你就不能在一个ASIL D系统里直接复用。如果实际使用场景超出了鉴定的前提,这个组件就不能简单接受。
最容易出问题的是编译配置。鉴定报告通常覆盖的是某个具体编译器版本和优化等级,如果你的工程为了性能开了O2甚至O3优化,组件的执行时序和内存布局可能发生变化,原本鉴定过的行为就无法保证。我碰到过一个电机控制库,供应商的鉴定报告只覆盖了最保守的编译选项,项目组为了性能开了O2,评审时被开了严重不符合项。后来要么调回保守选项,要么补做针对性的测试,否则根本不让用。
3.4 软硬件接口映射的细节容易被忽视
系统架构层面会定义软硬件接口,比如寄存器映射、中断路由、DMA通道分配。这里经常出现的问题是:软件安全需求假设了某个硬件机制,但该机制实际只覆盖了部分功能。比如软件认为可以通过12位ADC进行电压阈值判断,但硬件原理图上ADC的参考电压与受控电源共享,一旦受控电源波动,测量结果和实际失效同时发生,软件根本区分不了。
我的建议是,把每一种接口的失效模式列一遍,逐项问“软件能检测出来吗”。检测不出来的,要么换接口方案,要么加硬件诊断。软硬件接口的评审往往比软件设计本身更花时间,但它直接决定了后期问题定位的复杂度。
4. 实操记录:一个车身域控制器的架构设计过程
理论说多了容易飘,分享一个我最近参与的车身域控制器项目。这个项目负责灯光控制、车窗和部分远程诊断,功能安全目标不算很高,但麻雀虽小五脏俱全,架构设计的完整流程都能体现出来。
4.1 项目背景与安全目标
项目中一个典型的安全目标是“防止远光灯控制在关闭状态下被意外点亮”,等级定为ASIL B。相关失效事件包括:MOS驱动电路失效导致误开通、MCU GPIO错误输出高电平、软件跑飞导致状态错误。HARA阶段已经完成,接下来就是架构设计。
4.2 架构方案:ASIL B分解成两条ASIL A路径
我们把安全目标分解成两条路径。路径A是远光灯控制逻辑,负责根据驾驶员指令产生正确的输出信号;路径B是独立监控路径,负责实时检测实际驱动输出状态,发现异常时直接拉低驱动。
路径A和路径B都按ASIL A设计,合起来满足原目标ASIL B的分解要求。但关键是要证明两条路径之间没有共因。硬件上,路径A放在主控MCU里,路径B则放到一颗独立的监控芯片中,用独立ADC通道对远光灯驱动输出采样。两条路径仍然共享12V电源,所以我们额外增加了一个电源监控模块,专门检测欠压和过压。电源异常时,两条路径都无法输出。这个电源监控模块本身按ASIL A设计,用于覆盖共享电源这一共因失效源。
4.3 关键参数与诊断策略
针对“MOS驱动电路失效”这条失效事件,我们定的要求是:检测时间不超过100ms,反应动作是切断MOS栅极驱动并进入安全状态,诊断覆盖率目标定为90%以上。为了提高覆盖率,监控路径没有直接采集MCU最终输出,而是直接采样MOS输出端电压,避免中间环节的失效被漏检。
软件方面,主控路径每20ms通过SPI向监控路径发送心跳信号。监控路径如果连续三次没收到心跳,或检测到驱动输出与期望状态不一致,就立即拉低栅极驱动。这里最容易被做错的是“期望状态”的来源,如果只是简单跟随主控的自报状态,等于让运动员兼任裁判,检测效果会大打折扣。我们是从灯光控制请求、挡位信号、电源状态等独立信息中推导出期望状态的。
4.4 架构评审中收获最大的一个提问
架构评审时请来了一位外部功能安全专家,他问了一个看似基础但关键的问题:主控MCU的晶振停振之后,监控路径怎么知道?我们当时一愣,因为看门狗的正常喂狗机制依赖同一个晶振,如果晶振停振,喂狗动作不会再发生,理论上监控路径确实会在超时后动作。但这个结论没有被记录在架构说明里,等于这个失效链路的保护机制没有形成文档证据。于是我们补写了“时钟失效被看门狗超时覆盖”的分析,并在后续做了故障注入测试验证。这件事让我更确定:架构文档不是写给审核员看的流程文件,而是自己安全逻辑的证明工具。
5. 功能安全架构设计中的常见问题与排查技巧
做了几年功能安全,处理过不少问题,有些问题反复出现。整理成一张速查清单,遇到类似情况可以直接对照。
5.1 架构文档与实现严重脱节
最典型的问题就是架构文档先“理想化”,原理图和代码出来后又不按文档设计。常见于项目进度紧张时,团队先改实现,再回头补文档,补到后面已经对不上。排查思路是定期做“架构追踪”,把每个技术安全需求标识到实际硬件模块或软件组件。如果发现实现与文档不一致,需要判断哪一个才是真正应该执行的方案,然后要么改设计,要么改文档,不能两边各挂一张皮。
5.2 ASIL分解只有等级数字,缺乏独立性论证
评审时经常看到分解方案写“ASIL D拆成ASIL B + ASIL B”,但通篇没有独立性分析。解决问题的办法是硬性要求做一张“共享资源表”:把所有分解路径共用的电源、时钟、通信、存储、软件接口逐项列出,再逐项说明风险和控制措施。一时解释不了的项目,要在FMEA里给出明确结论,不能靠“这个应该没关系”带过。
5.3 软件组件鉴定的支持条件与实际使用不一致
前面提过编译配置问题,这里再强调一遍。拿到鉴定报告后,第一件事不是归档,而是逐条核对“组件鉴定支持条件”与项目的实际使用条件是否一致。包括编译器版本、优化等级、运行库、OS版本、内存布局、中断使用、堆栈大小。任何一项对不上,都要请供应商补充证据。如果供应商给不出,就要自己补测试,否则这个组件在项目里视为未鉴定。
5.4 安全机制有效性评估过于乐观
很多团队喜欢把最终测试数据反推诊断覆盖率,而不是事先根据架构规划覆盖目标。这样容易把修复bug过程中的偶发检测也算进覆盖率,数字虚高。正确顺序应该是在架构方案阶段给出覆盖率预估,通过FMEDA计算确认,最后用故障注入或实测数据验证。每一步推导过程都要留下记录,这样审核员追问时才能完整回答。
| 常见问题 | 排查方向 | 避坑技巧 |
|---|---|---|
| 文档与实现脱节 | 检查需求追踪矩阵 | 每个里程碑做一次架构追踪 |
| ASIL分解无独立性 | 列出共享资源表 | 将独立性分析纳入模板必填项 |
| 软件组件鉴定不足 | 核对鉴定支持条件 | 编译优化等级必须单独确认 |
| 覆盖率虚高 | 对比预估和实测数据 | 覆盖率推导链完整留档 |
6. 支撑工具、评审经验与AI辅助的边界
架构设计不是一个人拍脑袋,需要工具支撑团队协作和专业评审。工具选得好能提高效率,但前提是你要清楚工具解决的是记录和计算问题,而不是帮你自动得出安全结论。
6.1 建模与追踪工具怎么选
架构设计免不了画图。工具方面,SysML、PREEvision这类专业工具可以把需求、架构、接口和追溯关系做成强关联模型。如果项目规模不大,用Excel配合Visio也不是不行,但前提是追溯矩阵必须能完整回答“这条需求由谁实现、由谁验证”。我自己的习惯是在模型里先把软硬件架构、安全机制、接口映射标定好,再导出一份架构需求追溯矩阵用于评审。工具不是最重要的,能够让追溯关系长期稳定地维护下去才是关键。
6.2 故障分析要在架构阶段同步启动
FMEA和FTA不要等详细设计完成才开始。架构阶段可以先做初步FMEDA,估算SPFM、LFM和PMHF。虽然这个时候输入信息不完整,数据可能不准,但它能帮你提前发现安全机制缺口。比如估算出某条传感器信号通道的诊断覆盖率只能达到60%,低于目标值,那你在架构上就需要增加第二传感器或交叉验证机制。如果等到PCB都快画完了才发现覆盖率不够,可调整的余地就非常小。
6.3 聊聊智能体辅助架构设计的现状
最近经常有人问,AI智能体能不能直接辅助功能安全架构设计。我的看法是可以用来做信息检索、生成初稿、整理需求清单、甚至辅助生成FMEA的失效场景,但“失效推理”和“独立性判断”这两件事仍然依赖对具体产品和实际应用的理解。真正引入AI辅助时,至少要要求模型输出能追溯到设计依据,并且经过资深工程师评审。要是把智能体生成的内容直接当成安全评审结论,现阶段风险还是太大了。
7. 最后分享几点个人实践体会
7.1 动笔前先画安全状态转移
每个安全目标对应的状态机一定要先画出来:正常工作态、检测到故障到请求安全状态的过渡态、稳定安全态、故障恢复路径。架构设计时要让每一个状态转移都有明确的触发条件和执行主体。我每次画完状态机,都会发现有些触发条件没有任何硬件或软件在负责,这个习惯帮我提前发现了很多潜在漏项。
7.2 架构是给评审专家的证据链
功能安全架构文档的真正作用是让人相信“这个设计在故障情况下是安全的”。所以不确定的地方宁可写“评估待定”,标注清楚后续需要补充什么工作,也不要为了让文档好看而模糊处理。审核专家最看重的就是在追问中,你能不能用完整逻辑链说明自己的设计依据。
7.3 架构需要随变更持续维护
架构设计不是一次性交付。产品改型、需求变更、器件替换都会影响到原有的安全策略。我们通常每个里程碑都会更新架构文档,并触发一次变更影响分析。ISO 26262第8部分变更管理从来没让我觉得是流程负担,它反而是保护团队不背锅的重要机制。谁改了什么、影响范围在哪、做了哪些验证,这些记录比任何口头承诺都有用。我自己经历过的项目里,凡是变革管理做得好的,后期审核整改项都明显减少。