1

我想听听您对程序生命周期监控的看法。

这就是场景。您有一个通常可以运行的简单程序,这意味着它编写得很好,处理了异常等等。

如果您想确保该程序永远有效,您将如何操作?

没有像 crontab 这样的外部工具可用,但可以添加任何开销。

使用另一个不断“ping”主程序的程序?触摸一个文件并用另一个程序检查文件修改?

您如何确保第二个程序始终有效?

所以,来吧,告诉我在这种情况下你的意见或最佳实践是什么!

作为脚注,我必须用 Python 编写这个程序,但这是一个通用问题!

4

3 回答 3

5

在嵌入式系统中,经常做的是看门狗模块。

看门狗检查某个位置(可能是文件,可能是内存位置,等等),如果该位置不符合标准,则重新启动检查中的系统。

因此,您可能会让您的程序处于探测状态,即定期编写一些带有纪元标记的 programname_watchdog 文件。这将是常规循环的一部分。

然后你的看门狗(在一个完全不同的过程中)会检查文件。如果列出的日期已经过时,另一个程序将被终止并重新启动,因为它会被视为严重故障(挂起或崩溃)。请注意,您的看门狗将有一些简单的逻辑,因此它失败的机会要低得多。

我很肯定还有其他方法可以做到这一点。这只是一种方式。

编辑:您必须考虑构建系统的堆栈。您拥有的外部依赖项越多,失败的风险就越大。如果您正在寻找完美的操作,您还必须考虑程序正确性的正式证明。

问题真的变成了您对系统的期望;什么样的故障是不可接受的,什么样的故障是预期的,所以你可以弥补它们。

这个问题很快就变成了一个证明硬件-软件协同设计的问题(而且也很昂贵)。我很想知道您在做什么以及您的解决方案是什么。

于 2010-09-03T17:15:27.150 回答
0

就像 Paul Nathan 说的,使用看门狗。

不过,您可以做一些事情来使事情变得更健壮,例如:

int lastTick;

int RemoteProcessState()
{
    int tick = GetRemoteTick();

    if (tick == -1)
    {
        // Process recoverable error state.
        return -1;
    }

    if (tick == -2)
    {
        // Process unrecoverable error state.
        return -1;
    }

    if (tick < 0)
    {
        // Detect if the watchdog is overflowed.
                    return -1;
    }

    if (abs(abs(tick) - abs(lastTick)) > ALLOWED_PROCESS_LAG)
    {
        // Resynchronize process
    }
    else
    {
        // Process running normally.
    }

    return 0;
}

这是嵌入式 RTU 中用于过程控制的真实代码的伪代码示例。

它的原始,但它的工作原理。这不仅可以确保远程进程处于活动状态,而且如果远程进程的计算速度出现偏差(扫描速率受程序大小和复杂性的影响),它将确保两个进程仍然同步。

如果您需要更多数据,请开始研究 Modbus 使用的返回代码,或者 OPC 协议如何处理管理其Quality字节。

于 2010-09-03T21:17:59.033 回答
0

出色地。我对这个问题思考了很久,结果出现了两件事。

软件看门狗应该非常简单,以至于崩溃应该是不可能的。对于疯狂的人来说,一个有趣的编程挑战可以是编写一个用不同语言编写的看门狗网络,它们必须彼此保持活力,并且应该一起监视主进程。

即使具有挑战性和趣味性,这似乎也很浪费时间,而且场景看起来像战争中的士兵。

其次,在我正在开发的应用程序中,我有一个硬件看门狗,它应该始终存在于关键操作中。

所以现在我的应用程序有一个软件看门狗,它可以刷新硬件,并监控程序的生命周期。

最后,保罗,我完全同意你的看法。

于 2010-09-07T16:11:15.150 回答