看门狗驱动与应用:硬件看门狗喂狗、死机自动重启机制实现

发布时间:2026/9/22 21:09:41

看门狗驱动与应用:硬件看门狗喂狗、死机自动重启机制实现
看门狗驱动与应用硬件看门狗喂狗、死机自动重启机制实现你的工控板死机了你人还在被窝里——这就是没有看门狗的代价。一、看门狗到底是什么看门狗Watchdog TimerWDT本质上是一个硬件倒计时器。启动后它开始从预设值递减减到零就触发一个硬件复位信号RESET让整个系统重新来过。形象地说你养了一条狗每隔一段时间必须喂它一次喂狗否则它就咬你一口系统复位。如果你程序跑飞了、死锁了、内核panic了——没人喂狗了狗就咬系统重启。这玩意在工控领域是保命的存在。无人值守的设备跑在野外死机了没人按重启键没有看门狗就只能等维护人员千里迢迢赶过去。有了看门狗系统自己就能从死机中恢复。1.1 看门狗的分类类型说明特点硬件看门狗SoC内部或外部芯片独立计时不受CPU/OS影响最可靠软件看门狗内核软定时器实现依赖内核调度内核挂了就没用工控场景必须用硬件看门狗软件看门狗只能作为辅助。二、Linux内核看门狗子系统Linux内核对看门狗做了标准化封装统一通过/dev/watchdog字符设备节点暴露给用户空间。2.1 设备节点# 查看看门狗设备ls-l/dev/watchdog*# crw------- 1 root root 10, 130 Jan 1 00:00 /dev/watchdog# crw------- 1 root root 245, 0 Jan 1 00:00 /dev/watchdog0/dev/watchdog是默认别名/dev/watchdog0是实际设备。打开设备的那一刻看门狗就被激活了——注意不是等你写数据才启动而是open就启动。2.2 关键ioctl命令#includelinux/watchdog.hWDIOC_GETSUPPORT// 获取看门狗支持的功能WDIOC_GETTIMEOUT// 获取当前超时时间秒WDIOC_SETTIMEOUT// 设置超时时间WDIOC_KEEPALIVE// 喂狗等价于writeWDIOC_GETTIMELEFT// 查看剩余时间三、设备树DTS配置以瑞芯微RK3568为例看门狗节点在设备树中配置/* arch/arm64/boot/dts/rockchip/rk3568.dtsi */ watchdogfe600000 { compatible rockchip,stop-wdt; reg 0x0 0xfe600000 0x0 0x1000; clocks cru TCLK_WDT_NS; interrupts GIC_SPI 149 IRQ_TYPE_LEVEL_HIGH; status okay; }; /* 你的板级DTS中可以覆盖配置 */ watchdog { status okay; /* timeout-sec 可以在驱动中读取设置默认超时 */ };不同平台的看门狗节点名称和地址不同但套路一样指定compatible、reg、clocks然后status设为okay。内核启动后驱动注册看门狗设备/dev/watchdog0就出现了。四、用户层喂狗实现4.1 最朴素的喂狗方式#includestdio.h#includestdlib.h#includefcntl.h#includeunistd.h#includesys/ioctl.h#includelinux/watchdog.hintmain(void){intfdopen(/dev/watchdog,O_WRONLY);if(fd0){perror(open watchdog failed);return-1;}/* 设置超时时间为10秒 */inttimeout10;ioctl(fd,WDIOC_SETTIMEOUT,timeout);printf(Watchdog timeout set to %d seconds\n,timeout);/* 主循环每3秒喂一次狗 */while(1){write(fd,1,1);/* 写入任意数据即可刷新定时器 */// ioctl(fd, WDIOC_KEEPALIVE, NULL); /* 等价写法 */printf(Fed the dog...\n);sleep(3);}close(fd);return0;}write和ioctl(WDIOC_KEEPALIVE)效果一样都是刷新倒计时。喂狗间隔必须小于超时时间建议间隔不超过超时的1/3。4.2 线程化喂狗方案实际工控程序中主线程要干正事处理业务逻辑不能被喂狗阻塞。标准做法是开一个独立线程专门喂狗#includestdio.h#includestdlib.h#includestring.h#includefcntl.h#includeunistd.h#includepthread.h#includesys/ioctl.h#includelinux/watchdog.hstaticintwdt_fd-1;staticvolatileintkeep_running1;/* 喂狗线程 */void*watchdog_feeder(void*arg){intfeed_interval*(int*)arg;while(keep_running){if(wdt_fd0){ioctl(wdt_fd,WDIOC_KEEPALIVE,NULL);}sleep(feed_interval);}returnNULL;}intmain(void){wdt_fdopen(/dev/watchdog,O_WRONLY);if(wdt_fd0){perror(open watchdog failed);return-1;}/* 超时15秒每5秒喂一次 */inttimeout15;ioctl(wdt_fd,WDIOC_SETTIMEOUT,timeout);intfeed_interval5;pthread_tfeeder_tid;pthread_create(feeder_tid,NULL,watchdog_feeder,feed_interval);/* 主业务逻辑 */printf(Main business logic started...\n);while(keep_running){/* 模拟业务处理 */do_business_work();sleep(1);}/* 优雅退出关闭看门狗 */keep_running0;pthread_join(feeder_tid,NULL);/* Magic Close写入V字符安全关闭看门狗 */write(wdt_fd,V,1);close(wdt_fd);return0;}五、Magic Close机制这里有个关键细节正常close设备文件不会关闭看门狗。看门狗的设计哲学是宁可误杀不可漏杀。如果你只是close了fd看门狗照样在跑超时后照样复位。要真正关闭看门狗必须在close之前写入大写字母Vwrite(fd,V,1);/* Magic Close */close(fd);这个V代表Victory也有说是Verbose内核看门狗驱动收到这个字符后会标记此设备为被安全关闭然后停止计时器。什么时候需要Magic Close正常关机/重启前否则关机过程中看门狗超时会强制复位可能导致文件系统损坏应用正常退出时调试阶段需要临时关闭看门狗六、systemd集成看门狗如果你的系统用systemd管理服务systemd自带看门狗集成不需要自己写喂狗代码。6.1 服务单元配置# /etc/systemd/system/myapp.service [Unit] DescriptionMy Industrial Control App Afternetwork.target [Service] Typenotify ExecStart/usr/bin/myapp WatchdogSec15s Restartalways RestartSec5s [Install] WantedBymulti-user.targetWatchdogSec15s表示systemd会给这个服务设一个15秒的看门狗。服务必须在15秒内调用sd_notify告诉systemd我还活着否则systemd认为服务卡死强制重启。6.2 应用侧通知代码#includesystemd/sd-daemon.hintmain(void){/* 告诉systemd服务已启动 */sd_notify(0,READY1);while(1){do_business_work();/* 定期通知systemd我还活着 */sd_notify(0,WATCHDOG1);sleep(5);}return0;}sd_notify底层通过unix socket发消息给systemd比直接操作/dev/watchdog多了一层保护如果进程完全卡死连sd_notify都调不了systemd会重启服务如果整个系统卡死systemd自身都跑不了硬件看门狗兜底复位。七、超时时间怎么选场景建议超时原因高实时采集1~3s故障快速恢复数据丢失少通用工控10~15s给系统足够重启时间兼顾响应嵌入式低功耗30~60s唤醒周期长避免频繁复位选超时时间的核心原则大于系统正常最忙时刻的喂狗间隔小于可接受的故障恢复时间。八、常见踩坑坑1喂狗线程被阻塞最经典的问题。喂狗线程里调了一个会阻塞的函数比如某个锁、某个慢速IO结果喂狗间隔超时系统被误复位。解决喂狗线程只做喂狗这一件事不获取任何锁不调用任何可能阻塞的函数。坑2关机前没关看门狗正常执行reboot命令时系统需要几秒到几十秒来同步文件系统、停止服务。如果看门狗超时时间只有5秒关机过程中就触发复位了——轻则文件系统不一致重则rootfs损坏。解决在系统关机脚本中或systemd的ExecStop中先做Magic Close再执行关机。# /etc/rc6.d/ 关机脚本中加入echoV/dev/watchdog坑3多进程同时打开看门狗多个进程都open了/dev/watchdog一个进程退出时做了Magic Close把看门狗关了另一个进程还以为自己在喂狗。解决只有一个进程负责喂狗通常是主控程序或专门的看门狗守护进程。看门狗是工控系统最后一道防线。设计时遵循简单、独立、不可阻塞原则关键时刻它能帮你把设备从死亡线上拉回来。

相关新闻

工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式

工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式

2026/8/22 19:35:49

工控界面方案选型:QT5/QT6 轻量化窗口、无屏纯后台两种开发模式有些工控设备需要人机界面(HMI),有些就是闷头干活不带屏幕。选哪种方案?今天把两条路都铺开,让你少走弯路。一、工控设备两大模式 工控设备的…

基于SpringBoot的地震减灾救援中心系统任务书

基于SpringBoot的地震减灾救援中心系统任务书

2026/9/22 21:08:51

一、课题研究背景与意义 地震属于突发性强、破坏力大的自然灾害,一旦发生极易造成人员伤亡、建筑损毁、物资短缺等重大灾害损失。在传统地震减灾救援工作中,救援调度、灾情上报、物资调配、人员安置、救援记录统计多依靠人工汇总、线下沟通、纸质登记的方…

AI驱动的数据录入自动化系统设计(从POC到千万级并发的工业级架构拆解)

AI驱动的数据录入自动化系统设计(从POC到千万级并发的工业级架构拆解)

2026/9/22 16:36:46

更多请点击: https://kaifayun.com 第一章:AI驱动的数据录入自动化系统设计(从POC到千万级并发的工业级架构拆解) 在高吞吐、多模态、强合规的工业场景中,传统OCR人工校验的数据录入方案已无法支撑日均亿级票据处理与…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/21 18:38:46

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/21 18:41:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/21 18:36:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/21 18:37:26

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/21 18:40:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/21 18:36:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/22 0:19:28

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/22 0:48:53

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…