- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
71 lines
2.1 KiB
Lua
71 lines
2.1 KiB
Lua
-- 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 = "normal" -- 修改这个变量来切换演示模式
|
|
|
|
-- 喂狗函数
|
|
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 |