跳转至

看门狗(wdt)

作者:陈媛媛 | 最后修改:2026-08-18

一、wdt 概述

看门狗(Watch Dog Timer,简称 WDT)是一种硬件定时器,其作用是当系统程序异常跑飞或死锁时,能够自动复位系统,保证系统稳定运行。

Air724UG 模组支持两种看门狗方式:

1、内部看门狗:使用芯片内置的硬件看门狗,由底层固件自动启用,超时时间 20 秒,可通过 wdt 核心库进行喂狗操作。

2、外部看门狗:使用 Air153C 外置看门狗芯片,通过 GPIO 引脚控制,超时后通过硬件复位系统。

二、演示功能概述

本 demo 基于 Air724UG 核心板,演示了内部看门狗和外部看门狗 Air153C 的正常与异常场景:

1、内部看门狗正常场景:每 3 秒定期喂狗一次,系统正常运行。

2、内部看门狗异常场景:模拟死循环故障,无法喂狗,看门狗超时后系统自动复位重启。

3、外部看门狗正常场景:通过 GPIO 引脚每 10 秒喂狗一次,系统正常运行。

4、外部看门狗异常场景:停止喂狗,外部看门狗超时后通过硬件复位系统。

三、准备硬件环境

1、Air724UG核心板一块

Air724UG核心板

2、TYPE-C USB数据线一根

3、Air724UG核心板和数据线的硬件接线方式为

  • Air724UG核心板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;

  • Air724UG核心板通过TYPE-C USB口供电;

Air724UG 核心板购买链接:合宙官方淘宝店铺

四、准备软件环境

4.1 软件环境

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

1、烧录工具:Luatools 下载调试工具

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

3、脚本文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air724/demo/wdt

4、lib脚本文件:使用Luatools烧录时,勾选 添加默认lib 选项,使用默认lib脚本文件

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

4.2 API 介绍

wdt 核心库:https://docs.openluat.com/osapi/core/wdt/

air153C_wtd 扩展库:https://docs.openluat.com/osapi/ext/air153C_wtd/

五、程序结构

wdt/
│── main.lua
│── internal_wdt.lua
│── air153c_wdt.lua
│── readme.md

5.1 文件说明

  1. main.lua:主程序入口文件,负责定义项目名和版本号、加载业务模块,最后调用 sys.run() 启动 LuatOS 运行框架。

  2. internal_wdt.lua:内部看门狗应用功能模块,演示内部看门狗的正常和异常场景。

  3. air153c_wdt.lua:Air153C 外部看门狗应用功能模块,演示外部看门狗的正常和异常场景。

六、代码详解

6.1 main.lua

主程序文件 main.lua 是整个项目的入口点。它负责定义 PROJECT 和 VERSION 变量、打印项目信息、加载业务模块,最后调用 sys.run() 启动 LuatOS 运行框架。

PROJECT = "wdt_DEMO"
VERSION = "001.999.000"

-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)

-- 仅加载必要的功能模块
require "internal_wdt"  -- 内部看门狗演示模块
-- require "air153c_wdt"    -- 外部看门狗演示模块

-- 用户代码已结束---------------------------------------------
sys.run()

6.2 internal_wdt.lua

内部看门狗应用功能模块,演示内部看门狗的正常和异常场景。通过修改 DEMO_MODE 变量选择演示模式。

6.2.1 演示模式选择

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

6.2.2 定期喂狗

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

6.2.3 故障模拟

-- 故障模拟函数
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

6.2.4 演示主函数

-- 内部看门狗演示函数
function internal_wdt_demo()
    -- 检查wdt库是否存在
    if wdt == nil then
        log.error("wdt", "wdt库不存在")
        return false
    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)

6.3 air153c_wdt.lua

Air153C 外部看门狗应用功能模块,演示外部看门狗的正常和异常场景。

6.3.1 初始化外部看门狗

local air153C_wtd = require("air153C_wtd")

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

local wdt_pin = 24

6.3.2 看门狗喂狗任务

-- 看门狗喂狗任务函数
local function watchdogTask()
    -- 检查air153C_wtd库是否存在
    if air153C_wtd == nil then
        log.error("air153C_wtd", "air153C_wtd库不存在")
        return false
    end

    -- 初始化看门狗引脚
    air153C_wtd.init(wdt_pin)
    log.info("air153C_wtd", "外部看门狗已初始化,引脚" .. wdt_pin)

    if DEMO_MODE == "normal" then
        -- 正常模式:主循环中定期喂狗
        while true do
            -- 每10秒喂一次狗
            air153C_wtd.feed_dog(wdt_pin)
            log.info("wdt", "Watchdog fed")

            -- 执行其他业务逻辑
            sys.wait(10000)  -- 等待10秒
        end
    elseif DEMO_MODE == "fault" then
        -- 异常模式:先正常喂狗一段时间,然后停止喂狗
        local feed_count = 0
        while true do
            -- 每10秒喂一次狗
            air153C_wtd.feed_dog(wdt_pin)
            feed_count = feed_count + 1
            log.info("wdt", "Watchdog fed")

            -- 执行其他业务逻辑
            sys.wait(10000)  -- 等待10秒

            -- 喂狗3次后(约30秒)停止喂狗,模拟故障
            if feed_count >= 3 then
                log.info("wdt", "Stopping watchdog feed to simulate fault")
                break
            end
        end
    end
end

-- 看门狗喂狗任务
sys.taskInit(watchdogTask)

七、运行结果展示

出现类似于下面的日志,就表示运行成功:

正常模式日志(喂狗操作会持续循环输出):

I/user.wdt 硬件看门狗已由底层固件启用
I/user.wdt 喂狗完成
I/user.wdt 喂狗完成

故障模式日志(看门狗超时后系统复位重启的完整过程):

[2025-11-04 15:31:38.907][000000000.263] I/user.main wdt_DEMO 001.000.000
[2025-11-04 15:31:38.913][000000000.271] I/user.wdt 硬件看门狗已由底层固件启用
[2025-11-04 15:31:41.459][000000003.272] I/user.wdt 喂狗完成
[2025-11-04 15:31:43.457][000000005.271] I/user.wdt 故障前最后一次喂狗,成功 = true
[2025-11-04 15:31:43.464][000000005.272] I/user.fault_task 进入死循环模拟故障
[2025-11-04 15:31:43.472][000000005.272] I/user.fault_task 看门狗喂狗任务被阻塞,系统将在约20秒后重启
[2025-11-04 15:32:08.710] 工具提示: 模组已经死机,请不要关闭程序,正在接收必要的信息用于分析
[2025-11-04 15:32:32.985] 工具提示: 死机信息接收成功,如有需要请将死机信息文件交给FAE分析
[2025-11-04 15:32:34.049][000000000.272] I/user.wdt 硬件看门狗已由底层固件启用
[2025-11-04 15:32:34.054][000000000.272] I/user.reset_reason 重启原因1: 0 原因2: 0 原因3: 8

注意:正常模式日志会持续循环输出"喂狗完成",文档仅截取典型片段展示;故障模式日志展示完整的故障生命周期,重启原因 3: 8 表示内部看门狗触发的重启。

八、总结

通过本文学习,你可以学习到:

1、Air724UG 内部看门狗的使用方法,包括定期喂狗和故障模拟。

2、Air724UG 外部看门狗 Air153C 的使用方法,包括 GPIO 引脚控制和喂狗操作。

3、看门狗超时后系统自动复位的机制,以及通过 pm.lastReson() 查看重启原因。

为后续学习更加复杂的业务逻辑打下基础。

搜索