【嵌入式面试】看门狗(IWDG/WWDG)高频面试题
【嵌入式面试】看门狗(IWDG/WWDG)高频面试题
看门狗是嵌入式系统可靠性设计的最后一道防线,也是面试中几乎必问的"系统级"考点。从独立看门狗与窗口看门狗的区别,到超时计算、喂狗时机与复位排查,下面这些题目基本覆盖了面试官的考察点。
一、看门狗基础
1. 看门狗的作用是什么?它的工作原理是怎样的?
作用:防止程序跑飞或卡死(死循环、异常挂起)导致系统失控。原理:看门狗本质是一个独立运行的递减计数器,程序正常时周期性"喂狗"(重载计数器);一旦程序异常,计数器持续递减到 0,触发系统复位让程序重新执行。它是软件故障的最后一道硬件防线,属于系统可靠性设计(Safety)的典型手段。
2. 喂狗是干什么?为什么程序正常时必须不断喂狗?
喂狗 = 重载看门狗计数器,让它从初始值重新倒数。正常程序在超时时间内反复喂狗,计数器永远不会减到 0,看门狗不动作;程序一旦卡死没人喂狗,计数器归零即触发复位。所以喂狗本质上是在向硬件声明"程序还活着",看门狗则是用复位惩罚"程序失联"。
二、IWDG 与 WWDG 的区别
3. 独立看门狗(IWDG)和窗口看门狗(WWDG)有什么区别?
从四个维度对比:时钟源——IWDG 用独立 LSI RC 振荡器(约 40kHz),WWDG 用 APB1(PCLK1)时钟,所以 IWDG 更"独立";喂狗限制——IWDG 只要超时前喂即可,WWDG 必须在窗口期内喂(太早太晚都复位);超时范围——IWDG 可达秒级乃至数十秒,WWDG 时间很短(微秒量级),适合快速检测;关闭方式——IWDG 一旦启动软件无法关闭(只能复位解除),WWDG 由 WDGA 位控制、复位后可重新配置。另外 WWDG 有提前唤醒中断(EWI),可在复位前保存数据。
4. 为什么叫"独立"看门狗?主时钟故障时它还能工作吗?
因为它的时钟来自独立的 LSI RC 振荡器,不依赖 HSE/PLL/系统主时钟。只要芯片供电正常,即使主时钟故障、程序跑飞,IWDG 依然会按自己的节奏计数并在超时后复位系统。这是它相比 WWDG(依赖 APB1 时钟)最本质的可靠性优势。
三、IWDG 时钟与超时计算
5. IWDG 的时钟源是什么?超时时间怎么计算?
时钟源是 LSI,F1 典型约 40kHz(RC 振荡器,实际在 30~60kHz 间波动,精度不高,具体以数据手册为准)。超时公式:Tout = 预分频值 × (RLR+1) / fLSI,预分频可选 4/8/16/32/64/128/256,RLR 为 12 位重装载值(0~4095)。例:fLSI=40kHz、64 分频、RLR=1249,则 Tout = 64×1250/40000 = 2 秒;最大超时(256 分频、RLR=4095)约 26 秒。
6. 独立看门狗如何配置和喂狗(寄存器层面)?
通过写 IWDG_KR 键值寄存器完成:先写 0x5555 解除 PR/RLR 的写保护;配置 PR(预分频)与 RLR(重装载值);写 0xCCCC 启动 IWDG;之后定期写 0xAAAA 实现喂狗。注意:一旦写 0xCCCC 启动,IWDG 运行期间无法用软件停止,只有复位才能关闭。
7. LSI 频率不准,会影响超时时间吗?
会。LSI 是 RC 振荡器,精度差(波动可达 ±30% 量级),所以 IWDG 的超时时间本身不精确。工程上要按 LSI 的最差情况核算超时,喂狗周期要留足余量(通常取标称超时的一半以内),不能卡着边界喂狗,否则可能误复位或失去保护作用。
四、喂狗时机与常见误区
8. 喂狗应该放在主循环的哪里?为什么"循环开头喂狗"是误区?
喂狗应放在程序正常运行的"证据点"——通常是关键任务链的末尾,或先检查各任务心跳标志全部正常再喂。若放在主循环开头,喂狗后某个任务卡死,喂狗语句依然会执行,看门狗检测不到故障——喂狗点之前、上次喂狗之后的代码段才是看门狗能保护的范围,这是面试中最经典的坑。
9. 在中断里喂狗有什么问题?
中断里喂狗会掩盖故障:主循环可能已经卡死,但只要定时器中断仍正常触发并在中断里喂狗,看门狗就永远超时不了,形同虚设。除非刻意设计为"主循环更新心跳标志,中断里校验心跳失败就不喂狗",否则不要把喂狗放在中断里——喂狗应该由主流程来证明"业务还活着",而不是由中断证明"中断还活着"。
10. 主循环里任务 2 卡死了,为什么看门狗可能救不了?
如果喂狗语句在任务 2 之前已执行,卡死发生在喂狗之后,看门狗照样被喂,无法复位。对策:每个关键任务/步骤之后喂狗,或为每个任务维护运行标志、汇总后喂狗,这样任何一段代码卡死都能在下一个喂狗点被发现。
11. 喂狗周期应该怎么选?喂太勤或太晚各有什么问题?
喂太晚(间隔 ≥ 超时时间)会误复位;喂太勤对 IWDG 没有副作用,但 WWDG 喂得太早(窗口未开)会立即复位。工程经验:喂狗周期取超时时间的 1/2~1/3,并保证最长任务路径加上中断阻塞时间也赶得上喂狗。
12. 长时间关中断(如 Flash 擦写)会导致看门狗误复位吗?
会。如果长阻塞期间没有喂狗且持续时间超过超时时间,看门狗就会复位。解决思路:把 Flash 擦写等长操作分片执行并穿插喂狗;或先喂狗再进入长操作,但要保证最坏情况下不超时;对窗口看门狗尤其要小心,它留给你的合法喂狗窗口本身就很短。
五、WWDG 窗口期
13. WWDG 的"窗口期"是什么意思?为什么不能太早喂狗?
WWDG 是 7 位递减计数器,窗口值 W[6:0] 定义在 WWDG_CFR 中。窗口期的含义:喂狗只有在"窗口已打开、计数器还没减到复位阈值"之间才合法——太早喂(计数值还大于 W,窗口未开)立即复位;太晚(计数器从 0x40 减到 0x3F 下溢)也复位;只有 W ≥ 计数值 > 0x3F 时喂狗才合法。窗口机制的意义在于强制喂狗发生在程序执行的特定时段,把"程序还在跑"升级为"程序还在按预期节奏跑",防止异常路径上随便喂狗掩盖问题。
14. WWDG 的提前唤醒中断(EWI)有什么用?
计数器减到 0x40(复位阈值前一刻)时触发 EWI 中断,让程序在复位真正发生之前做紧急处理:保存关键数据、写故障日志、切换到安全状态等。这是 WWDG 相比 IWDG 的重要优势——IWDG 没有中断,超时直接复位。
六、复位排查与掉电行为
15. 系统老是复位,如何确认是不是看门狗引起的?
第一步查复位标志:F1 的 RCC_CSR 寄存器中有 IWDGRSTF(独立看门狗复位标志)与 WWDGRSTF(窗口看门狗复位标志),启动早期读取并清除它们,即可区分是看门狗复位、上电复位还是外部复位。确认后排查:喂狗点位置是否合理、有无死循环等待标志位(while 等待没加超时)、是否长时间关中断/长阻塞、喂狗余量是否足够。调试时可用 DBGMCU 冻结看门狗(如 DBG_IWDG_STOP),避免断点暂停期间被看门狗反复复位打断调试。
16. 掉电之后,IWDG 还会工作吗?重新上电后呢?
不会。掉电即断电,LSI 与整个芯片都停止,IWDG 自然停止。重新上电后 IWDG 处于复位后的默认状态(未使能),需要软件重新配置 PR/RLR 并重新启动。注意区分:IWDG"软件无法关闭"指运行期间不能关,而掉电/复位本身就是一次硬件复位,配置会回到默认值。进阶考点:F1 的 IWDG 在待机模式下仍可能继续计数,待机时间若超过超时时间,唤醒后可能直接复位(以参考手册为准)。

