什么是看门狗定时器?(一个非常规的类比)
看门狗定时器是一种专用定时器模块,可帮助微处理器从故障中恢复。如果看门狗定时器到达其计数周期的末尾,它将重置整个处理器系统。为了防止这种情况,处理器必须执行某种类型的特定操作来重置看门狗。因此,可以配置看门狗定时器,使其仅在发生处理器故障时才到达其计数周期的末尾,并且通过强制系统复位,看门狗定时器帮助处理器脱离故障模式并继续正常运行。
为了形象化 WDT 的功能,我有一个非常规的类比供您考虑。
迷失是一部广受欢迎的电视剧,讲述了一群幸存者在飞机失事后被困在一个神秘的岛屿上的故事。其中一个次要情节涉及的角色认为他们必须在屏幕上的计数器变为 0 或世界末日之前输入一串简短的数字。
输入系列后,计数器将重置并再次开始倒计时。目前尚不清楚输入这一系列数字只是心理实验的一部分,还是世界的命运岌岌可危。找出答案的方法是不输入数字。角色可以自由出门、寻找食物、游泳——但他们必须及时返回以重置计数器。从计算机的角度来看,接收到正确的输入意味着有人在正常操作并为柜台提供服务。没有收到正确的输入表明出现了问题。
看门狗定时器的运行方式类似于《迷失》中的计算机系统。微控制器的其余部分是压力过大的角色,他们可以自由地做任何事情,但必须定期维护计数器或微控制器重置(又名世界末日)。正确运行的软件和硬件将在固定的时间内为看门狗提供服务,而有故障的软件或硬件可能不会。
内部看门狗定时器的类型
有两种类型的看门狗,非窗口和窗口。如果服务计数器延迟,这两种类型都会导致重置。
如果服务发生得太早,窗口式看门狗也会导致复位。此图显示了使用递增计数器的看门狗的时序。有些看门狗使用递减计数器,但原理是一样的。
看门狗定时器的时序
对于非窗口或窗口看门狗,计数器达到上限值之前的任何服务都会重置计数器,一切正常。窗口看门狗添加一个下限并创建一个计数窗口。下限和上限之间的任何服务都可以。这是图表的详细说明。
A - 启动后不久,程序用计数器的上限初始化看门狗并启用计数。对于窗口看门狗,还设置了下限。
B和C - 软件在计数器达到上限之前成功为计数器提供服务,对于窗口看门狗,在达到下限之后。维修后,计数器重置为 0 并重新开始计数。一切都好。
D - 程序不为计数器服务,计数达到上限。看门狗重置微控制器。
D 到 E - 微控制器启动并初始化并启用看门狗。
E - 看门狗开始计数。
F - 程序在达到上限之前为计数器提供服务,对于窗口看门狗,在达到下限之后提供服务。计数器重置为 0 并重新开始计数。一切都好。
G - 程序在计数达到窗口看门狗的下限之前为计数器提供服务。对于没有下限的非窗口看门狗,没有复位,计数器变为 0 并再次开始向上计数。对于窗口看门狗,微控制器被重置。
看门狗的细节差异很大。他们可以向上或向下计数。他们使用不同的时钟。他们对上限和下限有不同的选择。以下部分介绍了许多特性,但只是概述。
看门狗初始化
初始化看门狗可能很棘手。例如,一些看门狗在微控制器启动时自动启用。
如果不使用看门狗,则必须在启动时包含代码以禁用它。我目前使用的看门狗就是这种情况。如果我的程序需要运行超过一秒,我必须禁用看门狗或更改窗口设置!
一些看门狗只允许对控制寄存器进行写入作为一项安全功能。此功能可防止失控的软件在初始化后更改设置。如果您在具有此功能的看门狗中使用默认设置,请确保覆盖默认设置,即使位值相同。这“锁定”了值并维护了安全性。
如果您使用 C 语言编程,请注意启动代码中可能会初始化看门狗,它在您的 main() 函数之前运行。此代码有时会作为运行标准 C 程序的一部分由开发环境自动包含。此代码设置内存和中断向量表。查看您的启动代码以了解对看门狗的操作,并根据您的系统要求进行修改。
窗口设置
看门狗可以是非窗口和窗口的。通过将窗口的下限作为选项来提供两种类型的单个定时器是很常见的。窗口的大小随看门狗的不同而不同。
我目前使用的看门狗下限固定为上限的75%。另一个看门狗可以选择上限的 75%、50%、37.5% 或 25%。另一个看门狗独立设置上限和下限。关于如何选择上限也有很多差异。
维修 AKA 看门狗定时器重置
定期重置看门狗计数器称为“维修”定时器。不同的看门狗定时器会有不同的服务要求。所有服务要求都使用在失控软件执行期间不太可能发生的操作。
我目前使用的看门狗需要两次写入“服务寄存器”,值为 0x55,后跟 0xAA。如果将 0x55 或 0xAA 以外的任何值写入服务寄存器,在任何时候,微控制器都会立即复位。
另一个看门狗需要单次写入值为 0xAAAA 的服务寄存器。数字 0xA 和 0x5 以及它们的交替位模式 1010 和 0101 似乎令人着迷。一个定时器通过使用具有幻数 0x5743 的单次写入来违背这一趋势。
睡眠模式
睡眠和其他低功耗模式使事情变得复杂。如果处理器进入休眠并停止执行,看门狗应该做什么?看门狗时间应该保持不变吗?
当处理器进入和退出深度睡眠时,我当前使用的看门狗会在初始计数时停止并重新启动。这个话题很复杂,当微控制器使用低功耗模式时,您需要研究看门狗的操作。
渐进反应
完全重置微控制器可能过于苛刻。一些看门狗具有允许渐进式响应的功能。
例如,看门狗可以在复位之前的某个时间选择中断请求。此功能允许中断服务例程在看门狗继续计数时修复或记录问题。如果中断例程无法使事情回到正轨,则会发生重置。
WDT策略
我使用术语“策略”来确定在何处设置看门狗的时间限制。简单的策略是使用一个非窗口看门狗,其超时时间比服务看门狗之间程序的任何可能执行时间都长得多。我将其称为“重置按钮”策略,因为它代替了按下重置按钮的人。医疗设备或制造机器人等关键系统的策略需要更快的响应。
看门狗策略可以考虑很多因素:
• 系统是否使用可预测的主循环或基于实时操作系统的复杂多任务结构?
• 看门狗重置是否应该启动一系列自动系统检查?
• 看门狗是一系列诊断和修复问题尝试的阶段吗?
• 是否要在系统启动时测试看门狗以及其他检查?
看门狗策略是一个复杂的话题并且非常依赖于应用程序。
在复位微控制器之前,看门狗在复位后仍然存在的状态寄存器中设置一个位。通常该位与其他复位状态一起存储,例如掉电复位位。测试看门狗复位位应该是策略的一部分。
至少,在启动期间测试这个位并做一些事情来指示问题。否则,失败可能会被忽视,尤其是不常见的失败。例如,在显示器上输出消息或点亮 LED。