本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。
本系列描述我对书中内容的理解。本文章描述嵌入式安全性和可靠性模式之七:双道模式。
双通道模式
(Dual Channel Pattern) 主要是通过提供多个通道来提高系统的可靠性,从而在架构层面上解决冗余问题。多通道有两种实现方式:
同构冗余通道
:指系统中使用相同设计和功能实现的多个通道(相同的软、硬件)。
该模式能够应对随机故障
,也称为系统失效
(failures),失效是指系统之前运行正常,但某些东西发生了变化,比如汽车传动轴断裂,导致系统进入失效状态。
同构冗余无法解决系统性故障
,也称为错误
(errors),错误是指需求不正确、糟糕的设计或糟糕的实现导致,比如软件有 BUG。异构冗余通道
:系统中使用不同设计或实现方式的冗余通道 (不同的软、硬件)。它能够同时处理失效
和错误
。
摘要
双通道模式
通过复制通道并在其中嵌入管理逻辑,以解决安全性和可靠性问题。这一模式会确定各个通道何时处于“激活”状态,以此提供架构层面的冗余设计。
问题
此模式提供了对 单点故障
(根据所选的具体实现方式,比如同构冗余或异构冗余,可能是 失效
或同时包含 失效和错误
)的防护。依据所采用的模式类型,系统可通过比较各通道之间的信息,当在一个通道中检测到故障时,可以切换至安全状态;或者自动使用另一个通道。
单点故障(Single-point Faults):指系统中一点失效,就会让整个系统无法运作的部件,换句话说,单点故障即会整体故障。
模式结构
模式结构图如下所示:
除了 具体的转换检测器
与当前通道和备用通道之间存在 关联
关系外,其余部分几乎与 受保护的单通道模式
完全一致。需要注意的是,这样的设计使得 检测器
能够禁用当前通道并启用备用通道。
模式详情
传感器驱动
从一个或多个传感器获取物理数据,并将其放入通道进行处理。
执行器驱动
这个类利用计算出的输出值来驱动一个或多个执行器,例如电动机、灯光或加热装置等。
通道
此类是其它实例的容器,用于管理不同的 通道
,在此背景下非常重要,因为它提供了一个“冗余单元”。它自身提供了两个服务方法—— enable()
和 disable()
。
具体的数据转换
此类负责对输入的数据值(来自传感器或前一个 具体的数据转换类 )执行数学变换,并生成输出结果(发送给序列中的下一个 具体的数据转换类或者 执行器驱动
)。在简单情况下,可能只需要单一的 具体的数据转换类,但在更为复杂的应用场景中,可能存在多个不同的具体数据转换类。每一个具体的数据转换类都会对数据进行特定的处理和转换,从而构成整个数据处理通道的核心部分,确保数据在传输过程中逐步转化成适合执行器驱动设备所需的形式,最终驱动物理动作或控制设备行为。
在数据转换链中,某些特定的 具体的数据转换类
构成了检查点,即会在这些点检查数据转换的有效性。对于这些情况,会与特定 具体的转换检查类
进行关联。
关联:UML 中的 关联 表示类与类之间的连接,关联关系使一个类知道另外一个类的属性和方法。这里
具体的数据转换类
知道具体的转换检查类
的函数(即:check() 函数),转换类对象调用检查类提供的方法来检查数据的合法性。
具体的转换检查
这是一个特定的数据 转换检查类
,其作用是在转换链中的某一特定节点上核查数据转换是否有效。
效果
这种模式通过复制通道来解决与安全或可靠性相关的故障问题。通常情况下,这也需要相应地复制一部分硬件资源,因此带来了较高的重复(生产)成本。当这些通道完全一致时,所有副本都会包含相同的错误,在同样的条件下会表现出相同的错误现象。
实现策略
两个通道的管理方式可以根据实际情况采取不同的实现方式。一种常见做法是让两个通道同时运行,并相互比对输出结果——如果两者输出差异超过一定阈值,系统将切换至故障安全状态。另一种选择是一开始仅运行一个通道,一旦检测到故障,立即启用另一个通道,这样即便在出现故障的情况下也能保证服务的持续进行。
实例
见原书。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)