我想听听您对计划生命监控的看法。
这就是场景。你有一个简单的程序通常有效,这意味着它写得很好,处理异常等等。
如果您想确保此计划有效 FOREVER ,您将如何运作?
没有像crontab这样的外部工具可用,但可以添加任何开销。
使用另一个持续“ping”主程序的程序?触摸文件并检查其他程序以进行文件修改?
你如何确保第二个程序始终有效?
所以,来吧,告诉我你在这方面的意见或最佳做法!
作为脚注,我要用Python编写这个程序,但这是一个通用的问题!
答案 0 :(得分:5)
在嵌入式系统中,通常做的是看门狗模块。
监视程序检查某个位置(可能是文件,可能是内存位置,无论如何),如果位置不符合条件,则重新启动正在检查的系统。
因此,您可能在探测程序中执行的操作是定期编写一些带有纪元戳的programname_watchdog文件。这将是常规循环的一部分。
然后你的看门狗(在一个完全不同的过程中)会检查文件。如果列出的日期已经过时,则其他程序将被终止并重新启动,因为它将被视为严重故障(挂起或崩溃)。请注意,您的看门狗将具有一些简单的逻辑,因此失败的可能性要低得多。
我积极还有其他方法可以实现这一目标。这只是一种方式。
编辑:您必须考虑系统构建的堆栈。您拥有的外部依赖项越多,失败的风险就越大。如果您正在寻找完美的操作,您还必须考虑程序正确性的正式证明。
问题真的成为您对系统的期望;什么样的失败是不可接受的,什么样的失败是预期的,所以你可以补偿它们。
这个问题很快成为证明 - 硬件 - 软件协同设计问题(也很昂贵)。我很想知道你在做什么以及你的解决方案是什么。
答案 1 :(得分:0)
您可以采取一些措施使事情变得更加健壮,例如:
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中用于过程控制的实际代码的pseudeocode样本。
它的原始,但它的工作原理。这不仅可以确保远程进程处于活动状态,而且如果远程进程的计算速度有所下降(扫描速率受程序大小和复杂性影响),它将确保两个进程仍然同步。
如果您需要更多数据,请开始调查Modbus使用的返回代码,或OPC协议如何处理其Quality
字节。
答案 2 :(得分:0)
好。我一直在想这个问题,有两件事情已经出现了。
软件看门狗应该如此简单,以至于不可能在附近崩溃。对于疯狂的人来说,一个有趣的编程挑战可能是编写一个 net 的监视器,用不同的语言编写,必须与其他语言保持一致,所有这些都应该监视主进程。
即使具有挑战性和趣味性,但这似乎是浪费时间,而且情景看起来像战争中的士兵。
其次,在我正在开发的应用程序中,我有一个硬件看门狗,它应该始终存在于关键操作中。
所以现在我的应用程序有一个软件看门狗,它可以刷新硬件,并监控程序的使用寿命。
最后,保罗,我完全同意你的看法。