3

我正在开发一个需要我实施 2oo3 投票的安全系统。我大致有一个使用状态机使用函数指针来实现它的想法。假设有 3 个系统 AB C。关于 A,C 是左系统,B 是右系统 对于 B,A 是左系统,C 是右系统 对于 C,B 是左系统,C 是右系统系统

对于系统做出的每一个决定,它都应该使函数指针指向“与左系统交换数据”函数。数据发送到左系统后,它将指向一个虚拟函数并等待左系统回复。

当左系统回复并且它的决定(左系统)也同意系统(我的系统)做出的决定时,它将进入下一个状态。如果不同意,则应重复“与正确的系统交换数据”并继续。

我的疑问是因为我不想使用标志来实现状态转换控制,使用函数指针的实现是否可以,因为 MISRA 2004 以后没有说不使用函数指针?

上述 2oo3 实现的方法是否可行,或者还有其他需要注意的事项吗?

是否有任何其他方法来实现 2oo3 架构(每个系统做出的决定没有外部比较器。也就是说,每个 uC 应自己形成一个决定并与其他 2 协商它的决定。它不会将其决定放在外部比较器中(例如:共享内存、基于 fpga 的比较器等)供其他 2 个系统访问和比较)??

如果我错误地接近它,请原谅我。我是这个的新手。

(注:3 个系统只有微控制器)

更新:@Lundin 在这里添加了一些有用的点 -没有函数指针的状态机设计

4

1 回答 1

2

我的疑问是因为我不想使用标志来实现状态转换控制,使用函数指针的实现是否可以,因为 MISRA 2004 以后没有说不使用函数指针?

你是从哪里得到这个想法的?任何 MISRA-C 标准中都没有禁止使用函数指针。MISRA-C 几乎没有提到函数指针。MISRA-C 唯一不允许的是函数指针和常规指针之间的野转换,因为这会调用未定义的行为。

实现状态机的事实上的标准方法通常是使用状态变量,例如枚举,它指出函数指针数组中的索引。是一个典型的例子,乍一看似乎 100% 符合 MISRA。

上述 2oo3 实现的方法是否可行,或者还有其他需要注意的事项吗?

在不知道您的要求的情况下,没有人可以说出来。通常在设计此类安全关键系统(多数投票者)时,您希望实际的“投票”位于 CPU 之外的硬件中,因为它的全部目的是防止出现故障的子系统/CPU。(“选民”硬件本身可能会受到监督。)因此,您的方法存在一些问题:

  • 主要问题:如果 A 投票 B,但 A 本身已经失控,那么它将“撒谎”B 的投票。本质上,腐败的节点 A 将获得 2 票,整个系统的安全性将失败。冗余系统的全部目的是防止处理器/程序失控。如果所涉及的 CPU / 子系统都不会出现问题,那您为什么需要多数投票者一开始呢?你试图保护自己免受什么失败?

  • 如果 A 投票给 B 投票,而 B 从来没有回应,或者回应是胡说八道,那怎么办?这种情况需要在您的规范中说明。超时、错误检测、错误行为等。

还要考虑:“多数选民”是一些 80 年代的流行词技巧。它可能有意义,也可能没有意义:它可能会提高安全性,也可能完全是一派胡言。请注意在错误的安全性中进行设计,并注意危险的“安全”标准,在不了解系统细节的情况下使用多数投票者盲目宣扬。

在这里盲目相信“SIL”61508/26262 标准可能特别危险,因为它们缺乏推荐“多数选民”的理由/现代资源。例如,参见 IEC 61508-7 A.1.4,这完全是胡说八道:来源是 80 年代仅以德语提供的技术论文。笑还是哭?

运用常识比那些标准的内容重要得多!

为什么要在安全关键系统中使用三分之二?那是系统故障的 33%,您为什么希望系统在这种情况下继续运行?在许多系统中,33% 的系统故障将是相当灾难性的……同样,在许多系统中,66% 的“诊断覆盖率”会被认为是极差的。

整个安全系统的设计实际上取决于什么被认为是安全状态以及在严重故障时应该做什么。安全状态是“停止一切”(典型的工业应用)还是“尽可能地保持运行/跛行”(典型的汽车/医疗应用)。

再一次,这一切都指向规范,这对于这类系统来说是非常重要的。

于 2016-01-12T09:23:15.427 回答