news 2026/4/16 7:25:52

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/4/11 19:22:33

重庆思庄技术分享——oracle添加ACL(访问控制表)的步骤

oracle添加ACL&#xff08;访问控制表&#xff09;的步骤 一、新增 步骤 1: 创建 ACL 文件并授予权限 首先&#xff0c;我们创建一个新的 ACL 文件&#xff0c;并允许 INFODBA用户访问外部 HTTP 服务。 BEGIN -- 创建一个新的ACL&#xff0c;允许bakmes用户进行网络访问

作者头像 李华
网站建设 2026/4/10 4:28:06

JX076_PLC在高楼供水系统中的应用

第二章 系统组成及控制要求 2.1系统简介 为改善生产环境&#xff0c;某公司投资清洁水技改工程并建成一座日产水2.5万顿的供水系统&#xff0c;分别建设了抽水泵系统、加压泵系统和高位水池。根据公司用水需求特点&#xff0c;从抽水泵系统过来的水一部分直接供给生产用水部门&…

作者头像 李华
网站建设 2026/4/15 13:14:48

学长亲荐2026TOP10AI论文平台:本科生毕业论文全攻略

学长亲荐2026TOP10AI论文平台&#xff1a;本科生毕业论文全攻略 2026年AI论文平台测评&#xff1a;为何值得一看 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具辅助完成毕业论文写作。然而&#xff0c;面对市场上琳琅满目的AI论文平台&#xff0c;如…

作者头像 李华
网站建设 2026/4/15 14:57:44

【目标检测】竹林与杂草识别_YOLOv26改进算法研究

1. 【【目标检测】竹林与杂草识别_YOLOv26改进算法研究】 本文链接&#xff1a; 边缘计算 专栏收录该内容 ]( “边缘计算”) 98 篇文章 59.90 99.00 订阅专栏 本文详细介绍了针对竹林杂草识别任务对YOLOv26算法的改进研究。首先分析了原始算法在竹林场景下的局限性&#x…

作者头像 李华
网站建设 2026/4/15 14:58:15

GIF动图怎么加字?高效GIF加字工具推荐

做自媒体配图、电商主图、微信推文或课件动图时&#xff0c;想要给动图加字标注卖点、补充讲解&#xff0c;却总因选不对GIF加字工具踩坑&#xff1a;要么工具操作复杂&#xff0c;新手半天学不会;要么加字后画质模糊、字体边缘发虚&#xff0c;还会让动图体积变大&#xff0c;…

作者头像 李华
网站建设 2026/4/12 6:19:47

在外包干了三年,我废了……不吹不黑!

没错&#xff0c;我也干过外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我废了…… 虽说废的不是很彻底&#xff0c;但那三年我几乎是出差了三年、玩了三年、荒废了三年&#xff0c;那三年&#xff0c;我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…

作者头像 李华