嵌入式系统watchdog详解

2019-07-13 09:30发布

嵌入式系统的工作常会受到外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以需要对嵌入式系统运行状态进行实时监测,便产生了一种专门用于监测嵌入式系统运行状态的芯片,称"看门狗"。   Linux 自带了一个watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开/dev/watchdog 设备,就会导致在内核中启动一个 1分钟的定时器,此后,用户空间程序需要保证在 1分钟之内向这个设备写入数据,每次写操作会导致重新设定定时器。如果用户空间程序在 1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作。   看门狗,又叫 watchdogtimer(WDT),是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU(微控制单元 Microcontroller Unit,俗称单片机)的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT 清零,如果超过规定时间不喂狗(一般在程序跑飞时),WDT 定时超过,就会给出一个复位信号到MCU,使MCU复位. 防止MCU死机.   看门狗电路使嵌入式系统可以在无人状态下实现连续工作,其工作原理是:看门狗芯片和单片机的一个I/O引脚相连,该I/O引脚通过程序控制它定时地往看门狗的这个引脚上送入高电平(或低电平),这一程序语句是分散地放在嵌入式系统其他控制语句中间的,一旦单片机由于干扰造成程序跑飞后而陷入某一程序段进入死循环状态时,写看门狗引脚的程序便不能被执行,这个时候,看门狗电路就会由于得不到嵌入式系统送来的信号,便在它和单片机复位引脚相连的引脚上送出一个复位信号,使单片机发生复位,即程序从程序存储器的起始位置开始执行,这样便实现了单片机的自动复位。   常用的WDT芯片如MAX813 ,5045, IMP 813等,价格4~10元不等。   硬件与软件watchdog的区别 1、硬件watchdog必须有硬件电路支持, 设备节点/dev/watchdog对应着真实的物理设备, 不同类型的硬件watchdog设备由相应的硬件驱动管理。 软件watchdog由一内核模块softdog.ko 通过定时器机制实现,/dev/watchdog并不对应着真实的物理设备,只是为应用提供了一个与操作硬件watchdog相同的接口。 2、硬件watchdog比软件watchdog有更好的可靠性。 软件watchdog基于内核的定时器实现,当内核或中断出现异常时,软件watchdog将会失效。而硬件watchdog由自身的硬件电路控制, 独立于内核。无论当前系统状态如何,硬件watchdog在设定的时间间隔内没有被执行写操作,仍会重新启动系统。 一些硬件watchdog卡如WDT501P 以及一些Berkshire卡还可以监测系统温度,提供了 /dev/temperature接口。   /dev/watchdog是一个主设备号为10, 从设备号130的字符设备节点。   在Linux下使用watchdog开发应用之前, 请确定内核已经正确地配置支持watchdog。内核源码下的drivers/char/watchdog/Kconfig文件提供了各种watchdog配置选项的详细介绍。 如果内核配置选项‘CONFIG_WATCHDOG_NOWAYOUT’设为‘Y’, 缺省情况下watchdog启动后不能被停止。 如果模块的nowayout参数设为0, 往/dev/watchdog 写入字符`V’ 可以使watchdog停止工作。 启动watchdog的代码段 int wd_fd= -1; fd =open("/dev/watchdog", O_WRONLY); if (wd_fd== -1) {     // fail to open watchdog device } 停止watchdog的代码段   if (wd_fd != -1)     {         write(wd_fd, "V", 1);         close(wd_fd);         wd_fd = -1;     }  保持watchdog运行的代码段 if (wdt_fd != -1)         write(wdt_fd, "a", 1);   在基于Xilinx zynq的单芯片嵌入式系统中使用WDT,需要在设备树种进行相应的配置。具体操作可以参考http://www.wiki.xilinx.com/Cadence+WDT+Driver