[信息] 嵌入式学习笔记 - 关于看门狗定时器的喂狗的操作放在中断还是放在主循环

[复制链接]
102|10
Zuocidian 发表于 2026-2-4 13:23 | 显示全部楼层 |阅读模式
一 先来了解一个可能不知道的知识点
看门狗定时器导致的系统复位,并不是在看门狗一进中断时就马上触发进行复位的,恰恰相反,这个中断是一个“最后警告”,是给你一个在复位前进行紧急处理的机会。

第一阶段:计数器溢出,触发中断
看门狗计数器从重装载值开始向下计数。

如果在这期间没有被“喂狗”,计数器会溢出。

第一次溢出时,硬件会设置一个中断标志位,并产生一个看门狗中断。

此时,系统不会复位! CPU会暂停当前任务,跳转到看门狗中断服务程序中去执行。

第二阶段:中断后的“最后机会”窗口
现在系统已经进入了看门狗中断。这是一个非常关键的时期,通常只有几十或几百个看门狗时钟周期。

在这个中断服务程序中,你有两个选择:

正确喂狗:你仍然可以检查程序出错的原因,并尝试向重装载寄存器写入特定值来“喂狗”,清除计数器。如果成功,系统将不会复位,并从中断返回继续运行。

不喂狗或喂狗失败:如果你在中断服务程序里没有进行喂狗操作,或者程序已经混乱到无法正确执行喂狗指令,看门狗计数器会继续计数。

注:有些MCU在看门狗中断里进行喂狗是很危险的操作,通常这时硬件系统给的时间是有限制的,以下图为例:

4581569805f2b26730.png

看门狗实际清除的信号到下一个看门狗时钟的上升沿必须大于500ps,清除操作才能执行成功,标志位才能被清除。

第三阶段:第二次溢出,触发复位
如果看门狗计数器在触发中断后,又经历了第二次溢出,这里的第二次溢出是指对第一次溢出没有处理,这时看门狗硬件才会产生一个系统复位信号。

这次复位是真正的、不可挽回的,它会将整个MCU恢复到初始状态。

二 那么在主循环中执行清除操作就不会遇到上述问题吗
如果清除操作放到主循环里面不放在看门狗中断里面就能保证这个500ps的时间足够吗,不还是会遇到靠近上升沿之前的情况吗

其实,

无论清除操作放在主循环还是看门狗中断里,都无法从原理上避免“信号靠近时钟上升沿”的情况。

这个500ps的要求是一个硬件层面的时序参数,它是由芯片内部的物理电路特性决定的,与软件代码写在哪个部分(主循环或中断)没有直接关系。

而且,产生“清除信号”的系统总线时钟 和看门狗自己的WDGCLK 通常是两个不同源、不同频率的时钟。它们之间是异步的。

主循环或中断服务程序 的执行是由系统时钟 同步的。

看门狗计数器 的计数是由WDGCLK 同步的。

这两个时钟的上升沿之间的相位关系是随机的、不断变化的。因此,您软件在任何时刻发出的“清除信号”,相对于WDGCLK的上升沿,其位置也是完全随机的。

这就导致了以下几种情况必然随机发生:

情况A(理想):清除信号在WDGCLK上升沿之前很早就稳定了(>> 500ps),稳定被采样。

情况B(临界):清除信号在WDGCLK上升沿之前刚刚稳定(刚好 > 500ps),勉强被采样。

情况C(失败):清除信号在WDGCLK上升沿之前稳定时间不足(< 500ps),采样失败。

由于时钟是异步的,您的软件代码无法控制自己发出的信号到底落在哪个时间点。因此,理论上,即使代码100%正确,也存在因建立时间不满足而导致偶尔喂狗失败的概率。

虽然不能从根本上消除问题,但软件设计会极大地影响这种情况发生的概率和后果。因为

主循环周期性地、频繁地喂狗,机会多。即使某一次因为时序问题失败,很快下一次喂狗操作可能就成功了。通过多次重复的喂狗操作,将单次失败的概率平均掉了,系统表现稳定。

见下图,失败的风险几乎稀释为0

6681669805f1ecd315.png

总结一下:

这个疑问是对的,清除操作放在哪里都无法绝对避免时序临界点。但是,放在主循环里,通过增加喂狗频率,可以将单次操作失败的风险稀释到近乎为零;而放在看门狗中断里,则是将整个系统的可靠性暴露在一次高风险操作之下。 因此,芯片厂商的示例代码和最佳实践都强烈建议在主循环中喂狗,这正是在软件层面应对这种硬件时序不确定性的最有效策略。
————————————————
版权声明:本文为CSDN博主「Lester_1101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35771411/article/details/154872041

6895069805f1486b1f.png
公羊子丹 发表于 2026-2-6 08:50 | 显示全部楼层
我之前把喂狗放定时器中断里,结果遇到过几次莫名复位,看了这帖才知道是时序问题!后来挪到主循环,还加了任务运行状态检查,稳定性直接拉满。
周半梅 发表于 2026-2-6 08:51 | 显示全部楼层
想问下独立看门狗和窗口看门狗在喂狗位置选择上有区别吗?窗口看门狗的喂狗窗口会不会影响主循环喂狗的频率设置?求大佬解答!
帛灿灿 发表于 2026-2-6 08:52 | 显示全部楼层
哈哈,我之前一直以为喂狗放中断里更准时,看完这篇才发现是踩了大坑!原来主循环高频喂狗才是王道,能把时序失败的概率稀释到近乎零。
童雨竹 发表于 2026-2-6 08:53 | 显示全部楼层
补充个小技巧:主循环喂狗的时候可以加个计数器,要是连续几次没喂进去就触发报警,能提前发现主循环卡死的苗头,比等复位靠谱多了。
万图 发表于 2026-2-6 08:54 | 显示全部楼层
中断喂狗除了时序坑,还有中断优先级的问题!我之前就碰到过看门狗中断被高优先级中断打断,导致喂狗超时复位,血的教训啊。
Wordsworth 发表于 2026-2-6 08:55 | 显示全部楼层
有没有哪种 MCU 支持在看门狗中断里安全喂狗的?我做的一个低功耗项目,主循环休眠时间太长,放主循环喂狗频率根本不够。
Bblythe 发表于 2026-2-6 08:57 | 显示全部楼层
提醒大家主循环喂狗频率别太高!要是喂狗间隔比看门狗超时时间短太多,就算主循环卡死,看门狗也发现不了,等于白开了。
Pulitzer 发表于 2026-2-6 08:58 | 显示全部楼层
用 RTOS 的朋友可以把喂狗放在空闲任务里,既能保证喂狗频率,又能监控任务调度是否正常,一举两得,亲测在 STM32 上很好用。
Uriah 发表于 2026-2-6 08:59 | 显示全部楼层
以前只知道喂狗要按时,完全没考虑过时钟异步的时序问题!这篇笔记讲得太透彻了,把硬件层面的门道都扒清楚了,涨知识了。
Clyde011 发表于 2026-2-6 09:00 | 显示全部楼层
看门狗中断其实别浪费,用来备份重要数据超合适!比如保存传感器采集的关键参数、系统运行状态,就算最后复位了,数据也不会丢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

509

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0