跳转至

03 内部硬件看门狗(wdt)

作者:陈媛媛 | 最后修改:2026-04-14

一、看门狗电路概述

看门狗(Watch Dog Timer,WDT)是一种用于监控嵌入式系统状态的电路,旨在提高系统的可靠性和稳定性。在看门狗电路的帮助下,当系统出现异常,如程序跑飞或死循环时,能够自动复位并重新启动系统。

1.1 看门狗的工作原理

看门狗电路通常包括一个定时器、一个喂狗信号和一个复位(Reset)输出。在正常的系统运行过程中,主控制器(MCU)会定期向喂狗信号发送一个脉冲,以“喂”看门狗,防止其计时到达预设值。如果 MCU 由于某种原因未能在规定时间内喂狗,看门狗定时器将会计满并输出一个复位信号,将 MCU 复位。

1.2 看门狗的应用架构

在实际应用中,看门狗芯片通常连接到 MCU 的一个 GPIO 端口。MCU 在其正常运行期间会定期向该端口写入一个高电平或低电平信号,以此告诉看门狗它仍然正常工作。如果 MCU 未能按时发出信号,看门狗将触发复位操作。

1.3 看门狗的类型

看门狗可以分为独立看门狗和窗口看门狗。独立看门狗的时间精度要求较低,而窗口看门狗则用于时间精度要求较高的场合。

1.4 软硬件看门狗的区别

1.4.1 内部硬件看门狗(Always-On Watchdog Timer)

  • 定义:AON WDT,位于芯片"Always-On"电源域的硬件看门狗,即使主芯片休眠仍能工作
  • 特点:开机后硬件层面自动开始计数,独立于软件系统运行
  • 控制方式:完全由内核固件自动控制,不需要脚本干预
  • 工作原理:硬件定时器持续计数,喂狗操作复位计数,超时(计数溢出)触发系统复位
  • 可靠性:理论上能复位大部分系统异常,但在极端硬件故障(如 PSRAM 完全死锁)时可能无法正确重启

1.4.2 软件看门狗

  • 定义:基于操作系统任务调度机制的软件层面监控
  • 特点:能够检测任务阻塞和软件死锁,依赖操作系统正常运行
  • 控制方式:通过 wdt 库函数控制
  • 实现原理:基于操作系统定时器机制,FreeRTOS 按 2ms 间隔调用检测函数
  • 特殊说明:在 Air8101 中,软件看门狗检测函数同时也会喂硬件看门狗

1.4.3 外部硬件看门狗

  • 定义:独立的看门狗芯片,通过 GPIO/I2C 等接口通信
  • 特点:完全独立于主系统,具有独立的电源和时钟,可靠性最高
  • 控制方式:不通过 wdt 库,需使用 i2c、gpio 等外设驱动库实现喂狗操作

硬件看门狗利用独立的定时器电路来实现监控功能,具有较高的可靠性。软件看门狗则使用处理器内部的定时器或其他机制来实现,虽然在一定程度上可以简化硬件设计,但在可靠性方面通常不如硬件看门狗。

总结而言,看门狗是一种重要的系统保护机制,通过定期“喂狗”来确保系统的正常运行。当系统出现异常时,看门狗能够及时复位系统,防止死循环和程序跑飞等情况的发生,从而提高系统的可靠性和稳定性。在实际应用中,开发者需要根据具体需求选择合适的看门狗解决方案,并设置适当的时间参数,以实现最佳的保护效果。

二、演示功能概述

本文演示主要通过 Air780EHV 和 LuatOS 系统,介绍如何使用看门狗定时器(wdt)核心库来防止嵌入式设备死机。

演示分为两个部分:正常运行情况和故障场景模拟。

在正常运行情况下,示例代码会初始化看门狗核心库。然后,创建一个任务,该任务会定期喂狗,以防止看门狗定时器超时。如果看门狗定时器超时,系统将自动重启。

在故障场景模拟部分,我们添加了一个新的任务 fault_task,该任务进入一个死循环,不进行喂狗操作。这样,当看门狗定时器超时后,系统将自动重启,模拟了设备在故障场景下的自动恢复能力。

通过这个演示,我们可以看到看门狗定时器在嵌入式系统中的重要作用,它能够有效防止系统死机,提高系统的稳定性和可靠性。

三、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

在开始实践本示例之前,先筹备一下软件环境:

1.Luatools 工具

2.内核固件文件(底层 core 固件文件):

本demo开发测试时使用的固件为LuatOS-SoC_V2016_Air780EHV,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

3.luatos 需要的脚本和资源文件

  • 脚本和资源文件点击此处查看与下载
  • lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

4.准备好软件环境之后,接下来查看如何烧录项目文件到 Air780EHV核心板中,将本篇文章中演示使用的项目文件烧录到Air780EHV核心板中。

五、wdt 核心库介绍

该库提供了一系列用于管理和操作看门狗定时器的 API 函数,使得开发者可以方便地在 LuatOS 系统中管理看门狗定时器,从而提高设备的稳定性。

wdt 核心库 API 接口参考:wdt 核心库

wdt 核心专门用于控制芯片内部的看门狗

  • 内部硬件看门狗:芯片内部集成的硬件看门狗单元,如 AON WDT(Always-On Watchdog Timer)。
  • 软件看门狗:基于操作系统任务调度机制的软件层面看门狗,

注意:外部硬件看门狗通过 GPIO/I2C 等接口控制,不在 wdt 核心库的控制范围内,需要使用相应的外设驱动库(如 i2c、gpio 库)来实现喂狗操作。

六、功能验证

6.1 示例代码介绍

本模块演示了内部看门狗的两种工作场景:正常喂狗模式和异常故障模式。

6.1.1 通过修改 DEMO_MODE 变量,来选择演示模式:

  • "normal": 正常喂狗模式
  • "fault": 异常故障模式

6.1.2 正常场景:定期喂狗,系统正常运行

  • 系统启动后,通过 sys.timerLoopStart 创建一个循环定时器
  • 定时器每 3 秒执行一次 feed_watchdog 函数
  • 由于定期喂狗,看门狗不会超时,系统保持稳定运行

6.1.3 异常场景:模拟故障导致无法喂狗,触发看门狗复位

  • 系统启动后,正常喂狗约 5 秒钟
  • 随后进入模拟故障状态,创建死循环阻塞系统
  • 死循环导致喂狗定时器无法执行
  • 看门狗计数器持续累加,最终超时触发系统复位

6.2 完整代码展示

-- internal_wdt.lua
--[[
@summary 内部看门狗演示模块
@version 1.0
@date    2025.10.25
@author  陈媛媛
@usage
本模块演示内部看门狗的正常和异常场景:
1、正常场景:定期喂狗,系统正常运行
2、异常场景:模拟故障导致无法喂狗,触发看门狗复位
3、通过修改 DEMO_MODE 变量来选择演示模式:
- "normal": 正常喂狗模式
- "fault": 异常故障模式

注意:在异常模式下,设备会在运行一段时间后重启
]]

-- 演示模式选择: "normal" 或 "fault"
local DEMO_MODE = "fault"  -- 修改这个变量来切换演示模式

-- 喂狗函数
function feed_watchdog()
    wdt.feed()
    log.info("wdt", "喂狗完成")
end

-- 故障模拟函数
function simulate_fault()
    sys.wait(5000) -- 等待5秒,让系统先正常运行一会

    -- 在进入死循环前尝试喂狗一次,并检查返回值
    local success = wdt.feed()
    log.info("wdt", "故障前最后一次喂狗,成功 =", success)

    log.info("fault_task", "进入死循环模拟故障")
    log.info("fault_task", "看门狗喂狗任务被阻塞,系统将在约20秒后重启")

    while true do
        -- 模拟故障场景,真的进入死循环
        -- 这将导致无法喂狗,最终触发系统重启
    end
end

-- 内部看门狗演示函数
function internal_wdt_demo()
    -- 检查wdt库是否存在
    if wdt == nil then
        log.error("wdt", "wdt库不存在")
        return
    end

    log.info("wdt", "硬件看门狗已由底层固件启用")

    -- 检查开机原因
    local reason1, reason2, reason3 = pm.lastReson()
    log.info("reset_reason", "重启原因1:", reason1, "原因2:", reason2, "原因3:", reason3)

    -- 定期喂狗,防止系统重启
    -- 设置喂狗间隔为3秒,确保在20秒超时前完成喂狗
    sys.timerLoopStart(feed_watchdog, 3000) -- 每3秒喂一次狗
end

if DEMO_MODE == "fault" then
    -- 创建一个新的任务来模拟故障场景
    sys.taskInit(simulate_fault)
end

-- 启动演示
sys.taskInit(internal_wdt_demo)

return internal_wdt_demo

6.3 运行结果展示

通过 Luatools 工具查看日志 1、正常场景

2、添加死循环模拟故障场景

七、总结

本次演示通过 Air780EHV 核心板 和 LuatOS 系统,详细介绍了如何使用看门狗定时器(wdt)库来防止嵌入式设备死机。

通过本次演示,我们深入理解了看门狗定时器在嵌入式系统中的工作原理和应用价值,以及在实际项目中如何有效地利用看门狗库来提高系统的稳定性和可靠性。这对于嵌入式系统开发者来说,是一个具有重要意义的技能。