如何在Zynq-7000设备启动阶段喂硬件看门狗?
Zynq-7000启动阶段硬件看门狗喂狗解决方案(Petalinux 2021.1 + Yocto)
针对内核启动到用户态间隙40秒的看门狗喂狗问题,提供以下几种可行方案:
1. 内核启用Early Watchdog初始化机制
Zynq-7000的硬件看门狗由zynq_wdt驱动支持,可通过内核配置让驱动在启动初期就完成初始化并自动喂狗:
- 进入Petalinux内核配置:
petalinux-config -c kernel - 开启以下编译进内核的配置项:
CONFIG_WATCHDOG=yCONFIG_ZYNQ_WATCHDOG=yCONFIG_WATCHDOG_EARLY_INIT=y(允许内核启动早期初始化看门狗)CONFIG_WATCHDOG_AUTO_ENABLE=y(内核启动时自动启用看门狗)
- 调整内核启动参数,添加
watchdog.timeout=2(设置看门狗超时为2秒),可通过petalinux-config -c rootfs或修改设备树chosen节点配置cmdline。
该方案能让内核在根文件系统挂载前就接管看门狗喂狗,覆盖40秒的启动间隙。
2. 基于Initramfs提前启动喂狗程序
如果内核自动喂狗机制不符合需求,可通过定制initramfs,在根文件系统挂载前启动自定义喂狗逻辑:
- 编写极简喂狗脚本
watchdog_feed.sh:
#!/bin/sh # 等待/dev/watchdog设备就绪 while [ ! -c /dev/watchdog ]; do sleep 0.1 done # 循环喂狗 while true; do echo "1" > /dev/watchdog sleep 2 done
- 在Petalinux中配置initramfs:
- 执行
petalinux-config -c rootfs,确保busybox包含sleep命令(路径:Filesystem Packages -> misc -> busybox) - 将
watchdog_feed.sh添加到initramfs的/init.d目录,修改initramfs的启动脚本(通常是/init),在挂载根分区前后台启动该脚本:# 在挂载根fs的代码段前添加 /init.d/watchdog_feed.sh &
- 执行
- 重新编译initramfs和内核,确保启动时优先加载定制的initramfs。
3. 调整Systemd服务启动优先级(用户态提前喂狗)
如果必须在用户态早期启动喂狗服务,可通过Systemd配置将服务优先级拉到最高:
- 编写喂狗服务文件
watchdog-feed.service,放到/lib/systemd/system/:
[Unit] Description=Hardware Watchdog Feed Service After=sysinit.target WantedBy=basic.target DefaultDependencies=no [Service] Type=simple ExecStart=/usr/bin/watchdog_feed.sh Restart=always RestartSec=1 [Install] WantedBy=multi-user.target
- 确保喂狗脚本
/usr/bin/watchdog_feed.sh有执行权限,且脚本内包含/dev/watchdog设备就绪检查。 - 启用服务:
systemctl enable watchdog-feed.service
通过DefaultDependencies=no和After=sysinit.target,能让服务在Systemd初始化的极早期启动,尽可能缩短喂狗间隙。
注意事项
- Zynq看门狗一旦启用无法关闭(若开启
CONFIG_WATCHDOG_NOWAYOUT=y),需确保喂狗逻辑不会中断。 - 若使用设备树配置看门狗,需确保节点
/amba/watchdog@e0006000的timeout-sec属性设置为2秒,避免内核默认超时过长。
内容的提问来源于stack exchange,提问作者Boune
相关产品推荐
相关产品推荐

