news 2026/3/10 1:26:16

RTOS和看门狗 (Watchdog)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RTOS和看门狗 (Watchdog)

只要是软件,就一定有 Bug。 只要是电子设备,就一定会被强电磁干扰打挂(比如 PC 指针跑飞,跳到了空地址死循环)。

当 CPU “发疯”的时候,谁来按下复位键? 这就是今天我们要讲的主角——看门狗。这看起来是一个很简单的外设,但可能很多的工程师都用错了

为什么在中断里“喂狗”等于没喂?

看门狗(Watchdog Timer, WDT)本质上是一个独立的倒计时计数器。

  • 规则:假如你设定了 1000ms 的超时。如果你的程序没有在 1000ms 内向它写入特定数值(喂狗/Reload),它就会归零,并触发MCU 硬件复位

听起来很简单?那我们一起来看看用法。


1. 独立看门狗 (IWDG) vs 窗口看门狗 (WWDG)

STM32(以及大多数现代 MCU)通常配备了两只狗。它们的性格完全不同。

1.1 独立看门狗 (IWDG - Independent Watchdog)

  • 时钟源:LSI (Low-Speed Internal)内部低速时钟(通常 32kHz 或 40kHz)。

  • 特点:

    • 独立:即使 MCU 的主晶振(HSE)坏了,或者 PLL 锁相环挂了,导致系统主时钟停摆,IWDG 依然能独立工作,把系统复位。

    • 精度低:LSI 的温漂很大(30kHz ~ 60kHz 都有可能),所以 IWDG 适合做“大尺度”的监测(比如 1秒、5秒)。

  • 用途:防止程序跑飞、死循环、硬件晶振故障。

1.2 窗口看门狗 (WWDG - Window Watchdog)

  • 时钟源:APB (PCLK)系统总线时钟分频。

  • 特点:

    • 窗口机制:这是它名字的由来。它不仅规定了“不能太晚喂”(超时复位),还规定了“不能太早喂”

    • 精度高:跟随系统时钟,非常精准。

  • 用途:监测程序执行流程是否过快(跳过逻辑)或过慢。通常用于安规要求极高的场合(如汽车 ABS、医疗设备)。


2. 致命误区:千万不要在定时器中断里喂狗!

这是新手最容易犯的错误:

“我看门狗设定了 1s 超时。为了省事,我在 SysTick 的 1ms 中断里,或者一个专门的 100ms 定时器中断里写了一句HAL_IWDG_Refresh()。”

为什么这是错的?

  • 场景:你的main()函数里有一个while(Flag == 0);等待逻辑。有一天,传感器坏了,Flag 永远为 0,主程序死锁在这里了。

  • 现象:虽然主程序死了,但中断(Interrupt)依然能响应!定时器依然在欢快地跑,每 100ms 喂一次狗。

  • 结果:看门狗觉得“我很饱,系统很正常”,系统实际上已经变成了植物人,永远不会复位。

专家法则:只允许在主循环(Main Loop)或低优先级的任务中喂狗。只有当“大脑”清醒时,才能去喂狗。


3. 高阶策略:多任务系统的“逻辑看门狗”

如果你的系统里有 3 个任务:显示任务、电机任务、通信任务。 如果你只在main循环的末尾喂狗,可能会出现:电机任务死锁了,但显示任务还活着,主循环还在跑,狗被喂了,电机却烧了。

我们需要设计一种**“任务签到”**机制。

实战代码 (Task Monitor)

// 定义任务标志位 #define TASK_FLAG_DISPLAY (1 << 0) #define TASK_FLAG_MOTOR (1 << 1) #define TASK_FLAG_COMMS (1 << 2) #define TASK_ALL_ALIVE (0x07) // 111 static uint8_t g_TaskSignaled = 0; // 1. 各个任务定期汇报 "我还活着" void Display_Task(void) { // ... 业务逻辑 ... g_TaskSignaled |= TASK_FLAG_DISPLAY; } void Motor_Task(void) { // ... 业务逻辑 ... g_TaskSignaled |= TASK_FLAG_MOTOR; } void Comms_Task(void) { // ... 业务逻辑 ... g_TaskSignaled |= TASK_FLAG_COMMS; } // 2. 主循环统一检查 void Main_Loop(void) { while(1) { Display_Task(); Motor_Task(); Comms_Task(); // 核心逻辑:只有所有人都签到了,才喂狗 if (g_TaskSignaled == TASK_ALL_ALIVE) { HAL_IWDG_Refresh(&hiwdg); g_TaskSignaled = 0; // 清空标志,等待下一轮 } else { // 如果某人没签到,这里不喂狗。 // 几个周期后,IWDG 溢出,系统复位。 } } }

如果是 RTOS 系统,可以建立一个低优先级的“看门狗守护任务 (Daemon Task)”,去监视所有其他任务的事件标志组。


4. WWDG 的正确打开方式:防跳过

WWDG 的“不可太早喂”有什么用? 假设你有关键的安全逻辑:

void Safety_Check(void) { Step1_Check_Voltage(); // 耗时 2ms Step2_Check_Temp(); // 耗时 2ms Step3_Check_Speed(); // 耗时 2ms // 总耗时 6ms // WWDG 窗口设定:必须在 5ms ~ 10ms 之间喂狗 Feed_WWDG(); }

故障场景:PC 指针因为干扰,直接跳过了 Step1 和 Step2,直接执行了Feed_WWDG()

  • 结果:此时只过了 0ms。WWDG 发现你喂得太早了!判定为逻辑异常,立即复位系统。

结论:IWDG 防死锁(太慢),WWDG 防跑飞(太快)。


5. 最后的挣扎:复位前能保存现场吗?

看门狗复位是瞬间发生的,就像断电一样。 我们能不能知道“我是被看门狗复位的”?甚至知道“死在哪里”?

  1. 复位源寄存器 (RCC_CSR):系统启动后的第一件事,检查RCC->CSR寄存器。

    • 如果IWDGRSTF置位,说明是看门狗咬死的。

    • 如果PINRSTF置位,说明是被人按了复位键。

    • 专家技巧:记录这个标志到 EEPROM,统计设备的“非正常死亡率”。

  2. 死前遗言 (难):WWDG 通常有一个“早期唤醒中断 (Early Wakeup Interrupt, EWI)”。 在计数器减到 0x40(马上要复位)之前,会先触发一个中断。你可以在这个最高优先级的中断里,把关键寄存器保存到 Flash 或 备份寄存器中,作为“黑匣子”数据。


总结本章

看门狗不是“开了就行”的配置项,它是系统稳定性的基石。

  1. IWDG:用来救命(死机复位)。必须在主循环或逻辑末端喂,严禁在定时器中断喂

  2. WWDG:用来体检(流程监控)。适合安规场景。

  3. 多任务策略:使用“签到制”,缺一不可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 3:10:19

Java毕设项目推荐-基于java+springboot的体育用品购物商城系统基于springboot的运动用品商城系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/3 21:09:41

智能体异常处理与恢复:从实验室到生产环境的通关秘籍

智能体的异常处理与恢复是确保其从实验室走向生产环境的关键机制。该体系通过"预防-检测-处理-恢复-优化"的全流程弹性设计&#xff0c;实现精准故障检测、分级错误处理和自我修复能力。与MCP协议、目标设定和监控协同&#xff0c;构建智能体的"免疫系统"&…

作者头像 李华
网站建设 2026/3/9 18:26:52

AI绘画2024年趋势分析:NewBie-image-Exp0.1开源模型+弹性GPU部署

AI绘画2024年趋势分析&#xff1a;NewBie-image-Exp0.1开源模型弹性GPU部署 1. 为什么2024年动漫生成正迎来“轻量化高质量”拐点 过去几年&#xff0c;AI绘画圈一直被两类模型主导&#xff1a;一类是动辄十几亿参数、需要A100/H100才能跑起来的“巨无霸”&#xff0c;另一类…

作者头像 李华
网站建设 2026/3/4 7:42:28

python111-学生在线报名考试管理系统vue3

目录 项目概述核心功能技术栈实现要点应用场景 开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 项目概述 Python111-学生在线报名考试管理系统是一个基于Vue3前端框架和Python后端技术构建…

作者头像 李华
网站建设 2026/3/5 21:14:59

python149-共享经济背景下校园闲置物品交易平台vue3

目录共享经济背景下校园闲置物品交易平台&#xff08;Vue3&#xff09;摘要平台背景与意义技术架构与核心功能创新点与优势应用场景与展望开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;共享…

作者头像 李华