18

我有一个运行 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 中可用的软锁定看门狗

4

5 回答 5

18

如果您在内核中启用了看门狗驱动程序,则看门狗驱动程序会设置一个内核计时器,负责重置看门狗。对应的代码是linux/drivers/watchdog/at91sam9_wdt.c。所以它是这样工作的:

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

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

如果您的内核太旧而没有适当的看门狗驱动程序(2.6.25 中不存在),您应该从 2.6.28 向后移植它。或者您可以尝试禁用引导加载程序中的看门狗,看看是否仍然发生重置。

于 2010-01-07T13:48:53.167 回答
7

2016 年 7 月,在 4.7 内核中提交 3fbfe92647(看门狗:更改 watchdog_need_worker 逻辑)以启用与shodanex对所有看门狗计时器驱动程序的回答watchdog_dev.c相同的行为。除了这个线程和源代码之外,这似乎没有记录在任何地方。

/*
* 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));
于 2017-03-03T21:55:47.237 回答
6

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

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

于 2010-01-07T13:19:10.520 回答
2

我们在 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 寄存器的代码。记住这个寄存器只写一次......

于 2015-07-27T11:29:07.147 回答
0

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

于 2010-01-07T13:14:05.560 回答