我可以通过自己的程序向硬件看门狗发送心跳吗?


14

接下来是史蒂夫·罗比拉德(Steve Robillard)提供的问题和出色的答案:

如何硬重置Raspberry Pi?

如何从我自己的程序向BCM2708的硬件看门狗而不是Linux看门狗守护程序发送心跳信号?换句话说,如果我的程序没有运行(在启动时执行),我想重置RPi,不仅要冻结整个系统。

谢谢。


Answers:


7

您可以,这很容易。RPi具有一个实现标准Linux看门狗API的Linux模块。您可以在此处找到此文档。

现在,如果您阅读此书,您将知道有一个名为的特殊设备文件,/dev/watchdog并且要使用watchdog该文件,必须先打开该文件并写入一些数据(一个字节,最好写入除“ V”以外的其他内容,我会在稍后解释)。如果您不会足够长时间将任何内容写入此文件,watchdog将触发重新启动。您可以在此处找到示例程序(非常简单)。

请注意,在正常情况下,如果关闭/dev/watchdogwatchdog可以将其禁用。有一种称为“魔术关闭功能”的特殊模式,该模式似乎由RPi驱动程序实现,但AFAIK在默认内核配置(CONFIG_WATCHDOG_NOWAYOUT选项)中未启用。在这种情况下,即使您关闭,重启也将被触发,/dev/watchdog除非您在退出应用程序之前向其写入“ V”。

您应该测试一下自己是否确实被禁用(我现在没有RPi可以测试),但是如果没有,则对您不利。如果您的应用程序崩溃,则将关闭看门狗设备文件,并且不会触发重新启动,这就是您想要它的原因。在这种情况下,您可以更改内核配置并重新构建它,也可以编写一个自定义应用程序来监视主应用程序是否正常运行(例如,使用某些IPC方法)。

还有一个ioctl API,它使您可以做更多事情watchdog。例如,您可以设置一个不同的超时-使用WDIOC_SETTIMEOUT的IOCTL(似乎受RPI驱动程序支持)或获取超时-使用WDIOC_GETTIMEOUT的IOCTL(似乎也受支持)。您可能要使用它来修改默认超时(10秒)。硬限制为16秒。这是一个例子:

int timeout = 15;
int fd = open("/dev/watchdog", O_WRONLY);
ioctl(fd, WDIOC_SETTIMEOUT, &timeout);

如果需要,还可以将IOCTL与WDIOC_KEEPALIVE一起使用,而不是编写字符。两种方法均有效。


哦,我忘了-您实际上可以使用watchdogd。它支持调用外部程序,该程序将检查并报告系统状态。阅读此手册页中的
Krzysztof Adamski

谢谢。我知道了!将bcm2708_wdog添加到/ etc / modules之后,我创建了一个简单的VB.NET测试应用程序以检查我的理解:Dim fs As New System.IO.FileStream(fn,IO.FileMode.Open)启动计时器,并运行fs.WriteByte( H)然后fs.Flush()发送心跳。很棒!
盖伊2012年

WDIOC_KEEPALIVE的数字表示是什么?在任何地方都找不到。
Flash Thunder

@FlashThunder:它在这里定义:lxr.free-electrons.com/source/include/uapi/linux/watchdog.h#L29,但是您必须解析几个级别的宏才能找到确切的值。更好的方法是只编写简单的C程序来打印值。只需包含<linux / watchdog.h>。在我的系统是0x80045705
克日什托夫·亚当斯基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.