接下来是史蒂夫·罗比拉德(Steve Robillard)提供的问题和出色的答案:
如何从我自己的程序向BCM2708的硬件看门狗而不是Linux看门狗守护程序发送心跳信号?换句话说,如果我的程序没有运行(在启动时执行),我想重置RPi,不仅要冻结整个系统。
谢谢。
接下来是史蒂夫·罗比拉德(Steve Robillard)提供的问题和出色的答案:
如何从我自己的程序向BCM2708的硬件看门狗而不是Linux看门狗守护程序发送心跳信号?换句话说,如果我的程序没有运行(在启动时执行),我想重置RPi,不仅要冻结整个系统。
谢谢。
Answers:
您可以,这很容易。RPi具有一个实现标准Linux看门狗API的Linux模块。您可以在此处找到此文档。
现在,如果您阅读此书,您将知道有一个名为的特殊设备文件,/dev/watchdog
并且要使用watchdog
该文件,必须先打开该文件并写入一些数据(一个字节,最好写入除“ V”以外的其他内容,我会在稍后解释)。如果您不会足够长时间将任何内容写入此文件,watchdog
将触发重新启动。您可以在此处找到示例程序(非常简单)。
请注意,在正常情况下,如果关闭/dev/watchdog
,watchdog
可以将其禁用。有一种称为“魔术关闭功能”的特殊模式,该模式似乎由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一起使用,而不是编写字符。两种方法均有效。
0x80045705