看门狗(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核心板一块

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 文件说明
-
main.lua:主程序入口文件,负责定义项目名和版本号、加载业务模块,最后调用sys.run()启动 LuatOS 运行框架。 -
internal_wdt.lua:内部看门狗应用功能模块,演示内部看门狗的正常和异常场景。 -
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() 查看重启原因。
为后续学习更加复杂的业务逻辑打下基础。