WDT

WDT(看门狗定时器)是一种用于检测系统死机的机制。

  • 当系统正常运行时,需要定期“喂狗”(重置定时器)
  • 如果系统死机或卡住,未能及时喂狗,WDT 会自动重启系统
  • 提高系统的可靠性和稳定性

基本用法

from machine import WDT

# 创建 WDT 对象,设置超时时间(毫秒)
wdt = WDT(timeout=5000)  # 5秒超时

# 喂狗(重置定时器)
wdt.feed()

工作原理

  1. 初始化:创建 WDT 对象并设置超时时间
  2. 喂狗:系统正常运行时定期调用 feed() 方法
  3. 超时检测:如果超过设定时间未喂狗,WDT 会触发系统复位
  4. 自动重启:系统被重置,恢复到初始状态

常用操作

1. 基本使用
import machine
import time

# 初始化 WDT,10秒超时
wdt = machine.WDT(timeout=10000)

print('WDT 已启动,每 5 秒喂狗一次')

while True:
    print('喂狗')
    wdt.feed()  # 喂狗
    time.sleep(5)  # 5秒后再次喂狗
2. 在主循环中使用
import machine
import time

# 初始化 WDT,8秒超时
wdt = machine.WDT(timeout=8000)

print('系统启动')

while True:
    # 执行主要任务
    print('执行任务...')

    # 喂狗
    wdt.feed()
    print('喂狗')

    # 模拟任务执行时间
    time.sleep(3)
3. 异常处理中的使用
import machine
import time

# 初始化 WDT,5秒超时
wdt = machine.WDT(timeout=5000)

print('系统启动')

while True:
    try:
        # 执行可能出错的任务
        print('执行任务...')

        # 模拟可能的错误
        # x = 1 / 0

        # 任务执行成功,喂狗
        wdt.feed()
        print('喂狗')

    except Exception as e:
        print('错误:', e)
        # 即使出错也要喂狗,避免系统重启
        wdt.feed()

    time.sleep(2)

示例1:WDT 保护的 LED 闪烁

from machine import Pin, WDT
import time

led = Pin(25, Pin.OUT)
wdt = WDT(timeout=5000)  # 5秒超时

print('WDT 保护的 LED 闪烁')

count = 0
while True:
    # LED 闪烁
    led.toggle()

    # 每闪烁 10 次打印一次
    count += 1
    if count % 10 == 0:
        print(f'已闪烁 {count} 次')

    # 喂狗
    wdt.feed()

    # 延时
    time.sleep(0.5)

示例2:模拟死机检测

from machine import WDT
import time

wdt = WDT(timeout=3000)  # 3秒超时

print('系统启动')
print('3秒后模拟死机...')

# 前几次正常喂狗
for i in range(3):
    print(f'喂狗 {i+1}')
    wdt.feed()
    time.sleep(1)

print('模拟死机,停止喂狗...')
print('3秒后系统应该会重启')

# 不再喂狗,模拟死机
while True:
    print('系统卡住...')
    time.sleep(1)

注意事项

  • 超时时间:设置合适的超时时间,要大于正常任务的执行时间
  • 喂狗时机:在主循环中定期喂狗,确保系统正常运行时能及时喂狗
  • 异常处理:在异常处理中也要记得喂狗,避免因异常导致系统重启
  • 硬件限制:不同板子的 WDT 实现可能不同,超时时间范围也可能不同
  • 用途:WDT 主要用于提高系统的可靠性,特别适合无人值守的设备

不同板子的 WDT 差异

板子 WDT 特性
Raspberry Pi Pico 支持 WDT,超时时间范围有限制
ESP32 支持 WDT,有多种模式
Arduino boards 部分型号需要外部 WDT 模块
STM32 内置 WDT,功能强大

常见问题

Q: WDT 启动后可以关闭吗? A: 通常 WDT 一旦启动就无法关闭,只能通过喂狗来防止重启。

Q: 超时时间设置多长合适? A: 超时时间应该大于系统正常运行时最长的任务执行时间,通常设置为 2-10 秒。

Q: 喂狗太频繁会影响性能吗? A: 喂狗操作通常很快速,不会对性能产生明显影响。