| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- -- 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 = "fault" -- 修改这个变量来切换演示模式
- -- 喂狗函数
- 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
|