我有一台运行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中使用看门狗进行软锁定。
答案 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:看门狗闲置停止
这意味着当内核处于空闲状态时WDT计数器不会递增,因此在重置发生之前会有15或更多延迟。
您可以尝试" dd if = / dev / zero of = / dev / null"这会阻止内核进入空闲状态,你应该在16秒内(或者你在WDT_MR寄存器中设置的任何时间段)重置。
因此,解决方案是更新u-boot代码或设置WDT_MR寄存器的其他代码。记住这个寄存器只写一次......
答案 4 :(得分:0)
内核不会刷新看门狗定时器吗?看门狗设计用于在整个系统挂起时重置电路板,而不仅仅是单个应用程序。