内部硬件看门狗(wdt)
一、看门狗电路介绍
看门狗(Watch Dog Timer,WDT)是一种用于监控嵌入式系统状态的电路,旨在提高系统的可靠性和稳定性。在看门狗电路的帮助下,当系统出现异常,如程序跑飞或死循环时,能够自动复位并重新启动系统。
1.1 看门狗的工作原理
看门狗电路通常包括一个定时器、一个喂狗信号和一个复位(Reset)输出。在正常的系统运行过程中,主控制器(MCU)会定期向喂狗信号发送一个脉冲,以“喂”看门狗,防止其计时到达预设值。如果 MCU 由于某种原因未能在规定时间内喂狗,看门狗定时器将会计满并输出一个复位信号,将MCU复位。
1.2 看门狗的应用架构
在实际应用中,看门狗芯片通常连接到MCU的一个GPIO端口。MCU在其正常运行期间会定期向该端口写入一个高电平或低电平信号,以此告诉看门狗芯片它仍在正常工作。如果MCU未能按时发出信号,看门狗将触发复位操作。
1.3 看门狗芯片的功能和硬件
某些看门狗芯片如TPV6823具有多个引脚,包括供电引脚(VCC)、喂狗信号引脚(WDI)、复位输出引脚(RESETn)和手动复位输入引脚(MRn)。这些引脚提供了多种复位方式和时间设置,以适应不同的应用需求。
1.4 看门狗的定时时间
看门狗的定时时间通常需要保持在一个相对较长的周期,例如200ms左右。这样的设置是为了确保在正常运行中,即使MCU由于干扰而未能及时喂狗,看门狗也不会立即复位系统,从而给MCU足够的时间来响应和处理问题。
1.5 看门狗的类型
看门狗可以分为独立看门狗和窗口看门狗。独立看门狗的时间精度要求较低,而窗口看门狗则用于时间精度要求较高的场合。
1.6 软硬件看门狗的区别
硬件看门狗利用独立的定时器电路来实现监控功能,具有较高的可靠性。软件看门狗则使用处理器内部的定时器或其他机制来实现,虽然在一定程度上可以简化硬件设计,但在可靠性方面通常不如硬件看门狗。
总体而言,看门狗是一种重要的系统保护机制,通过定期“喂狗”来确保系统的正常运行。当系统出现异常时,看门狗能够及时复位系统,防止死循环和程序跑飞等情况的发生,从而提高系统的可靠性和稳定性。在实际应用中,开发者需要根据具体需求选择合适的看门狗解决方案,并设置适当的时间参数,以实现最佳的保护效果。
二、演示功能概述
本文演示主要通过Air8101开发板和LuatOS系统,介绍如何使用看门狗定时器(WDT)库来防止设备死机。
演示分为两个部分:正常运行情况和故障场景模拟。
在正常运行情况下,程序首先会初始化看门狗库,并设置超时时间和喂狗周期。然后,创建一个任务,该任务会定期喂狗,以防止看门狗定时器超时。如果“喂”狗超时,系统将自动重启。
在故障场景模拟部分,我们添加了一个新的任务fault_task
,该任务会进入死循环,从而阻断喂狗操作。这样,当看门狗定时器超时后,系统将自动重启,模拟了设备在故障场景下的自动恢复能力。
通过这个演示,我们可以了解看门狗定时器在嵌入式系统中的重要作用,它能够有效防止系统死机,提高系统的稳定性和可靠性。
三、准备硬件环境
“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”
参考:硬件环境清单,准备以及组装好硬件环境。
四、准备软件环境
“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。
1. Luatools 工具;
2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;参考项目使用的内核固件;
3. luatos 需要的脚本和资源文件
脚本和资源文件:https://gitee.com/openLuat/LuatOS-Air8101/tree/master/demo/WDT
lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板,将本篇文章中演示使用的项目文件烧录到 Air8101 开发板中。
五、watchdog库介绍
该库提供了一系列用于管理和操作看门狗定时器的API函数,使得开发者可以方便地在LuatOS系统中管理看门狗定时器,从而提高设备的稳定性。
watchdog库API接口参考:wdt - watchdog 操作库
六、功能验证
6.1 程序正常运行
6.1.1 示例代码介绍
1. 项目信息:在开头定义了项目名称PROJECT
和版本VERSION
,并通过日志输出这些信息。
2. 引入系统库:通过require("sys")
引入sys库,这是LuatOS中常用的系统库。
3. 任务初始化:使用sys.taskInit
函数创建一个新的任务。在任务中检查wdt库是否可用,如果不可用,则进入一个无限循环,每秒钟输出一次提示信息。
4. wdt配置:
- 初始化wdt库,设置超时时间为 9s。
- 设置一个定时器每3s喂一次看门狗,确保设备在正常运行的情况下不会重启。
- 说明了若发生软件崩溃或硬件故障,最多18秒后将自动重启设备。
5. 运行系统:最后通过sys.run()
启动系统,后面不应添加任何其他语句。
6.1.2 完整代码展示
-- 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()之后后面不要加任何语句!!!!!
6.1.3 运行结果展示
通过 Luatools 工具查看日志信息
6.2 添加死循环模拟故障场景
6.2.1 示例代码介绍
我们在原有示例代码中创建了一个新的任务,命名为fault_task
,它将进入一个死循环。由于这个新任务阻断了喂狗操作,设备将在超时后自动重启。这样,我们就可以有效地模拟看门狗的超时情况。
-- 创建一个新的任务来模拟故障场景
sys.taskInit(function()
log.info("fault_task", "Entering infinite loop to simulate fault.")
while true do
-- 模拟故障场景,真的进入死循环
end
end)
6.2.2 完整代码展示
-- 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()之后后面不要加任何语句!!!!!
6.2.3 运行结果展示
七、总结
本次演示通过Air8101开发板和LuatOS系统,详细介绍了如何使用看门狗定时器(WDT)库来防止嵌入式设备死机。看门狗电路作为一种重要的系统保护机制,能够在系统异常时自动复位并重新启动系统,从而提高系统的可靠性和稳定性。
在演示中,我们首先介绍了看门狗的工作原理、应用架构、定时时间设置以及软硬件看门狗的区别。接着,我们通过实际操作,展示了如何在一个简单的LuatOS项目中集成看门狗定时器,并设置了适当的参数来确保系统在正常运行和故障场景下都能自动恢复。
通过本次演示,我们深入理解了看门狗定时器在嵌入式系统中的工作原理和应用价值,以及在实际项目中如何有效地利用看门狗库来提高系统的稳定性和可靠性。这对于嵌入式系统开发者来说,是一个具有重要意义的技能。
八、扩展
8.1 看门狗定时器的应用场景
看门狗定时器广泛应用于各种嵌入式系统和物联网设备中,特别是在需要高可靠性的应用场景中。一些典型的应用场景包括:
1. 工业控制系统:在工业生产过程中,控制系统需要高度稳定和可靠,看门狗定时器可以确保系统在受到干扰或异常情况时能够迅速恢复。
2. 车载电子系统:车载电子系统面临着复杂的电磁环境和振动,看门狗定时器可以帮助系统在上电复位后保持稳定运行,防止因软件或硬件故障导致的系统死机。
3. 医疗设备:医疗设备对稳定性和可靠性有很高的要求,看门狗定时器可以确保设备在长时间运行过程中不会因为故障而停止工作,从而保障患者的安全和设备的连续性。
4. 通信设备:在通信系统中,看门狗定时器可以用于监控和保护网络设备,确保数据传输的稳定性和可靠性。
8.2 看门狗定时器的设计考虑因素
在设计和实现看门狗定时器时,需要考虑以下几个关键因素:
1. 超时时间:超时时间是指看门狗定时器从开始计时到触发复位信号的时间间隔。这个时间需要根据具体应用的需求来设定,通常需要平衡系统的稳定性和响应速度。
2. 喂狗周期:喂狗周期是指主控制器向看门狗芯片发送脉冲的时间间隔。喂狗周期应该设置得足够短,以防止看门狗定时器在正常运行中误触发复位。
3. 看门狗复位输出:看门狗定时器通常具有一个复位输出引脚,用于向主控制器提供复位信号。在设计时,需要确保复位输出引脚的电平和主控制器的复位输入引脚兼容。
4. 功耗:在设计看门狗定时器时,需要考虑其功耗,特别是在低功耗应用中。选择低功耗的看门狗芯片和合理的电源设计对于系统的整体功耗至关重要。
5. 兼容性和可扩展性:在设计看门狗定时器时,需要考虑其与其他系统的兼容性和可扩展性。确保看门狗定时器能够与其他硬件和软件组件无缝集成,并在未来需要时能够轻松扩展或升级。
通过综合考虑这些因素,开发者可以设计和实现一个稳定、可靠且高效的看门狗定时器解决方案,以确保嵌入式系统的正常运行和数据传输的稳定性。
九、常见问题
9.1 看门狗定时器是如何工作的?
看门狗定时器通过主控制器定期向其发送脉冲信号来保持计时。如果主控制器在规定时间内未能发送脉冲,看门狗定时器将触发复位信号,将主控制器复位。
9.2 如何配置看门狗定时器的超时时间和喂狗周期?
在LuatOS等嵌入式操作系统中,看门狗定时器的超时时间和喂狗周期通常通过API函数进行配置。可以根据具体应用的需求来设置合适的时间间隔。
若使用本文中所提到的watchdog操作库,可按照以下步骤进行配置:
1. 初始化看门狗: 使用
wdt.init(timeout)
函数来初始化看门狗定时器,timeout
参数是超时时长,单位为毫秒。例如,如果你希望看门狗的超时时间为9000毫秒,可以这样调用:wdt.init(9000)
2. 设置看门狗超时时间(可选): 如果设备支持,可以调用
wdt.setTimeout(timeout)
来重新设置看门狗的超时时长,单位同样为毫秒。例如:wdt.setTimeout(10000) -- 设置超时时间为10000毫秒
3. 定期喂狗: 使用
wdt.feed()
函数来喂狗,以重置超时计时。建议使用定时器定期调用这个函数。例如,使用系统定时器每3000毫秒喂一次狗,可以这样设置:sys.timerLoopStart(wdt.feed, 3000)
通过以上步骤,你可以成功配置看门狗定时器的超时时间和喂狗周期,确保设备不会因为未喂狗而重启。