13917187172 4 месяцев назад
Родитель
Сommit
15f1c1ac92

+ 65 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/air153c_wdt.lua

@@ -0,0 +1,65 @@
+-- air153c_wdt.lua
+--[[
+@summary Air153C外部看门狗演示模块
+@version 1.0
+@date    2025.10.25
+@author  陈媛媛
+@usage
+本模块演示Air153C外部看门狗的正常和异常场景:
+1、正常场景:定期喂狗,系统正常运行
+2、异常场景:模拟故障导致无法喂狗,触发看门狗复位
+3、通过修改 DEMO_MODE 变量来选择演示模式:
+- "normal": 正常喂狗模式
+- "fault": 异常故障模式
+
+注意:在异常模式下,设备会在运行一段时间后重启
+]]
+
+-- 演示模式选择: "normal" 或 "fault"
+local DEMO_MODE = "normal"  -- 修改这个变量来切换演示模式
+
+-- 看门狗喂狗任务函数
+local function watchdogTask()
+    -- 检查air153C_wtd库是否存在
+    if air153C_wtd == nil then
+        log.error("air153C_wtd", "air153C_wtd库不存在")
+        return
+    end
+    
+    -- 初始化看门狗引脚28
+    air153C_wtd.init(28)
+    log.info("air153C_wtd", "外部看门狗已初始化,引脚28")
+
+    if DEMO_MODE == "normal" then
+        -- 正常模式:主循环中定期喂狗
+        while true do
+            -- 每10秒喂一次狗
+            air153C_wtd.feed_dog(28)
+            log.info("wdt", "Watchdog fed")
+            
+            -- 执行其他业务逻辑
+            sys.wait(10000)  -- 等待10秒
+        end
+    elseif DEMO_MODE == "fault" then
+        -- 异常模式:先正常喂狗一段时间,然后停止喂狗
+        local feed_count = 0
+        while true do
+            -- 每10秒喂一次狗
+            air153C_wtd.feed_dog(28)
+            feed_count = feed_count + 1
+            log.info("wdt", "Watchdog fed")
+            
+            -- 执行其他业务逻辑
+            sys.wait(10000)  -- 等待10秒
+            
+            -- 喂狗3次后(约30秒)停止喂狗,模拟故障
+            if feed_count >= 3 then
+                log.info("wdt", "Stopping watchdog feed to simulate fault")
+                break
+            end
+        end
+    end
+end
+
+-- 看门狗喂狗任务
+sys.taskInit(watchdogTask)

+ 71 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/internal_wdt.lua

@@ -0,0 +1,71 @@
+-- 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

+ 62 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/main.lua

@@ -0,0 +1,62 @@
+--[[
+@module  main
+@summary LuatOS语音通话应用主入口,负责加载功能模块
+@version 1.0
+@date    2025.10.25
+@author  陈媛媛
+@usage
+本demo演示的核心功能为:
+1、内部看门狗正常和异常场景演示
+2、外部硬件看门狗Air153C正常和异常场景演示
+
+更多说明参考本目录下的readme.md文件
+]]
+
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "wdt_DEMO"
+VERSION = "001.000.000"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 仅加载必要的功能模块,有选择的打开以下两个lua文件中的一个
+require "internal_wdt"  -- 内部看门狗演示模块
+--require "air153c_wdt"    -- 外部看门狗演示模块
+
+-- 用户代码已结束---------------------------------------------
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!

+ 133 - 0
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/readme.md

@@ -0,0 +1,133 @@
+# wdt_DEMO 项目说明
+
+## 项目概述
+本项目是基于 Air8000核心板,演示了两种看门狗(WDT)功能的使用。
+
+- 内部看门狗 - 使用芯片内置的硬件看门狗
+
+- 外部看门狗 - 使用 Air153C 外置看门狗芯片
+
+## 功能说明
+
+内部看门狗演示
+
+ - 自动启用:硬件看门狗由底层固件自动启用,超时时间20秒
+
+ - 定期喂狗:每3秒执行一次喂狗操作,确保系统正常运行
+
+ - 故障模拟:可模拟系统死锁导致无法喂狗的场景
+
+ - 自动恢复:看门狗超时后自动重启系统
+
+外部看门狗演示 (Air153C)
+
+ - 引脚控制:通过GPIO引脚28控制外部看门狗芯片
+
+ - 定期喂狗:每10秒执行一次喂狗操作
+
+ - 故障模拟:可模拟程序异常停止喂狗的场景
+
+ - 硬件复位:外部看门狗超时后通过硬件复位系统
+
+## 演示硬件环境
+1、Air8000核心板
+ 
+![alt text]( https://docs.openLuat.com/cdn/image/Air8000%E6%A0%B8%E5%BF%83%E6%9D%BF.jpg)
+
+2、Air153C配件版(待补充图片和接线图)
+
+
+3、TYPE-C USB数据线一根
+- Air8000开发板/核心板通过 TYPE-C USB 口供电;
+- TYPE-C USB 数据线直接插到核心板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
+
+
+## 演示软件环境
+1、Luatools下载调试工具 [https://docs.openluat.com/air780epm/common/Luatools/]
+
+2、Air8000 V2016版本固件。不同版本区别请见https://docs.openluat.com/air8000/luatos/firmware/
+
+3、lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
+
+4、准备好软件环境之后,接下来查看[如何烧录项目文件到 Air8000核心板中](https://docs.openluat.com/air780epm/common/Luatools/)。
+
+## 相关软件资料
+wdt 核心库文档:https://docs.openluat.com/osapi/core/wdt/
+
+air153C_wtd 扩展库文档:https://docs.openluat.com/osapi/ext/air153C_wtd/
+
+## 演示核心步骤
+1、搭建好硬件环境
+
+2、加载演示脚本文件:
+
+- 在main.lua中有选择的选择以下两个lua文件中的一个
+
+  - require "internal_wdt"  -- 内部看门狗演示模块
+
+  - require "air153c_wdt"    -- 外部看门狗演示模块
+
+- 在internal_wdt.lua或者air153c_wdt.Lua 两个演示脚本中,通过修改 DEMO_MODE 变量选择演示模式
+
+ - local DEMO_MODE = "normal"   -- 正常模式:持续喂狗
+
+ - local DEMO_MODE = "fault"    -- 故障模式:模拟系统故障
+
+3、Luatools烧录内核固件和修改后的demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+5、内部看门狗演示
+
+- 正常模式演示
+
+  设置 DEMO_MODE = "normal"
+
+  烧录并运行脚本
+
+  程序运行后会显示以下典型日志:
+  ```lua
+  I/user.wdt 硬件看门狗已由底层固件启用
+  I/user.wdt 喂狗完成
+  I/user.wdt 喂狗完成
+   ```
+
+- 故障模式演示
+
+  设置 DEMO_MODE = "fault"
+
+  烧录并运行脚本
+
+  程序运行后会显示以下典型日志:
+  ```lua
+   [2025-11-04 15:31:38.907][000000000.263] I/user.main wdt_DEMO 001.000.000
+   [2025-11-04 15:31:38.913][000000000.271] I/user.wdt 硬件看门狗已由底层固件启用
+   [2025-11-04 15:31:41.459][000000003.272] I/user.wdt 喂狗完成
+   [2025-11-04 15:31:43.457][000000005.271] I/user.wdt 故障前最后一次喂狗,成功 = true
+   [2025-11-04 15:31:43.464][000000005.272] I/user.fault_task 进入死循环模拟故障
+   [2025-11-04 15:31:43.472][000000005.272] I/user.fault_task 看门狗喂狗任务被阻塞,系统将在约20秒后重启
+   [2025-11-04 15:32:08.710] 工具提示: 模组已经死机,请不要关闭程序,正在接收必要的信息用于分析
+   [2025-11-04 15:32:32.943] 工具提示: diag com USB 断开连接 COM4 CommError,[WinError 22] 设备不识别此命令。
+   [2025-11-04 15:32:32.985] 工具提示: 死机信息接收成功,如有需要请将死机信息文件交给FAE分析,文件保存在log\ramdump\2025-11-04_153209_LuatOS-SoC_V2016_Air780EGH_867920073503634_COM4_ramdump.bin
+   [2025-11-04 15:32:33.006] 工具提示: 同时把使用的soc固件包或者编译生成的.elf文件交给FAE
+   [2025-11-04 15:32:33.022] 工具提示: print com USB 断开连接 COM3 CommError,[WinError 22] 设备不识别此命令。
+   [2025-11-04 15:32:33.664] 工具提示: soc log port COM3打开成功
+   [2025-11-04 15:32:33.738] 工具提示: ap log port COM4打开成功
+   [2025-11-04 15:32:33.751] 工具提示: 用户虚拟串口 COM5
+   [2025-11-04 15:32:34.049][000000000.272] I/user.wdt 硬件看门狗已由底层固件启用
+   [2025-11-04 15:32:34.054][000000000.272] I/user.reset_reason 重启原因1: 0 原因2: 0 原因3: 8
+  ``` 
+ 6、关于重启时间的说明:
+
+   实际重启时间不是精确的20秒,主要原因包括:
+
+   硬件处理时间:从看门狗超时到实际硬件复位需要一定的处理时间
+
+   系统状态保存:在复位前系统需要保存必要的状态信息和日志便于分析
+
+
+ 7、关于重启原因值的验证:
+
+   根据[pm.lastReson()函数的返回值说明](https://docs.openluat.com/osapi/core/pm/#45-pmlastreson)确认重启的原因3: 8 是内部看门狗触发的重启。
+
+8、外部看门狗演示(待补充)

+ 0 - 33
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/示例一 程序正常运行/main.lua

@@ -1,33 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "wdtdemo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
-sys.taskInit(function()
-    -- 这个demo要求有wdt库
-    -- wdt库的使用,基本上每个demo的头部都有演示
-    -- 模组/芯片的内部硬狗, 能解决绝大多数情况下的死机问题
-    -- 但如果有要求非常高的场景, 依然建议外挂硬件,然后通过gpio/i2c定时喂狗
-    if wdt == nil then
-        while 1 do
-            sys.wait(1000)
-            log.info("wdt", "this demo need wdt lib")
-        end
-    end
-    -- 注意, 大部分芯片/模块是 2 倍超时时间后才会重启
-    -- 以下是常规配置, 9秒超时, 3秒喂一次狗
-    -- 若软件崩溃,死循环,硬件死机,那么 最多 18 秒后,自动复位
-    -- 注意: 软件bug导致业务失败, 并不能通过wdt解决
-    wdt.init(9000)
-    sys.timerLoopStart(wdt.feed, 3000)
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 42
module/Air780EHM_Air780EHV_Air780EGH/demo/wdt/示例二 添加死循环模拟故障场景/main.lua

@@ -1,42 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "wdtdemo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
-sys.taskInit(function()
-    -- 这个demo要求有wdt库
-    -- wdt库的使用,基本上每个demo的头部都有演示
-    -- 模组/芯片的内部硬狗, 能解决绝大多数情况下的死机问题
-    -- 但如果有要求非常高的场景, 依然建议外挂硬件,然后通过gpio/i2c定时喂狗
-    if wdt == nil then
-        while 1 do
-            sys.wait(1000)
-            log.info("wdt", "this demo need wdt lib")
-        end
-    end
-    -- 注意, 大部分芯片/模块是 2 倍超时时间后才会重启
-    -- 以下是常规配置, 9秒超时, 3秒喂一次狗
-    -- 若软件崩溃,死循环,硬件死机,那么 最多 18 秒后,自动复位
-    -- 注意: 软件bug导致业务失败, 并不能通过wdt解决
-    wdt.init(9000)
-    sys.timerLoopStart(wdt.feed, 3000)
-end)
-
--- 创建一个新的任务来模拟故障场景
-sys.taskInit(function()
-    log.info("fault_task", "Entering infinite loop to simulate fault.")
-    while true do
-        -- 模拟故障场景,真的进入死循环
-    end
-end)
-
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!