air153C_wtd - 添加软件看门狗功能,防止死机 副本
作者:陈媛媛
一、概述
air153C_wtd 库是用于控制外部硬件看门狗的 Lua 库,通过 GPIO 引脚控制外部看门狗芯片,旨在提高系统的可靠性和稳定性。在 air153C_wtd 库的帮助下,当系统出现异常时,能够通过外部看门狗芯片自动复位并重新启动系统。
1.1 各类看门狗的区别
1.1.1. 内部硬件看门狗(Always-On Watchdog Timer)
- 定义:AON WDT,位于芯片"Always-On"电源域的硬件看门狗
- 特点:开机后硬件层面自动开始计数,独立于软件系统运行
- 控制方式:完全由内核固件自动控制,不需要脚本干预
- 硬件定时器持续计数,喂狗操作复位计数,超时(计数溢出)触发系统复位
- 可靠性:理论上能复位大部分系统异常,但在极端硬件故障(如 PSRAM 完全死锁)时可能无法正确重启
1.1.2. 软件看门狗
- 定义:基于操作系统任务调度机制的软件层面监控
- 特点:能够检测任务阻塞和软件死锁,依赖操作系统正常运行
- 控制方式:通过 wdt 库函数控制
- 实现原理:基于操作系统定时器机制,FreeRTOS 按 2ms 间隔调用检测函数
- 特殊说明:在 Air8101/Air6101 中,软件看门狗检测函数同时也会喂硬件看门狗
1.1.3. 外部硬件看门狗
- 定义:独立的看门狗芯片,通过 GPIO 接口通信
- 特点:完全独立于主系统,具有独立的电源和时钟,可靠性最高
- 控制方式:通过 air153C_wtd 库控制,使用 GPIO 引脚实现喂狗操作.
1.2 air153C_wtd 库专门用于控制芯片外部的看门狗:
- 外部硬件看门狗:通过 GPIO 引脚控制的外部看门狗芯片
- 脉冲喂狗机制:通过产生特定宽度的脉冲信号来喂狗
1.3 Air153C 外部看门狗芯片规格说明
- 外部硬件看门狗芯片为 Air153C。
- Air153C 看门狗超时时长默认为 240 秒,并且不允许修改。
- Air153C 芯片的更多资料参考链接:https://docs.openluat.com/accessory/Air153C/
二、核心示例
1、核心示例是指:使用本库文件提供的扩展 API,开发的基础业务逻辑的演示代码;
2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;
3、更加完整和详细的 demo,请参考 LuatOS 仓库 中的 demo/air153C_wtd
PROJECT = "air153C_wtd_demo"
VERSION = "00.000.001"
log.info("main", PROJECT, VERSION)
local air153C_wtd = require("air153C_wtd")
-- 看门狗喂狗任务
function wdt_task()
-- 初始化看门狗引脚28
air153C_wtd.init(28)
-- 主循环中定期喂狗
while true do
-- 每10秒喂一次狗
air153C_wtd.feed_dog(28)
log.info("wdt", "Watchdog fed")
-- 执行其他业务逻辑
sys.wait(10000) -- 等待10秒
end
end
-- 模拟正常业务任务
function business_task()
local count = 0
while true do
count = count + 1
log.info("business", "Normal operation", count)
sys.wait(2000) -- 每2秒执行一次
end
end
-- 启动任务
sys.taskInit(wdt_task)
sys.taskInit(business_task)
sys.run()
三、常量详解
核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
air153C_wtd 核心库没有常量。
四、函数详解
4.1 air153C_wtd.init(watchdogPin)
功能 初始化看门狗控制引脚。
参数
参数含义:看门狗控制引脚对应的GPIO ID编号
数据类型:number
取值范围:整数,具体的GPIO ID编号取决于硬件
是否必选:是
注意事项:调用此函数后,在此函数内部,会执行以下动作:
设置GPIO为输出模式,并且初始化输出低电平,初始低电平。
参数示例:air153C_wtd.init(28)
注意事项:
- 调用此函数后,在此函数内部,会执行以下动作: 设置 GPIO 为输出模式,并且初始化输出低电平。
返回值 无返回值
示例
-- 初始化看门狗,使用引脚28
air153C_wtd.init(28)
4.2 air153C_wtd.feed_dog(watchdogPin)
功能 执行喂狗操作,通过产生脉冲信号喂外部看门狗。
参数
参数含义:看门狗引脚对应的GPIO ID编号
数据类型:number
取值范围:整数,具体的GPIO ID编号取决于硬件
是否必选:是
注意事项:必须与初始化时使用的GPIO ID编号一致
参数示例:air153C_wtd.feed_dog(28)
返回值 无返回值
注意事项:
- 需要定期调用此函数防止看门狗超时.
- Air153C 看门狗超时时长默认为 240S,不允许更改。
示例
-- 喂狗操作
air153C_wtd.feed_dog(28)
-- 在定时器中定期喂狗
local function feed_watchdog()
air153C_wtd.feed_dog(28)
end
-- 立即喂狗一次
feed_watchdog()
-- 在定时器中定期喂狗(每10秒)
sys.timerLoopStart(feed_watchdog, 10000)
4.3 air153C_wtd.close_watch_dog(watchdogPin)
功能 关闭看门狗功能
参数
参数含义:看门狗看门狗引脚对应的GPIO ID编号
数据类型:number
取值范围:整数,具体的GPIO ID编号取决于硬件
是否必选:是
注意事项:必须与初始化时使用的引脚一致
参数示例:air153C_wtd.close_watch_dog(28)
注意事项
正常运行过程中,不要调用此接口关闭看门狗功能,否则会导致看门狗重启主控模组的异常现象。
返回值 无返回值
示例
-- 在特殊情况下关闭看门狗
--正常运行过程中,不要调用此接口关闭看门狗功能,否则会导致看门狗重启主控模组的异常现象
air153C_wtd.close_watch_dog(28)
五、产品支持说明
支持 LuatOS 开发的产品都支持 air153C_wtd 扩展库。