Linux Watchdog/看门狗

本文深入探讨了Watchdog Timer(看门狗定时器)在嵌入式系统中的作用及其实现方式。看门狗定时器是一种电子计时器,用于检测并自动恢复计算机系统在发生硬件故障或软件错误时的状态。文章详细介绍了看门狗定时器的工作原理,包括其在Linux系统中的应用,以及如何通过守护进程与设备驱动程序交互来维护系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
	else
		gpio_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)是一种用于监控系统运行状态的机制。它可以在系统出现故障时自动重启系统,从而提高系统的可靠性和稳定性。以下是一些关于Linux下使用看门狗的基本介绍: ### 1. 什么是看门狗看门狗是一种硬件或软件机制,用于监控系统的运行状态。如果系统在预定时间内没有向看门狗发送“心跳”信号,看门狗会认为系统出现了故障,并自动重启系统。 ### 2. 如何启用看门狗? 在Linux系统中,通常可以通过以下步骤启用看门狗: #### a. 加载看门狗驱动 首先,需要加载看门狗驱动模块。可以通过以下命令加载: ```bash sudo modprobe softdog ``` #### b. 启用看门狗服务 启用看门狗服务可以通过以下命令: ```bash sudo systemctl enable watchdog sudo systemctl start watchdog ``` #### c. 配置看门狗 配置看门狗可以通过编辑配置文件 `/etc/watchdog.conf`。例如,设置超时时间和心跳间隔: ```bash watchdog-device = /dev/watchdog max-load-1 = 24 ``` ### 3. 测试看门狗 可以通过手动停止心跳信号来测试看门狗是否正常工作: ```bash sudo systemctl stop watchdog ``` 如果配置正确,系统应该在超时后自动重启。 ### 4. 使用软件看门狗 除了硬件看门狗Linux还提供了软件看门狗。软件看门狗通过一个内核模块实现,可以在没有硬件看门狗的情况下使用。 ### 5. 编写看门狗脚本 可以编写自定义的看门狗脚本,通过定期更新看门狗设备文件来发送心跳信号。例如: ```bash #!/bin/bash while true; do echo 1 > /dev/watchdog sleep 10 done ``` 将上述脚本保存为 `watchdog.sh`,并赋予执行权限: ```bash chmod +x watchdog.sh ``` 然后运行脚本: ```bash ./watchdog.sh ``` ### 总结 通过以上步骤,可以在Linux系统中启用和使用看门狗,以提高系统的可靠性和稳定性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值