时间:2025-05-06 20:01

目录

1. 什么是看门狗

2. IWDG独立看门狗

3. WWDG窗口看门狗

4. 为什么嵌入式系统/单片机系统普遍需要看门狗?

5. 补充知识点:“程序跑飞”


1. 什么是看门狗

        我们先用一句话来概括什么是看门狗:看门狗是一种定时器类型的硬件模块,能在系统软件出现异常(如死循环、跑飞、卡死)时自动重启MCU,以实现故障自恢复。

        看门狗是硬件层面的最后一道安全防线,当系统无法自我修复时,看门狗能触发复位。我们在学习看门狗的过程中经常听到“喂狗”这一操作,其实“喂狗”就是去定期操作看门狗模块中的计数器,只要你一直喂它(定时“喂狗”),它就安静,一旦你不喂(程序卡死了),它就“咬你”(触发MCU复位)。

        拿STM32F1系列MCU举例,STM32F1系列MCU提供了两种硬件看门狗模块,分别是独立看门狗IWDG窗口看门狗WWDG,IWDG独立于主系统,上电即起作用,无法停止,WWDG则是有一个“可喂窗口”,时序更严格,适合检测跑飞。

        对看门狗有了一个感性的认识后,下面我们讲讲看门狗的工作机制和原理,首先来说独立看门狗IWDG。

2. IWDG独立看门狗

        由低速独立时钟(LSI)驱动,与主时钟无关,MCU上电启动后无法关闭,程序运行时必须在规定时间(用户定义该时间)内定期喂狗(即重装计数器),若超时未喂,IWDG将自动复位MCU。
        硬件方面,IWDG本质上是由计数器和分频器组成的,分别实现向下计数和控制计数速度(分频LSI),此外还有KEY寄存器,用于特殊写操作控制启动/喂狗。注意,一旦IWDG启动,只能通过系统复位才能关闭它!


3. WWDG窗口看门狗

        由主系统时钟(PCLK1)驱动,有一个“允许喂狗的时间窗口”,即Tmin-Tmax时间窗口,如果喂得太早或太晚,都将触发复位,WWDG更适合检测程序“跳转到错误代码段”或“跑飞”的情况,而不仅是卡死,例如,在Tmin之前喂狗,认为程序运行过快(可能跑飞),在Tmax之后喂狗,认为程序卡住(未执行喂狗)。

4. 为什么嵌入式系统/单片机系统普遍需要看门狗?

        相信这个问题也是很多小白所不理解的点,因为我们完全可以通过观察实验现象或是其他方法判断程序运行状态,为何需要加入看门狗模块呢?下面我们从几个典型案例来分析一下:
        (1)防止死循环:如while(1)内部忘记加delay、失控;
        (2)防止系统跑飞(所谓跑飞就是代码踏空了,进入到了一片没有任何操作的区域):如空指针跳转、堆栈溢出;
        (3)自动复位恢复系统:用于无人值守的设备,保证自恢复;
        (4)保障工业可靠性:如电力、交通、医疗、IoT终端等设备;
        看门狗的典型应用场景
        (1)电机控制器卡死导致设备失控;
        (2)LoRa通信模块长时间未响应;
        (3)远程数据采集设备断网后卡死;
        (4)STM32中断嵌套失控,主循环未执行;
        总结一下,看门狗就是嵌入式系统的“最后保险”,当程序因各种未知问题(死循环、内存溢出、跑飞)导致系统异常时,硬件层会触发自动重启,恢复到已知状态(例如系统初始状态)

5. 补充知识点:“程序跑飞”

        一句话来说:“跑飞”是嵌入式系统开发中的一个极其常见而又致命的问题,它不是编译错误,而是程序在运行时脱离了原本应当执行的流程,跳转到了不可预知或非法的地址处执行代码,导致程序完全失控、逻辑错乱、死机、死循环或重启等异常行为。
        例如,CPU程序计数器(PC寄存器)跳转到了非法或异常的地址,执行了一段未定义、错误或随机的数据作为指令,造成系统异常、失控或卡死,或者程序原本应该从main函数开始、依序调用子函数,但“跳”到了内存地址0x00000000、0xDEADBEEF、0xFFFFFFF0等区域,从而导致程序执行了无效指令、非法中断、非法访问导致硬件复位或死锁。
        总结一下跑飞的常见原因:
        (1)空指针调用;
        (2)指针越界访问,写数组越界,破坏了函数返回地址或函数指针;
        (3)堆栈溢出,递归太深、局部变量太多,破坏返回地址;
        (4)中断失控,中断函数未正确注册,中断发生后跳入空区域;
        (5)内存写错,错误memcpy写进代码区,改写了指令;
        (6)解引用非法地址:*((uint32_t*)0xDEADBEEF);
        (7)地址强制类型转换错误:把数据指针错当函数指针调用;
        (8)启动文件错误:启动向量表未初始化,PC跳转失败。
        总的来说,跑飞是程序从正常流程“飞”到非法地址执行代码的现象,本质是PC寄存器失控,常由指针错误、栈溢出或中断向量问题引发,后果严重,需通过看门狗、异常捕获、代码保护等机制系统预防。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐