准备将 Cubieboard 留在家里,放在路由器边长期开着收收短信什么的。
有了 Watchdog Timer(看门狗计时器),一旦 Cubieboard 死机,系统将自动重启。重启由硬件实现,确保可靠性。
内核支持
需在编译 Linux 内核时开启 Watchdog Timer 支持、编译 sunxi watchdog 驱动。
选项位于Device Drivers >> Watchdog Timer Support
,勾选WatchDog Timer Driver Core
和Allwinner A10/A13 Watchdog
。可以考虑勾选Disable watchdog shutdown on close
,选择后若 watchdog 进程意外结束也将触发重启,否则 watchdog 将随 watchdog 进程的关闭而关闭。[1]
CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_SUNXI_WDT=m |
若驱动编译为内核模块,需要手动加载:
sudo modprobe sunxi_wdt |
可在/etc/modules
加入一行,系统启动时将自动加载:
sunxi_wdt |
加载成功后可以看见/dev/watchdog
。任意程序打开该文件将启动 watchdog,打开后必须定期“戳一下” (poking) 它,即往里写数据。[1]
安装用户空间程序
戳狗程序当然有现成的:
sudo apt-get install watchdog sudo service watchdog start |
可以留意下配置/etc/watchdog.conf,
有检测负载、内存、网络和自定义检测命令等可选功能。
U-Boot 支持
上述方案中,watchdog 只会在系统正常启动,且正常加载 sunxi_wdt,且 watchdog daemon 正常运行后才会生效。若开启 U-Boot 内置的 watchdog 支持,可在系统引导失败时重启系统。
这是可选项,我还没试过,只是看文档中有写。(嘛毕竟有山寨货了(见下文((
首先编译 u-boot-sunxi 时需启用CONFIG_WATCHDOG
。
其次修改boot.scr
,在bootm
这行之上加入watchdog 16
。该文件在引导分区,若无需自行建立。
我还没试过,就不乱说了,请参考 u-boot-sunxi/wiki#bootscr-support 配置。
需要注意的是,A10 只支持最长 16 秒的间隔时间[2]。也就是说,从加载内核、挂载分区、一直到启动 watchdog daemon 必须在 16 秒内完成,否则将触发重启。
在此之前…
由于不知道 SoC 内置了 watchdog,我翻了些零件自己山寨了一个…
洞洞板是以前焊的,其上是一块 ATmega16U,都闲置好久了;
左边方块是一个继电器和三极管二极管电阻之类的,通过 USB 口连接着 Cubieboard 的电源;
中间蓝线连着单片机与一 GPIO 口,用一个脚本周期性输出 0,1 来戳狗。
单片机检测到超时没戳时,给继电器通电几秒,就成了..
(说来 ATmega 也内置一个 Watchdog Timer…
[1] The Linux Watchdog driver API;
[2] Allwinner A10 User Manual v1.20 (PDF), P99 10.3.25. Watch-Dog Mode Register.
good~~来学习了
我想问下,cubie的这种watchdog timer
算 软件看门狗、还是硬件看门狗呀?
这个定时器是独立于芯片的吗?
是硬件的,集成在 SoC 内部。
Thanks for the article. I have a question whether we can adjust the watchdog timeout?
Thanks for your comment.
The SoC should support the timeout from 0.5s to 16s as the user manual said.
It can be specified on u-boot (see https://github.com/linux-sunxi/u-boot-sunxi/wiki#watchdog-support).
En.. I don’t know how to adjust it on Linux.