internal_wdt.lua 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -- internal_wdt.lua
  2. --[[
  3. @summary 内部看门狗演示模块
  4. @version 1.0
  5. @date 2025.10.25
  6. @author 陈媛媛
  7. @usage
  8. 本模块演示内部看门狗的正常和异常场景:
  9. 1、正常场景:定期喂狗,系统正常运行
  10. 2、异常场景:模拟故障导致无法喂狗,触发看门狗复位
  11. 3、通过修改 DEMO_MODE 变量来选择演示模式:
  12. - "normal": 正常喂狗模式
  13. - "fault": 异常故障模式
  14. 注意:在异常模式下,设备会在运行一段时间后重启
  15. ]]
  16. -- 演示模式选择: "normal" 或 "fault"
  17. local DEMO_MODE = "fault" -- 修改这个变量来切换演示模式
  18. -- 喂狗函数
  19. function feed_watchdog()
  20. wdt.feed()
  21. log.info("wdt", "喂狗完成")
  22. end
  23. -- 故障模拟函数
  24. function simulate_fault()
  25. sys.wait(5000) -- 等待5秒,让系统先正常运行一会
  26. -- 在进入死循环前尝试喂狗一次,并检查返回值
  27. local success = wdt.feed()
  28. log.info("wdt", "故障前最后一次喂狗,成功 =", success)
  29. log.info("fault_task", "进入死循环模拟故障")
  30. log.info("fault_task", "看门狗喂狗任务被阻塞,系统将在约20秒后重启")
  31. while true do
  32. -- 模拟故障场景,真的进入死循环
  33. -- 这将导致无法喂狗,最终触发系统重启
  34. end
  35. end
  36. -- 内部看门狗演示函数
  37. function internal_wdt_demo()
  38. -- 检查wdt库是否存在
  39. if wdt == nil then
  40. log.error("wdt", "wdt库不存在")
  41. return
  42. end
  43. log.info("wdt", "硬件看门狗已由底层固件启用")
  44. -- 检查开机原因
  45. local reason1, reason2, reason3 = pm.lastReson()
  46. log.info("reset_reason", "重启原因1:", reason1, "原因2:", reason2, "原因3:", reason3)
  47. -- 定期喂狗,防止系统重启
  48. -- 设置喂狗间隔为3秒,确保在20秒超时前完成喂狗
  49. sys.timerLoopStart(feed_watchdog, 3000) -- 每3秒喂一次狗
  50. end
  51. if DEMO_MODE == "fault" then
  52. -- 创建一个新的任务来模拟故障场景
  53. sys.taskInit(simulate_fault)
  54. end
  55. -- 启动演示
  56. sys.taskInit(internal_wdt_demo)
  57. return internal_wdt_demo