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

发布时间:2026/7/25 1:02:24

看门狗驱动与应用:硬件看门狗喂狗、死机自动重启机制实现
看门狗驱动与应用硬件看门狗喂狗、死机自动重启机制实现你的工控板死机了你人还在被窝里——这就是没有看门狗的代价。一、看门狗到底是什么看门狗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/7/25 1:02:24

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

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

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

2026/7/25 0:52:24

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

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

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

2026/7/25 0:52:23

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

智能代理系统架构设计与优化实践

智能代理系统架构设计与优化实践

2026/7/25 5:02:50

1. 项目概述在AI技术快速发展的今天,智能代理(Agent)系统正成为自动化流程和智能决策的核心组件。claudecode的agent定义项目,本质上是一套针对特定业务场景的智能代理框架设计规范。这个项目不是简单地调用现成API,而是从底层定义了agent的行…

步进电机为何不标功率?从电流控制原理到选型实战解析

步进电机为何不标功率?从电流控制原理到选型实战解析

2026/7/25 5:02:50

步进电机,一个在3D打印机、雕刻机、机器人、打印机等精密控制领域无处不在的执行元件。很多工程师和爱好者第一次接触它时,都会有一个共同的疑问:为什么步进电机的规格书上,通常找不到一个明确的“功率”参数,而只有电…

5步实现小爱音箱AI智能升级:从普通音箱到ChatGPT语音助手

5步实现小爱音箱AI智能升级:从普通音箱到ChatGPT语音助手

2026/7/25 5:02:50

5步实现小爱音箱AI智能升级:从普通音箱到ChatGPT语音助手 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 你是否曾想过让小爱音箱拥有…

多门店运维闭环全景架构:监控+告警+工单+SLA+复盘,一套最小可用系统怎么串起来

多门店运维闭环全景架构:监控+告警+工单+SLA+复盘,一套最小可用系统怎么串起来

2026/7/25 5:02:50

多门店运维闭环全景架构:监控告警工单SLA复盘,一套最小可用系统怎么串起来 如果你是一个连锁奶茶品牌的运维工程师,每天面对全国 200 家门店的监控告警,你会怎么做? 今天我们不聊大厂那套复杂的 Prometheus Grafana …

AI驱动的学术写作工具:智能文献综述与结构化写作

AI驱动的学术写作工具:智能文献综述与结构化写作

2026/7/25 5:02:50

1. 项目概述:AI驱动的学术写作革命去年帮导师审阅研究生论文时,我发现一个惊人现象:90%的文献综述都存在结构混乱、关键研究遗漏或分析浅表的问题。这促使我开始探索如何用AI技术重塑学术写作流程。"书匠策AI"正是为解决这一痛点而…

C++序列化与反序列化:从原理到实践,构建高效数据持久化方案

C++序列化与反序列化:从原理到实践,构建高效数据持久化方案

2026/7/25 4:52:50

1. 项目概述:从内存对象到持久化字节流 在C的世界里,我们每天都在和内存中的对象打交道。这些对象有复杂的结构,包含各种基本类型、字符串、容器,甚至嵌套着其他对象的指针。当程序运行时,它们生动地存在于RAM中&…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/24 4:17:29

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/24 19:29:25

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

挑战一天速通Spring全家桶!

挑战一天速通Spring全家桶!

2026/7/25 0:02:22

不知道各位Java好大哥们闲的时候会不会去关注Spring目前的官网,你会发现他的slogan是: Spring makes Java Simple。它让Java的开发变得更加简单。某种意义上来说:是Spring成就了Java!但随之而来的就是:由他之后诞生出来的各种组件…

挑战一天速通Java高并发!

挑战一天速通Java高并发!

2026/7/25 0:02:22

有出去面试的朋友肯定深有感受,像我们刚入行那会面试的加分项现在卷得已经成为了面试的基础题(手动狗头)。其中最典型的就属这个Java并发编程了。之前一般只有大厂才会有高并发编程相关的面试内容,但现在只要你入了Java行业就会涉…

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

2026/7/25 0:02:22

更多请点击: https://kaifayun.com 第一章:AI 游戏平衡性分析 现代游戏开发中,AI 不再仅用于控制 NPC 行为,更被深度整合进游戏平衡性调优流程。通过强化学习与对抗性仿真,AI 可以在数百万局对局中自动识别数值失衡点…