看门狗驱动与应用:硬件看门狗喂狗、死机自动重启机制实现
看门狗驱动与应用硬件看门狗喂狗、死机自动重启机制实现你的工控板死机了你人还在被窝里——这就是没有看门狗的代价。一、看门狗到底是什么看门狗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 轻量化窗口、无屏纯后台两种开发模式

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

2026/7/25 1:01:59 阅读更多 →
098、ESP-DL的安全加密案例

098、ESP-DL的安全加密案例

098、ESP-DL的安全加密案例:当模型部署遇上TLS握手失败 深夜两点,实验室的示波器还在跳着绿光。我盯着ESP32-S3的串口输出,一行刺眼的红色日志反复刷屏: E (2846) esp-tls: mbedtls_ssl_handshake returned -0x7780 E (2846) esp-tls: Failed to verify peer certificate…

2026/7/25 1:00:58 阅读更多 →
Adobe-GenP 3.0破解工具:3分钟快速解锁Adobe全家桶的完整指南

Adobe-GenP 3.0破解工具:3分钟快速解锁Adobe全家桶的完整指南

Adobe-GenP 3.0破解工具:3分钟快速解锁Adobe全家桶的完整指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 对于创意工作者和学生来说,Ado…

2026/7/25 1:00:58 阅读更多 →

最新新闻

高速DAC电气特性深度解析:从数据手册到硬件设计实战

高速DAC电气特性深度解析:从数据手册到硬件设计实战

1. 从数据手册到设计实战:深度拆解DAC38RFxx系列高速DAC的电气特性在射频和无线通信系统的设计前线摸爬滚打十几年,我经手过的高速数模转换器(DAC)不计其数。每次打开一份新的DAC数据手册,尤其是像TI的DAC38RFxx这种旗…

2026/7/25 1:08:00 阅读更多 →
计算机毕业设计之智能家教平台

计算机毕业设计之智能家教平台

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,相比于以前的传…

2026/7/25 1:08:00 阅读更多 →
深入解析USB Type-C PD物理层与TPS65981电源管理芯片设计

深入解析USB Type-C PD物理层与TPS65981电源管理芯片设计

1. 项目概述:从一根线缆到智能电源生态如果你拆开过近几年的笔记本电脑、手机充电器或者高端扩展坞,大概率会看到一个印着“TPS65981”或者类似型号的小芯片。这枚芯片,正是现代USB Type-C接口背后“智能”与“强大”的核心引擎。它远不止是一…

2026/7/25 1:08:00 阅读更多 →
【消息中间件AI化转型白皮书】:从零搭建企业级AI-Codegen平台,支持12种协议适配+人工审核沙箱+合规审计日志(限免申请通道开启)

【消息中间件AI化转型白皮书】:从零搭建企业级AI-Codegen平台,支持12种协议适配+人工审核沙箱+合规审计日志(限免申请通道开启)

更多请点击: https://kaifayun.com 第一章:AI 写消息队列代码 现代AI编程助手已能基于自然语言描述,自动生成符合语义与工程规范的消息队列集成代码。这不仅加速了微服务间异步通信的搭建,也降低了开发者对Kafka、RabbitMQ、NATS…

2026/7/25 1:08:00 阅读更多 →
扣子外部API调用失效的7个隐性原因:从鉴权超时到响应体截断,一文定位全部根因

扣子外部API调用失效的7个隐性原因:从鉴权超时到响应体截断,一文定位全部根因

更多请点击: https://codechina.net 第一章:扣子外部API调用失效的典型现象与诊断全景图 当扣子(Coze)Bot通过「外部API」插件或自定义函数调用第三方服务时,开发者常遭遇请求静默失败、返回空响应、状态码异常或超时…

2026/7/25 1:08:00 阅读更多 →
深入AMD Ryzen硬件调试:SMUDebugTool完全掌控指南

深入AMD Ryzen硬件调试:SMUDebugTool完全掌控指南

深入AMD Ryzen硬件调试:SMUDebugTool完全掌控指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…

2026/7/25 1:07:00 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻