跳转至

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 外部看门狗芯片规格说明

二、核心示例

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 扩展库。