谁在Linux中刷新硬件看门狗?

我有一个运行2.6内核的处理器AT91SAM9G20。 看门狗在引导级别启用并configuration为16秒。 看门狗模式寄存器只能configuration一次。 当代码在bootstrap,bootloader或kernel中挂起时,电路板将重新启动。 但是一旦内核出现即使看门狗在任何应用程序中都没有刷新,板子在16秒后也没有被复位,而是15分钟。

谁在清醒看门狗?

在我们的例子中,看门狗应该受到应用程序的影响,所以如果我们的应用程序挂起,这个板子可以重置。

这些是运行过程:

1 root init 2 root [kthreadd] 3 root [ksoftirqd/0] 4 root [watchdog/0] 5 root [events/0] 6 root [khelper] 63 root [kblockd/0] 72 root [ksuspend_usbd] 78 root [khubd] 85 root [kmmcd] 107 root [pdflush] 108 root [pdflush] 109 root [kswapd0] 110 root [aio/0] 740 root [mtdblockd] 828 root [rpciod/0] 982 root [jffs2_gcd_mtd10] 1003 root /sbin/udevd -d 1145 daemon portmap 1158 dbus dbus-daemon --system 1178 root /usr/sbin/ifplugd -i eth0 -fwI -u0 -d5 -l -q 1190 root /usr/sbin/ifplugd -i eth1 -fwI -u0 -d5 -l -q 1221 default avahi-daemon: running [SP14.local] 1226 root /usr/sbin/dropbear 1246 root /root/bin/host_app 1254 root /root/bin/mini_httpd -c *.cgi -d /root/bin -u root -E /root/bin/ 1256 root -sh 1257 root /sbin/syslogd -n -m 0 1258 root /sbin/klogd -n 1259 root /usr/bin/tail -f /var/log/messages 1265 root ps -e 

我们在kernel-2.6.25-ts.at91sam9g20 / kernel / softlockup.c中使用看门狗进行软locking

Solutions Collecting From Web of "谁在Linux中刷新硬件看门狗?"

如果在内核中启用了看门狗驱动程序,则看门狗驱动程序会设置一个内核定时器,负责复位看门狗。 相应的代码在这里 。 所以它是这样工作的:

如果没有应用程序打开/ dev / watchdog文件,那么内核负责重置看门狗。 由于它是一个计时器,它不会显示为专用内核线程,而是由软IRQ线程处理。 现在,如果一个应用程序打开这个文件,它就会对看门狗负责,并且可以通过写入文件来重置它,正如Richard的文章中链接的文档所记录的那样。

内核中是否配置了看门狗驱动程序? 如果没有,你应该配置它,看看重置是否仍然发生。 如果它仍然发生,很可能是您的重置来自其他地方。

如果你的内核太旧了,没有一个合适的看门狗驱动程序(不在2.6.25中),你应该从2.6.28开始。 或者您可以尝试禁用引导加载程序中的看门狗,并查看是否仍然发生复位。

这可能会给你一个提示: http : //www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt

有一个用户空间守护进程处理看门狗是非常有意义的。 它可能默认为15分钟的超时时间。

在2016年7月,在4.7内核中对watchdog_dev.c 的提交启用了与shodanex针对所有看门狗定时器驱动程序的答案相同的行为。 除了这个线程和源代码,这似乎没有被记录在任何地方。

 /* * A worker to generate heartbeat requests is needed if all of the * following conditions are true. * - Userspace activated the watchdog. * - The driver provided a value for the maximum hardware timeout, and * thus is aware that the framework supports generating heartbeat * requests. * - Userspace requests a longer timeout than the hardware can handle. * * Alternatively, if userspace has not opened the watchdog * device, we take care of feeding the watchdog if it is * running. */ return (hm && watchdog_active(wdd) && t > hm) || (t && !watchdog_active(wdd) && watchdog_hw_running(wdd)); 

AT91SAM9263的WDT也有类似的问题。 问题是WDT_MR(地址:0xFFFFFD44)寄存器的第29位WDIDLEHLT。 这个位被设置为1,但是对于我们的应用程序需要它应该是0。

数据表文档的位说明:

•WDIDLEHLT:看门狗空闲暂停

  1. 0:系统处于空闲模式时,看门狗运行。
  2. 1:当系统处于空闲状态时,看门狗停止。

这意味着WDT计数器在内核处于空闲状态时不会增加,因此15个或更多延迟直到复位发生。

你可以尝试“dd if = / dev / zero of = / dev / null”,这样可以防止内核进入空闲状态,你应该在16秒内(或者在WDT_MR寄存器中设置的任何时间)复位。

因此,解决方案是更新u-boot代码或设置WDT_MR寄存器的其他代码。 记住这个寄存器是写一次…

内核不会刷新看门狗定时器吗? 看门狗的设计是为了在整个系统挂起的时候重置电路板,而不仅仅是一个应用程序。