嵌入式系统中的WatchDog

概述

   WatchDog 是一种软件或硬件定时器,用于检测计算机故障或者从故障中恢复。它还可以用于保护计算机免受出错程序或者恶意程序的破坏。
   在正常操作期间,计算机周期性的重置 WatchDog 以防止它超时(“elapsing”)。如果因为硬件故障或者软件错误导致重置WatchDog失败,WatchDog就会超时并且会生成超时信号。这个信号可以被用于重新初始化系统到正确、安全的状态。

   对于一些特殊的硬件设备(例如远程空间探测器),如果系统出现故障,想要通过人工手动恢复几乎是不可能的,这时候设备需要“自力更生”,WatchDog定时器就可以派上用场了。另外,在运行不受信任的代码时,也可以使用 WatchDog,以限制该代码对 CPU 的使用时间,从而防止某些类型的拒绝服务攻击(DOS Attack)

参考 《A Guide to Watchdog Timers for Embedded Systems》 - By Chris Coleman.
参考 Wikipedia - WatchDog timer.

硬件 WatchDog

   许多芯片厂商在他们的 MCU 中包含了一个分立的 RTL 模块,称为”WatchDog 定时器”。该外围设备(peripheral)由一个随时钟周期信号自动递减的计数器组成,当计数器到达零时,硬件将自动重置(Reset)设备。

   WatchDog 定时器通常在默认情况下是禁用的,程序员有责任对其进行配置并且在软件中对其使能(enable)。一旦使能后,软件需要周期性地重置计数器,以防止设备被重启(Reset)。这个操作通常被称为“喂(Feeding)”、 “踢(Kicking)” 或者 “拍(Patting)” 狗。这样做的理由是,如果软件不能够重置 WatchDog 定时器,表明系统没有处于预期的运行状态,这时就需要将系统重置到正常状态。

为什么需要 WatchDog 定时器

   嵌入式系统在很多情况下都会被挂起(Hang),最常见的情况列举如下:

  • 内存已损坏,代码陷于无限循环中(infinite loop)。
  • 一个硬件组件(例如 HRM、加速度计或者 NOR Flash芯片)被卡住(wedged),不能响应请求。
  • 一个或者多个任务进入死锁(互斥体被按照错误的顺序占用或者没有被释放)。
  • 一个高优先级的 RTOS 任务占用了太多 CPU 时间,导致低优先级任务饥饿。

对于嵌入式系统,应该在适当的位置包含 WatchDog 定时器子系统。这是识别系统挂起并收集足够信息以从根本上解决潜在问题(issue)并提供修复的最佳方法。

配置 WatchDog

什么时候对 WatchDog 的配置进行重置?

通过情况下,有下面两种选择:

  • WatchDog 可以被 使能(enable) 或者禁用(disable)多次,并且在每次重启时必须被配置。
  • WatchDog 只能被配置和使能一次。一旦被使能后,只有特定类型的重置才能禁用(disable)WatchDog.

WatchDog 超时后会发生什么?

通常的选择有下面几种:

  • 当 WatchDog 超时后,硬件将立即对系统进行重置(Reset)。
  • 可以使能中断,并且当 WatchDog 接近超时时触发中断;在中断处理程序中,软件可以决定“喂狗”来防止系统被重置(Reset)。
  • 可以使能中断,并且当 WatchDog 超时时触发中断;MCU 将分配软件额外的一些时钟周期来做一些清理,然后重置系统。但这种做法往往是令人失望的,除非软件非常小心地分配清理工作执行所需的时钟周期数,否则硬件很可能在清理工作未完成前重置系统。

WatchDog 类型

单级 WatchDog

Watchdog 定时器可以有多种配置,而且许多允许修改其配置。MCU 通常有一个集成的 Watchdog 。在其他计算机设备中,Watchdog 可能直接位于在 CPU 附近且直接相连的芯片中,或者位于计算机机箱中的外部扩展卡中。Watchdog 可以和 CPU 共用同一个时钟信号,如下图所示,或者它们可以有独立的时钟信号。

多级 WatchDog

多级 Watchdog 计时器通常由多个计时器级联而成。