我有一个运行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中使用看门狗进行软锁定.
如果在内核中启用了监视程序驱动程序,则监视程序驱动程序会设置内核计时器,负责重置监视程序.相应的代码在这里.它的工作原理如下:
如果没有应用程序打开/ dev/watchdog文件,则内核负责重置监视程序.由于它是一个计时器,它不会显示为专用的内核线程,而是由软IRQ线程处理.现在,如果应用程序打开此文件,它将负责监视程序,并可以通过写入文件来重置它,如Richard的帖子中链接的文档所述.
是否在内核中配置了看门狗驱动程序?如果没有,你应该配置它,看看是否仍然发生重置.如果它仍然发生,很可能你的重置来自其他地方.
如果你的内核太旧而没有合适的看门狗驱动程序(2.6.25中没有),你应该从2.6.28向后移植它.或者您可以尝试在引导加载程序中禁用看门狗,看看是否仍然发生了重置.
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));
这可能会给你一个提示:http://www.mjmwired.net/kernel/Documentation/watchdog/watchdog-api.txt
让用户空间守护程序处理监视程序是完全合理的.它可能默认为15分钟超时.