嵌入式系统的Watchdog

Introduction

   Watchdog,又名看门狗,光听名字就知道是保卫系统的可靠帮手,它相当于系统警察,当系统发生严重错误(比如程序跑飞或进入死循环等)不能恢复的时候,能够让系统重启。

   看门狗最初的意义是因为早期嵌入式设备上的程序经常跑飞(比如说电磁干扰等),为了避免系统在无人干预时长时间挂起,所以专门设置了一个硬件看门狗,每隔一段时间,看门狗就去检查某个参数是不是被设置了,如果发现该参数被设置了,则判断为系统出错,然后强制重启。

   另外,它又叫 watchdogtimer(WDT),即一个定时器电路, 一般有一个输入,叫喂狗(feed),一个输出到MCU(微控制单元 Microcontroller Unit,俗称单片机)的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定时间不喂狗(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机. 从而使嵌入式系统可以在无人状态下实现连续工作。

How to work?

  Watchdog在实现上可以是硬件电路也可以是软件定时器,能够在系统出现故障时自动重新启动系统。

  在比较高档的嵌入式硬件芯片中,都有一个Watchdog模块,如果在MCU/MPU中没有集成Watchdog,一般会在此嵌入式系统中加一个专门的Watchdog芯片(常用的WDT芯片如MAX813 ,5045, IMP 813等)来实现Watchdog机制。此模块主要的功能包括:  
1. 提供WATCHDOG控制寄存器和配置寄存器,供软件开发人员根据系统需要进行灵活配置。
2. 提供一接口,使应用软件能够定时给WATCHDOG“喂狗”。
3. 提供WATCHDOG机制,当系统进入不可恢复错误时,能产生一个不可屏蔽中断来通知系统自动重启     (一般这样,也有改变为其他处理方式的),只有相应的复位信号才能清除它。

如果是单独的watchdog芯片,则,
1. 芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平);
2. 如果单片机一旦跑飞或陷入死循环状态,看门狗电路就会由于得不到嵌入式系统送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位。

HW WDT and SW WDT:

硬件watchdog(由硬件电路支持)比软件watchdog(一般是通过定时器机制实现)有更好的可靠性。 软件watchdog基于内核的定时器实现,当内核或中断出现异常时,软件watchdog将会失效。而硬件watchdog由自身的硬件电路控制, 独立于内核。无论当前系统状态如何,硬件watchdog在设定的时间间隔内没有被执行写操作,仍会重新启动系统

在Linux 内核下, 自带一个watchdog的实现,用于监视系统的运行,它的基本工作原理是:当watchdog启动后(即/dev/watchdog 设备被打开后),如果在某一设定的时间间隔内/dev/watchdog没有被执行写操作, 硬件watchdog电路或软件定时器就会重新启动系统。 /dev/watchdog 是一个主设备号为10, 从设备号130的字符设备节点。 Linux内核不仅为各种不同类型的watchdog硬件电路提供了驱动,还提供了一个基于定时器的纯软件watchdog驱动。 驱动源码位于内核源码树drivers\char\watchdog\目录下。

Sample code flow:

Wdt_config() {
	// config the timer register
   // enable the mdode register
  // enable WDT irq
}
wdt_cb(){
 // feed watchdog or reset the system
}
Wdt_register_timerout_handler(wdt_cb);
Wdt_enable();

The Ending

WATCHDOG在嵌入式系统中发挥着非常重要的作用,其实现方式会有较大差别。可以根据不同的硬件设计,可以选用不同的看门狗实现,但它们的作用是一样的:保证系统在出现不可恢复错误时,能够自动让系统重启。

你可能感兴趣的:(嵌入式,编程开发)