看门狗驱动与应用:硬件看门狗喂狗、死机自动重启机制实现
看门狗驱动与应用硬件看门狗喂狗、死机自动重启机制实现你的工控板死机了你人还在被窝里——这就是没有看门狗的代价。一、看门狗到底是什么看门狗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/10/5 14:04:09 阅读更多 →
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/10/10 15:47:56 阅读更多 →
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/10/4 22:31:52 阅读更多 →

最新新闻

窗口函数 SUM() OVER() 详解:PARTITION BY 与 ORDER BY 的累计计算逻辑

窗口函数 SUM() OVER() 详解:PARTITION BY 与 ORDER BY 的累计计算逻辑

很多人学了窗口函数,一看到SUM() OVER(PARTITION BY ... ORDER BY ...)这种写法还是会懵,特别是ORDER BY加上之后,结果怎么就从“分组总和”变成“累加值”了?这篇文章继续走实战路线,我会把SUM() OVER()从基础语法到进…

2026/10/11 23:40:47 阅读更多 →
数据库课程设计:电力收费系统表结构、触发器与存储过程全解析

数据库课程设计:电力收费系统表结构、触发器与存储过程全解析

简介:《数据库课程设计电力公司收费系统.doc》是一份完整的数据库课程设计报告,面向高校计算机、软件工程等专业学生,适用于电力公司收费管理信息系统设计课题。文档围绕客户、用电类型、员工、用电信息、费用管理、收费登记六大核心数据表展…

2026/10/11 23:40:47 阅读更多 →
JMeter+InfluxDB+Grafana:搭建性能测试实时监控看板

JMeter+InfluxDB+Grafana:搭建性能测试实时监控看板

做性能测试的人基本都经历过这样的场景:JMeter压着压着,突然想知道当前的TPS到底有没有掉链子,响应时间的曲线是不是已经拐头向上,可日志刷得太快根本看不出来。一开始我也用JMeter自带的监听器,结果压测刚跑几分钟&am…

2026/10/11 23:40:47 阅读更多 →
内网安全评估:揭秘ACL权限滥用与横向移动链路

内网安全评估:揭秘ACL权限滥用与横向移动链路

内网安全评估做到第三周的时候,我在一份共享文件夹的ACL导出清单里看到了一个非常扎眼的组名:SHARE MODERATORS。这个组在域里并不显眼,不在本地管理员组,也不在任何域管理组里,可它的权限范围却覆盖了全公司的核心共享…

2026/10/11 23:40:47 阅读更多 →
同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建:多商户入驻与智能派单方案详解同城家政行业早已从单一门店自营模式,转向多商户平台化联营发展。平台整合全城多家家政公司、个体服务商、持证服务师傅,统一承接用户订单,通过智能调度完成订单分发与履约。相…

2026/10/11 23:39:46 阅读更多 →
PDF加密权限解除实战:用qpdf免费命令行一键解锁

PDF加密权限解除实战:用qpdf免费命令行一键解锁

上周同事甩过来一个PDF,说打印店打不了,让我帮忙看看。我一看,文件本身没坏,是加了权限限制——允许查看,但打印和复制都被锁了。这种问题我一年能遇到几十次:文档在手机上看一点毛病没有,真要用…

2026/10/11 23:39:46 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/11 14:36:54 阅读更多 →