一文详解微控制器中的看门狗定时器

描述

本文介绍看门狗定时器,通常缩写为 WDT,也称为计算机正常运行定时器或 COP。有外部看门狗设备和内部看门狗功能。本文仅介绍内部看门狗。

什么是看门狗定时器?(一个非常规的类比)

看门狗定时器是一种专门的定时器模块,可帮助微处理器从故障中恢复。如果看门狗定时器到达其计数周期的末尾,它将重置整个处理器系统。为了防止这种情况,处理器必须执行某种类型的特定操作来重置看门狗。因此,可以配置看门狗定时器,使其仅在发生处理器故障时到达其计数周期的末尾,并且通过强制系统复位,看门狗定时器帮助处理器从故障模式中逃脱并继续正常运行。

为了可视化 WDT 的功能,我有一个非常规的类比供您考虑。

《迷失》是一部广受欢迎的电视剧,讲述了飞机失事后一群幸存者被困在一个神秘的岛屿上。其中一个子情节涉及的角色认为他们必须在屏幕上的计数器变为 0 之前输入一串简短的数字,否则世界将结束。

当输入系列时,计数器重置并再次开始倒计时。输入这一系列数字只是心理实验的一部分,还是世界的命运岌岌可危,这永远不清楚。找出答案的唯一方法是不输入数字。角色们可以自由外出、寻找食物、游泳——但他们必须及时返回以重置计数器。从计算机的角度来看,接收到正确的输入意味着外面有一个人在正常操作并为柜台服务。没有收到正确的输入表明有问题。

看门狗定时器的运行方式与Lost中的计算机系统类似。微控制器的其余部分是压力过大的角色,他们可以自由地做任何事情,但必须定期为计数器提供服务,否则微控制器会复位(又名世界末日)。正确操作的软件和硬件将在固定的时间内为看门狗提供服务,而有故障的软件或硬件可能不会。

内部看门狗定时器的类型

有两种类型的看门狗,非窗口和窗口。如果服务计数器延迟,这两种类型都会导致复位。

如果服务发生得太快,窗口看门狗也会导致复位。此图显示了使用递增计数器的看门狗的时序。一些看门狗使用递减计数器,但原理是一样的。

定时器

看门狗定时器的时序

对于非窗口或窗口看门狗,在计数器达到上限值之前的任何服务都会重置计数器并且一切正常。窗口式看门狗会添加一个下限并创建一个计数窗口。下限和上限之间的任何服务都可以。这里是图表的详细描述。

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 的单次写入来对抗这种趋势。

睡眠模式

睡眠和其他低功耗模式使事情复杂化。如果处理器进入睡眠状态并停止执行,看门狗应该怎么做?看门狗时间应该静止吗?

当处理器进入和退出深度睡眠时,我当前使用的看门狗会在初始计数处停止并重新启动。这个话题很复杂,当微控制器使用低功耗模式时,您需要研究看门狗的操作。

渐进式反应

微控制器的完全复位可能过于苛刻。一些看门狗具有允许渐进式响应的功能。

例如,看门狗可能在复位之前的某个时间有一个中断请求选项。此功能允许中断服务程序在看门狗继续计数时修复或记录问题。如果中断程序不能让事情回到正轨,就会发生复位。

看门狗战略

我使用术语“策略”来确定在哪里设置看门狗的时间限制。最简单的策略是使用非窗口看门狗,其超时时间远长于服务看门狗之间程序的任何可能执行时间。我将其称为“重置按钮”策略,因为它取代了按下重置按钮的人。医疗设备或制造机器人等关键系统的策略需要更快的响应。

看门狗策略可以考虑许多因素:

系统是否使用可预测的主循环或基于实时操作系统的复杂多任务结构?

看门狗重置是否应该启动一系列自动系统检查?

看门狗是诊断和解决问题的一系列尝试的最后阶段吗?

您想在系统启动时测试看门狗以及其他检查吗?

看门狗策略是一个复杂的话题,并且非常依赖于应用程序。

在复位微控制器之前,看门狗在复位后的状态寄存器中设置一个位。通常该位与其他复位状态(例如掉电复位位)一起存储。测试看门狗复位位应该是策略的一部分。

至少,在启动期间测试该位并做一些事情来指示问题。否则,故障可能会被忽视,尤其是不常见的故障。例如,在显示屏上输出消息或点亮 LED。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分