4、异构冗余(Diverse Redundancy):原理、在避免共因失效(CCF)中的作用、实际案例。

聊完同构冗余,咱们得聊聊它的“升级版”——异构冗余。

同构冗余说白了就是“复制粘贴”。两个一模一样的通道,用一样的芯片、跑一样的代码。这能对付随机硬件故障,但遇到共因失效(CCF)就抓瞎了。你想想看,如果设计本身有缺陷,或者编译器出了bug,所有通道会一起挂掉。

我早年在一个制动控制项目里就吃过这个亏。当时用了三取二架构,三个通道一模一样。结果现场电磁干扰一上来,三个通道的ADC采样值同时跳变,系统直接宕机。从那以后,我对“一模一样”这四个字就特别警惕。

4.1 什么是异构冗余?

异构冗余,就是让多个通道用不同的方式实现同一个功能。差异可以体现在硬件、软件、算法,甚至开发工具链上。

它的核心逻辑是:如果两个东西不一样,它们同时犯同一个错误的概率就极低。

异构冗余的三大维度:

  • 硬件异构:不同架构的MCU(比如ARM + RISC-V),不同型号的传感器,不同厂家的执行器。
  • 软件异构:不同编程语言(C + Ada),不同编译器,不同算法实现(查表法 vs 计算法)。
  • 设计异构:不同团队独立开发,不同设计规范,不同测试用例。

我个人的习惯是,在ASIL D级别的项目中,至少要在两个维度上实现异构。光换芯片不换软件,效果会打折扣。

4.2 异构冗余如何对抗共因失效?

共因失效(CCF)是功能安全里最头疼的问题之一。它不像随机故障那样有失效率可以算,它往往是系统性、设计层面的问题。

ISO 26262-10 里专门有一章讲CCF的防护。异构冗余就是最有效的武器之一。

CCF 来源 同构冗余的弱点 异构冗余的防护
设计缺陷 所有通道继承同一个bug 不同设计团队,bug不会重合
编译器错误 相同代码被相同编译器编译 不同编译器/语言,错误路径不同
电磁干扰 相同硬件对干扰敏感度一致 不同硬件对干扰响应不同
温度漂移 相同器件漂移特性一致 不同器件漂移曲线不同
算法缺陷 相同算法在边界条件失效 不同算法覆盖不同边界

说白了,异构冗余就是“不把鸡蛋放在同一个篮子里”,而且连篮子的编织方法都不一样。

避坑指南:我曾经见过一个项目,号称做了异构冗余——用了两个不同型号的MCU,但软件是同一份代码,只是重新编译了一下。结果一个边界条件导致两个通道同时输出错误。这不算真正的异构,只能算“换汤不换药”。

4.3 异构冗余的典型架构

实际项目中,异构冗余通常和同构冗余结合使用。我画了一张图,帮你理清常见的组合方式。

异构冗余典型架构组合 系统输入 通道A:ARM Cortex + C代码 算法:查表法 通道B:RISC-V + Ada代码 算法:计算法 比较/表决器 安全输出 关键点:两个通道从硬件架构、编程语言到算法实现都不同 即使一个通道因设计缺陷失效,另一个通道大概率仍能正常工作

这个架构里,两个通道在三个维度上实现了异构:

  • 硬件:ARM vs RISC-V,指令集完全不同
  • 软件:C语言 vs Ada语言,编译器不同
  • 算法:查表法 vs 计算法,实现逻辑不同

表决器负责比较两个通道的输出。如果一致,输出结果;如果不一致,进入安全状态。

4.4 实际案例:线控制动系统

讲个我参与过的真实案例。某款线控制动系统,要求ASIL D,核心功能是“驾驶员踩刹车 -> 控制器计算制动力 -> 电机推动制动钳”。

我们最初的设计是双通道同构冗余。结果在HIL测试中发现,当温度超过85°C时,两个通道的电流采样值同时漂移,导致制动力计算偏差超过20%。

后来改成了异构冗余方案:

维度 通道A 通道B
主控芯片 Infineon TC3xx (TriCore) NXP S32K (ARM Cortex)
编程语言 C (GCC编译器) C++ (IAR编译器)
电流采样 霍尔传感器 + ADC 分流电阻 + 隔离运放
制动力算法 PID控制 模糊控制
故障诊断 基于模型 基于规则

效果如何?改完之后,同样的温度测试,两个通道的偏差方向完全相反。通道A偏大,通道B偏小,表决器直接报差异超限,系统进入降级模式。虽然功能受限,但至少没有完全失效。

这个案例让我深刻体会到:异构冗余不是为了“好看”,而是为了覆盖那些你根本想不到的失效模式。

4.5 异构冗余的代价与权衡

当然,异构冗余不是万能的。它也有明显的代价:

  • 开发成本翻倍:两套硬件、两套软件、两个团队,投入至少是1.5倍以上。
  • 验证复杂度增加:需要证明两个通道确实“异构”,而不是“看起来异构”。
  • 表决逻辑变复杂:两个通道的精度、响应时间可能不同,需要设计合理的比较窗口。

注意:异构冗余不能解决所有CCF。比如电源共因、时钟共因、接地共因,这些需要靠物理隔离和独立供电来解决。异构冗余主要针对的是“设计共因”和“工具链共因”。

我个人建议,在项目初期就做好CCF分析,识别出最关键的共因失效场景,然后针对性地引入异构。不要为了异构而异构,那样只会增加成本,不会增加安全。

4.6 小结

异构冗余的核心思想就一句话:用多样性对抗未知的共因失效。

它和同构冗余不是替代关系,而是互补关系。同构冗余对付随机硬件故障,异构冗余对付系统性设计缺陷。两者结合,才能构建真正高可靠的安全系统。

嗯,这一章就聊到这儿。记住,下次做架构设计时,多问自己一句:“如果所有通道都犯同一个错,怎么办?”