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

时间:2010-01-07 13:11:32

标签: linux kernel arm watchdog

我有一台运行2.6内核的处理器AT91SAM9G20。看门狗在引导级别启用并配置为16秒。看门狗模式寄存器只能配置一次。 当代码在引导程序,引导程序或内核中挂起时,程序板将重新启动。但是一旦内核出现,即使看门狗没有在任何应用程序中刷新,电路板也不会在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中使用看门狗进行软锁定。

5 个答案:

答案 0 :(得分:17)

如果在内核中启用了监视程序驱动程序,则监视程序驱动程序会设置内核计时器,负责重置监视程序。相应的代码为here。所以它的工作原理如下:

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

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

如果您的内核太旧而无法使用正确的监视程序驱动程序(2.6.25中不存在),则应从2.6.28向后移植它。或者您可以尝试在引导加载程序中禁用看门狗,看看是否仍然发生了重置。

答案 1 :(得分:8)

2016年7月{watcher_dev.c a commit in the 4.7 kernel启用了与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));

答案 2 :(得分:6)

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

让用户空间守护程序处理监视程序是完全合理的。它可能默认为15分钟超时。

答案 3 :(得分:2)

我们在AT91SAM9263上遇到了类似的WDT问题。问题出在WDT_MR(地址:0xFFFFFD44)寄存器的bit 29 WDIDLEHLT上。该位设置为1,但对于我们的应用需求,它应为0。

数据表文档中的位说明:

•WDIDLEHLT:看门狗闲置停止

  1. 0:看门狗在系统处于空闲模式时运行。
  2. 1:看门狗在系统处于空闲状态时停止。
  3. 这意味着当内核处于空闲状态时WDT计数器不会递增,因此在重置发生之前会有15或更多延迟。

    您可以尝试" dd if = / dev / zero of = / dev / null"这会阻止内核进入空闲状态,你应该在16秒内(或者你在WDT_MR寄存器中设置的任何时间段)重置。

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

答案 4 :(得分:0)

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