Watchdog timer(看门狗定时器)是一种电子计时器,其用于检测和恢复计算机故障。在正常操作期间,计算机定期重置看门狗定时器以防止它“超时”。如果由于硬件故障或程序错误,计算机无法重置看门狗,定时器将生成超时信号,复位和重启计算机。
Watchdog timer通常出现在嵌入式系统或设备中,在这些设备中,人们无法轻易访问设备或无法及时对故障作出反应。在这样的系统中,如果计算机挂起,计算机就不能依赖于人来调用重启; 它必须靠Watchdog timer来复位。

简单Watchdog

微控制器通常包括一个集成的片上看门狗。在其他计算机中,看门狗可以驻留在直接连接到CPU的附近芯片中,看门狗和CPU可以共享公共时钟信号,如下面的框图所示,或者它们可以具有独立的时钟信号。

Linux Watchdog daemon

通常通过写入看门狗控制端口来完成重启看门狗定时器的操作,通常称为“踢”看门狗或者“喂狗”。在Linux操作系统中,用户空间程序通过与看门狗设备驱动程序交互来启动监视程序。
watchdog是这样一个守护进程:它打开/dev/watchdog,并且经常写入它以使内核不能重置,至少每分钟一次。每次写入都会延迟重启时间。一段时间不活动后,看门狗硬件将导致复位。该守护进程对应的程序是/usr/sbin/watchdog
watchdog守护程序的配置文件是/etc/watchdog.conf,一个典型的配置文件如下

test-binary     = /usr/bin/test.sh
watchdog-device = /dev/watchdog0
realtime        = yes
priority        = 1

这些选项分别表示:

选项 说明
test-binary 执行给定的二进制文件以执行一些用户定义的测试
watchdog-device 设置监视程序设备名称
realtime 如果设置为yes,看门狗将自己锁定到内存中,因此永远不会被换出
priority 设置实时模式的计划优先级

Watchdog设备驱动配置

首先配置watchdog_device结构体,默认timeout是1秒,因为该watchdog设备如果超过1.6秒没有被“喂”,就会复位整个嵌入式设备:

static struct watchdog_device test_wdt_dev = {.groups = test_wdt_groups,.info = &test_wdt_info,.ops = &test_wdt_ops,                                                                                                                                         .min_timeout = 1,.max_timeout = 2,.timeout = 1,
};

接着配置watchdog_ops结构体,这里的ping就是每隔1秒会执行的函数:

static const struct watchdog_ops test_wdt_ops = {                                                                                                                 .owner = THIS_MODULE,.start = test_wdt_start,.stop = test_wdt_stop,.ping  = test_wdt_ping,
};

下面就是pingstartstop函数的实现:

static inline void test_wdt_enable(bool enable)
{if (enable)gpio_direction_output(GPIO_WD_EN, WD_EN_ACTIVE);elsegpio_direction_output(GPIO_WD_EN, !WD_EN_ACTIVE);
}static int test_wdt_start(struct watchdog_device *wdog)
{test_wdt_enable(true);return 0;
}static int test_wdt_stop(struct watchdog_device *wdog)
{test_wdt_enable(false);return 0;
}static void test_wdt_ping(void)
{gpio_direction_output(GPIO_WD_IN, 0);udelay(20);gpio_direction_output(GPIO_WD_IN, 1);udelay(20);
}

在驱动初始化函数里面注册这个watchdog设备:

static int __init test_wdt_init(void)
{int err = 0;watchdog_set_nowayout(&test_wdt_dev, true);watchdog_stop_on_reboot(&test_wdt_dev);err = watchdog_register_device(&test_wdt_dev);if (err) {pr_err("Failed to register watchdog device\n");return err;}return 0;
}
module_init(test_wdt_init);

测试Watchdog设备的复位功能

首先把test_watchdog驱动编译成模块形式:

CONFIG_TEST_WATCHDOG=m

进入系统后在/etc/init.d/test_watchdog脚本里面自动执行如下两个命令,加载驱动和启动守护进程:

#!/bin/sh/sbin/modprobe test_watchdog
/usr/sbin/watchdog

这时候watchdog设备已经正常工作,并且watchdog守护进程会每隔1秒喂它(调用test_wdt_ping()),以防止嵌入式设备被复位。如果我们kill该守护进程,内核就会停止调用test_wdt_ping()喂狗,整个设备就会在1.6秒内被该watchdog复位:

$ killall -9 watchdog

Linux Watchdog/看门狗相关推荐

  1. arm linux下看门狗应用,arm linux watchdog 看门狗

    目前手上有个项目需要设计看门狗,是arm+CPLD 方式.由于对看门狗要求很高,打算做一个双看门狗,arm CPLD互相为 对方的看门狗.理论上CPLD是不需要看门狗的,还是这么去设计了.接下来对看门 ...

  2. Android system server之WatchDog看门狗分析

    android -- WatchDog看门狗分析 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系 ...

  3. linux shell 看门狗,Linux 下如何使用看门狗

    Linux内核有集成WD的选项.将其使能后,系统里就会有watchdog的设备驱动:/dev/watchdog. 这样,在应用程序里只需打开这个设备使用即可: #include void main(v ...

  4. 什么是看门狗(watchdog)?看门狗有什么作用?

    什么是看门狗(watchdog) 看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂 ...

  5. Linux 软件看门狗 watchdog

    Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序.内核 watchdog 模块通过 /dev ...

  6. Linux 软件看门狗 watchdog 喂狗

    Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog程序.内核 watchdog 模块通过 /dev/ ...

  7. Linux内核4.14版本——watchdog看门狗框架分析

    目录 0 简介 1. 设备的注册 1.1 dw_wdt_drv_probe 1.2 watchdog_register_device 1.3 __watchdog_register_device 1. ...

  8. linux服务器看门狗服务,服务器watchdog看门狗的理解

    1.什么是watchdog? watchdog,中文名称叫做"看门狗",全称watchdog timer,从字面上我们可以知道其实它属于一种定时器.然而它与我们平常所接触的定时器在 ...

  9. 12011.linux之看门狗应用开发

    看门狗电路 1 博客 2 原理介绍 3 通过gpio子系统进行直接控制管脚的电平 3.1 电路图 1 博客 linux下用文件控制gpio的输出电平 2 原理介绍 软件看门狗:一些重要的程序,必须让它 ...

最新文章

  1. Alchemy环境的搭建
  2. 《IP路由协议疑难解析》一1.3 动态路由
  3. js 对有“命名空间”的表单做深度解析
  4. Wireshark网络抓包(四)——工具
  5. Go性能测试benchmark
  6. 【C语言】为什么指明数组的列数?
  7. MySql 数据库安装、环境变量配置 以及 本地连接
  8. 无人值守地磅电子汽车衡中称重系统传感器原理及应用
  9. 高效能管理之要事第一 时间管理表格2
  10. spring使用之旅 ---- bean的装配
  11. 优动漫PAINT实用教程——矢量擦除
  12. 厦门大学计算机科学夏令营过程,厦门大学信息学院计算机系夏令营学生见面会如期召开-厦门大学计算机科学系...
  13. 【转】火影10大秘密最终之解(杜撰)
  14. 计算机应用oas,基于XML的OAS生成平台的研究与实现-计算机应用技术专业论文.docx...
  15. J9数字货币科普:什么是加密借贷?有什么风险存在?
  16. 服务器违反了协议怎么办,微云里面的视频被和谐了怎么办 上传视频违反协议解决方法...
  17. 视频转码编辑工具:Compressor for Mac(4.5.4)
  18. 英语四六级详细报名步骤来啦!
  19. ExtCertPathValidatorException: Could not validate certificate
  20. 在Vue单文件组件的template标签上使用v-if不生效的原因

热门文章

  1. Linux效劳器装机安全疾速进阶指南(2)
  2. 【ZOJ题目分类】备忘
  3. height、min-height、max-height中听谁的?
  4. HLS-iOS视频播放服务架构深入探究(一) JAN 29TH, 2016 6:10 PM HTTP Live Streaming (HLS)
  5. Ubuntu20.04安装nVidia显卡遇到的各种坑
  6. 检测到可疑访问 php,php.net被Chrome/Firefox浏览器标注为可疑站点
  7. pr里面怎么加css样式,放入pr剪辑中画面不全怎么办?
  8. 虹科教您 | 理解微波射频中的特性阻抗、VSWR 和反射系数
  9. Cindy User Guide
  10. 数据结构之 二叉树的存储和遍历总结