Linux系统看门狗应用编程

article/2025/7/10 8:55:42

目录

  • 看门狗应用编程介绍
    • 打开设备
    • 获取设备支持哪些功能:WDIOC_GETSUPPORT
    • 获取/设置超时时间:WDIOC_GETTIMEOUT、WDIOC_SETTIMEOUT
    • 开启/关闭看门狗:WDIOC_SETOPTIONS
    • 喂狗:WDIOC_KEEPALIVE
  • 看门狗应用编程实战

在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。看门狗其实就是一个可以在一定时间内被复位的计数器。当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有被复位,计数器溢出就会对CPU 产生一个复位信号使系统重启(俗称“被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗”),不让复位信号产生。如果系统不出问题,程序保证按时“喂狗”,一旦程序跑飞,没有“喂狗”,系统“被咬”复位。

看门狗应用编程介绍

前面已经说到,看门狗其实就是一个可以在一定时间内被复位/重置的计数器,一般叫做看门狗计时器(或看门狗定时器);如果在规定时间内没有复位看门狗计时器,计数器溢出则会对CPU 产生一个复位信号使系统重启,当然有些看门狗也可以只产生中断信号而不会使系统复位。
I.MX6UL/I.MX6ULL SoC 集成了两个看门狗定时器(WDOG):WDOG1 和WDOG2;WDOG2 用于安全目的,而WDOG1 则是一个普通的看门狗,支持产生中断信号以及复位CPU。
Linux 系统中所注册的看门狗外设,都会在/dev/目录下生成对应的设备节点(设备文件),设备节点名称通常为watchdogX(X 表示一个数字编号0、1、2、3 等),譬如/dev/watchdog0、/dev/watchdog1 等,通过这些设备节点可以控制看门狗外设。
在这里插入图片描述
这个watchdog0 其实就是I.MX6U 的WDOG1 所对应的设备节点,从图中可知,除了/dev/watchdog0 之外,还有一个watchdog 设备节点,这个设备节点的名称没有后面的数字编号,这个又是什么意思呢?因为系统中可能注册了多个看门狗设备,/dev/watchdog 设备节点则代表系统默认的看门狗设备;通常这指的就是watchdog0,所以,上图中,/dev/watchdog 其实就等于/dev/watchdog0,也就意味着它俩代表的是同一个硬件外设。
应用层控制看门狗其实非常简单,通过ioctl()函数即可做到!接下来笔者向大家进行介绍。
首先在我们的应用程序中,需要包含头文件<linux/watchdog.h>头文件,该头文件中定义了一些ioctl 指令宏,每一个不同的指令宏表示向设备请求不同的操作,如下所示:

#define WDIOC_GETSUPPORT 		_IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
#define WDIOC_GETSTATUS 		_IOR(WATCHDOG_IOCTL_BASE, 1, int)
#define WDIOC_GETBOOTSTATUS 	_IOR(WATCHDOG_IOCTL_BASE, 2, int)
#define WDIOC_GETTEMP 			_IOR(WATCHDOG_IOCTL_BASE, 3, int)
#define WDIOC_SETOPTIONS 		_IOR(WATCHDOG_IOCTL_BASE, 4, int)
#define WDIOC_KEEPALIVE 		_IOR(WATCHDOG_IOCTL_BASE, 5, int)
#define WDIOC_SETTIMEOUT 		_IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT 		_IOR(WATCHDOG_IOCTL_BASE, 7, int)
#define WDIOC_SETPRETIMEOUT 	_IOWR(WATCHDOG_IOCTL_BASE, 8, int)
#define WDIOC_GETPRETIMEOUT 	_IOR(WATCHDOG_IOCTL_BASE, 9, int)
#define WDIOC_GETTIMELEFT 		_IOR(WATCHDOG_IOCTL_BASE, 10, int)

比较常用指令包括:WDIOC_GETSUPPORT 、WDIOC_SETOPTIONS 、WDIOC_KEEPALIVE 、
WDIOC_SETTIMEOUT、WDIOC_GETTIMEOUT,说明如下:
在这里插入图片描述

打开设备

首先在调用ioctl()函数之前,需要先打开看门狗设备得到文件描述符,如下所示:

int fd;fd = open("/dev/watchdog", "O_RDWR");
if (0 > fd)fprintf(stderr, "open error: %s: %s\n", "/dev/watchdog", strerror(errno));

获取设备支持哪些功能:WDIOC_GETSUPPORT

使用WDIOC_GETSUPPORT 指令获取看门狗设备支持哪些功能,使用方式如下:
ioctl(int fd, WDIOC_GETSUPPORT, struct watchdog_info *info);
使用WDIOC_GETSUPPORT 指令可以获取设备的信息,调用ioctl()需要传入一个struct watchdog_info
*指针,ioctl()会将获取到的数据写入到info 指针所指向的对象中。struct watchdog_info 结构体描述了看门狗设备的信息,我们来看看struct watchdog_info 结构体的定义:

struct watchdog_info {__u32 options; /* Options the card/driver supports */__u32 firmware_version; /* Firmware version of the card */__u8 identity[32]; /* Identity of the board */
};

options 字段记录了设备支持哪些功能或选项;
firmware_version 字段记录了设备的固件版本号;
identity 字段则是一个描述性的字符串。
我们重点关注的是options 字段,该字段描述了设备支持哪些功能、选项,该字段的值如下(可以是以下任意一个值或多个值的位或关系):

#define WDIOF_OVERHEAT 0x0001 /* Reset due to CPU overheat */
#define WDIOF_FANFAULT 0x0002 /* Fan failed */
#define WDIOF_EXTERN1 0x0004 /* External relay 1 */
#define WDIOF_EXTERN2 0x0008 /* External relay 2 */
#define WDIOF_POWERUNDER 0x0010 /* Power bad/power fault */
#define WDIOF_CARDRESET 0x0020 /* Card previously reset the CPU */
#define WDIOF_POWEROVER 0x0040 /* Power over voltage */
#define WDIOF_SETTIMEOUT 0x0080 /* Set timeout (in seconds) */
#define WDIOF_MAGICCLOSE 0x0100 /* Supports magic close char */
#define WDIOF_PRETIMEOUT 0x0200 /* Pretimeout (in seconds), get/set */
#define WDIOF_ALARMONLY 0x0400 /* Watchdog triggers a management or other external alarm not a reboot */
#define WDIOF_KEEPALIVEPING 0x8000 /* Keep alive ping reply */

一般常见的值包括:WDIOF_SETTIMEOUT、WDIOF_KEEPALIVEPING;WDIOF_SETTIMEOUT 表示设备支持设置超时时间;WDIOF_KEEPALIVEPING 表示设备支持“喂狗”操作,也就是重置看门狗计时器。
使用示例如下:

struct watchdog_info info;if (0 > ioctl(fd, WDIOC_GETSUPPORT, &info)) {fprintf(stderr, "ioctl error: WDIOC_GETSUPPORT: %s\n", strerror(errno));return -1;
}printf("identity: %s\n", info.identity);
printf("version: %u\n", firmware_version);if (0 == (WDIOF_KEEPALIVEPING & info.options))printf("设备不支持喂狗操作\n");
if (0 == (WDIOF_SETTIMEOUT & info.options))printf("设备不支持设置超时时间\n");

获取/设置超时时间:WDIOC_GETTIMEOUT、WDIOC_SETTIMEOUT

使用WDIOC_GETTIMEOUT 指令可获取设备当前设置的超时时间,使用方式如下:

ioctl(int fd, WDIOC_GETTIMEOUT, int *timeout);

使用WDIOC_SETTIMEOUT 指令可设置看门狗的超时时间,使用方式如下:

ioctl(int fd, WDIOC_SETTIMEOUT, int *timeout);

超时时间是以秒为单位,设置超时时间时,不可超过其最大值、否则ioctl()调用将会失败,使用示例如下所示:

int timeout;/* 获取超时时间*/
if (0 > ioctl(fd, WDIOC_GETTIMEOUT, &timeout)) {fprintf(stderr, "ioctl error: WDIOC_GETTIMEOUT: %s\n", strerror(errno));return -1;
}printf("current timeout: %ds\n", timeout);/* 设置超时时间*/
timeout = 10; //10 秒钟
if (0 > ioctl(fd, WDIOC_SETTIMEOUT, &timeout)) {fprintf(stderr, "ioctl error: WDIOC_SETTIMEOUT: %s\n", strerror(errno));return -1;
}

开启/关闭看门狗:WDIOC_SETOPTIONS

设置好超时时间之后,接着便可以开启看门狗计时了,使用WDIOC_SETOPTIONS 指令可以开启看门狗计时或停止看门狗计时,使用方式如下:

ioctl(int fd, WDIOC_SETOPTIONS, int *option);

option 指针指向一个int 类型变量,该变量可取值如下:

#define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer */
#define WDIOS_ENABLECARD 0x0002 /* Turn on the watchdog timer */

WDIOS_DISABLECARD 表示停止看门狗计时,WDIOS_ENABLECARD 则表示开启看门狗计时。
使用示例如下所示:

int option = WDIOS_ENABLECARD; //开启
//int option = WDIOS_DISABLECARD; //停止if (0 > ioctl(fd, WDIOC_SETOPTIONS, &option)) {fprintf(stderr, "ioctl error: WDIOC_SETOPTIONS: %s\n", strerror(errno));return -1;
}

需要注意的是,当调用open()打开看门狗设备的时候,即使程序中没有开启看门狗计时器,当close()关闭设备时,看门狗会自动启动;所以,当打开设备之后,需要使用WDIOC_SETOPTIONS 指令停止看门狗计时,等所有设置完成之后再开启看门狗计时器。

喂狗:WDIOC_KEEPALIVE

看门狗计时器启动之后,我们需要在超时之前,去“喂狗”,否则计时器溢出超时将会导致系统复位或产生一个中断信号,通过WDIOC_KEEPALIVE 指令喂狗,使用方式如下:
ioctl(int fd, WDIOC_KEEPALIVE, NULL);
使用示例如下:

if (0 > ioctl(fd, WDIOC_KEEPALIVE, NULL)) {fprintf(stderr, "ioctl error: WDIOC_KEEPALIVE: %s\n", strerror(errno));
}

看门狗应用编程实战

通过上小节介绍之后,我们已经知道了如何编写应用程序去控制看门狗外设了,本小节我们来编写一个简单地看门狗应用程序,示例代码如下所示:
本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->27_watchdog->watchdog_test.c。

/***************************************************************Copyright © ALIENTEK Co., Ltd. 1998-2021. All rights reserved.文件名 : watchdog_test.c作者 : 邓涛版本 : V1.0描述 : 看门狗应用程序示例代码其他 : 无论坛 : www.openedv.com日志 : 初版 V1.0 2021/7/14 邓涛创建***************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <linux/watchdog.h>#define  WDOG_DEV   "/dev/watchdog"int main(int argc, char *argv[])
{struct watchdog_info info;int timeout;int time;int fd;int op;if (2 != argc) {fprintf(stderr, "usage: %s <timeout>\n", argv[0]);exit(EXIT_FAILURE);}/* 打开看门狗 */fd = open(WDOG_DEV, O_RDWR);if (0 > fd) {fprintf(stderr, "open error: %s: %s\n", WDOG_DEV, strerror(errno));exit(EXIT_FAILURE);}/* 打开之后看门狗计时器会开启、先停止它 */op = WDIOS_DISABLECARD;if (0 > ioctl(fd, WDIOC_SETOPTIONS, &op)) {fprintf(stderr, "ioctl error: WDIOC_SETOPTIONS: %s\n", strerror(errno));close(fd);exit(EXIT_FAILURE);}timeout = atoi(argv[1]);if (1 > timeout)timeout = 1;/* 设置超时时间 */printf("timeout: %ds\n", timeout);if (0 > ioctl(fd, WDIOC_SETTIMEOUT, &timeout)) {fprintf(stderr, "ioctl error: WDIOC_SETTIMEOUT: %s\n", strerror(errno));close(fd);exit(EXIT_FAILURE);}/* 开启看门狗计时器 */op = WDIOS_ENABLECARD;if (0 > ioctl(fd, WDIOC_SETOPTIONS, &op)) {fprintf(stderr, "ioctl error: WDIOC_SETOPTIONS: %s\n", strerror(errno));close(fd);exit(EXIT_FAILURE);}/* 喂狗 */time = (timeout * 1000 - 100) * 1000;//喂狗时间设置us微秒、在超时时间到来前100ms喂狗for ( ; ; ) {usleep(time);ioctl(fd, WDIOC_KEEPALIVE, NULL);}
}

示例代码很简单,首先打开看门狗设备,接着使用WDIOC_SETOPTIONS 指令(op = WDIOS_DISABLECARD)先停止看门狗计时器;接着通过atoi 获取到用户传入的超时时间,所以执行该测试程序的时候,需要传入一个参数作为看门狗超时时间。
接着使用WDIOC_SETTIMEOUT 指令设置超时时间,再使用WDIOC_SETOPTIONS 指令(op = WDIOS_ENABLECARD)开启看门狗计时器,看门狗开始工作。接着我们需要在超时时间到来之前,去喂狗,喂狗之后,计时器重置,重新计时;不断地喂狗重置计时器、不让其超时、如果一旦超时系统将会复位重启。
编译示例代码:
在这里插入图片描述
将编译得到的可执行文件拷贝到开发板Linux 系统/home/root 目录下,执行测试程序,譬如启动看门狗,设置超时时间为2 秒钟,如下:
在这里插入图片描述
执行程序之后,开门狗计时器就已经启动了,程序中会不断的喂狗重置计时器,以保证程序不会重启。
现在我们按Ctrl + C 结束程序,结束程序意味着已经停止喂狗了、然后看门狗计时器并没有停止,这样将会导致计时器溢出、发生复位重启:
在这里插入图片描述
当按Ctrl+C 终止进程后,内核打印出“watchdog watchdog0: watchdog did not stop!”信息,表示看门狗计时器还正在计时、未停止。


http://chatgpt.dhexx.cn/article/hHsZqwQ1.shtml

相关文章

宠物狗之家网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

java泛型波浪号_DogBrown

对于 Vue.nextTick 方法&#xff0c;自己有些疑惑。在查询了各种资料后&#xff0c;总结了一下其原理和用途&#xff0c;如有错误&#xff0c;请不吝赐教。 概览官方文档说明&#xff1a;用法&#xff1a; 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个…

Linux Watchdog看门狗理解

目录 介绍 简单Watchdog Linux Watchdog daemon Watchdog设备驱动配置 测试Watchdog设备的复位功能 介绍 Watchdog timer&#xff08;看门狗定时器&#xff09;是一种电子计时器&#xff0c;其用于检测和恢复计算机故障。在正常操作期间&#xff0c;计算机定期重置看门狗定…

噪音监测传感系统

远程噪声监测系统是一种新型的环境监测系统&#xff0c;可以实现环境噪声、温度、粉尘、风向等参数的在线自动监测。它利用传感技术、通信技术和计算机及其网络技术将环境状态有机地结合起来&#xff0c;形成一起来。  原理  首先&#xff0c;远程噪声监测现场噪声测量控制…

Matlab——噪声的检测和处理实验

本次实验首先由matlab中的randn()函数模拟噪声信号&#xff0c;模拟确定性信号s(t)的抽样信号&#xff0c;并根据有无信号到达的概率&#xff0c;计算两者出现的频数&#xff0c;在matlab软件中仿真出有信号到达和无信号到达的两种接受信号。在此基础上&#xff0c;根据似然比和…

【去噪】A Physics-Based Noise Formation Model for Extreme Low-Light Raw Denoising噪声建模详解

文章目录 0. 前言1. 主要贡献1.1 建立了一个全面的噪声模型&#xff0c;可以准确地描述低光环境下的真实噪声结构1.2 提出了一种噪声参数标定方法1.2.1 估计系统总体增益 K K K1.2.2 估计颜色偏差噪声的 μ c \mu_c μc​1.2.3 估计行噪声的σr1.2.4 估计读出噪声中的λ、σT …

【Android工具】用手机测量噪声的工具软件,噪声仪分贝计,量化噪声声音工具...

今天分享一个通过手机麦克风测量环境噪声的工具——声级计&#xff08;噪声仪&#xff09;。 本来是要分享另一款的&#xff0c;但下载下来的是xapk的安装包&#xff0c;太麻烦了&#xff0c;功能差不多&#xff0c;大家就先用这款吧&#xff0c;有条件的朋友可以去play自己下载…

噪声系数评估的简易方法

1. 概要 有三种常用的噪声系数的测量方法[1]&#xff0c;分别是&#xff1a; 噪声系数测试仪法增益法Y系数法 这些测量方法都需要利用复杂的测试仪器&#xff0c;有没有更简单的方法呢&#xff1f;本文介绍一个简单的仅需要RF信号发生器以及一个能采集数据的设备&#xff08;比…

图像传感器噪声建模与分析

图像传感器在做信号采集的时候往往会引入噪声&#xff0c;在采集到的raw图像中能够拿到没有经过任何处理的传感器信号&#xff0c;因此对于传感器噪声进行分析与建模有助于我们认识传感器噪声&#xff0c;从而帮助我们设计raw图像的降噪算法。本文从传感器模型层面分析单像素点…

气象插值软件anusplin的使用

气象插值软件anusplin的使用 1、简介 ANUSPLIN软件包提供了一种使用薄板平滑样条对噪声多变量数据进行透明分析和插值的工具。该软件包通过提供全面的统计分析、数据诊断和空间分布的标准误差来支持这一过程。通常运用到降水、气温等气象要素的插值当中&#xff0c;可以引入高…

【模拟CMOS集成电路】电路噪声—— 噪声分析基础(1)

电路噪声——噪声分析基础&#xff08;1&#xff09; 前言1噪声的定义2噪声的描述2.1统计特性&#xff08;1&#xff09;平均功率&#xff08;2&#xff09;功率谱密度&#xff08;PSD&#xff09; 2.2噪声相关指标&#xff08;1&#xff09;SNR&#xff08;2&#xff09;SNDR …

IPEmotion的NVH噪声测试模块——坎贝尔图

德国IPETRONIK的IPEmotion软件除了可以对之前介绍的热管理试验及热管理台架试验、电性能试验和道路试验等各种进行基本的温度、模拟量和数字信号的采集分析外&#xff0c;无论专业版、开发版还是分析版均支持噪声分析模块。该模块支持噪声数据离线后处理&#xff0c;包括Campbe…

ADC噪声全面分析 -02- ADC 噪声测量方法和相关参数

ADC 噪声测量方法和参数 在解释如何测量 ADC 噪声之前&#xff0c;重要的是要了解&#xff0c;当您查看 ADC 数据表规格时&#xff0c;相关指标参数表征对象是 ADC&#xff0c;而不是设计的电子系统。因此&#xff0c;ADC 制造商测试 ADC 噪声的方式和测试系统本身应该展示 AD…

频谱分析仪测量噪声系数方法介绍

用频谱仪测量噪声系数&#xff1a;测量框图为&#xff1a;基于噪声系数的定义得到的一个测量公式为&#xff1a;NFPNOUT-(-174dBm/Hz20lg(BW)Gain)(1)公式中&#xff0c;PNOUT是已测的总共输出噪声功率&#xff0c;-174dBm/Hz是290oK&#xff08;室温&#xff09;时环境噪声的功…

频谱分析仪怎么测相位噪声?

相位噪声是评估和分析信号质量的一个重要参数&#xff0c;尤其在无线通信、雷达信号处理等领域中具有重要的意义。罗德&#xff08;Rohde & Schwarz&#xff09;频谱分析仪是一款常见的仪器&#xff0c;可以用于测量和分析信号的相位噪声。本文将详细介绍罗德频谱分析仪相位…

声学仿真分析工具Acoustics 在Workbench中这样学

声学仿真分析工具Acoustics 在Workbench中这样学 付亚兰 讲师 2年前 浏览11376 关注 声学有限元仿真 主要用于模拟声压波在声介质中的生成、传播、辐射、吸收和反射。随着有限元软件的发展和人们对噪声问题的重视&#xff0c;声学有限元仿真在越来越多的行业得到广泛应用。 比…

Sysnoise5.6安装教程和软件下载

Sysnoise5.6安装教程和软件下载 【尊重 原创&#xff0c;转载请注明出处 】http://blog.csdn.net/guyuealian/article/details/51187240 Sysnoise是目前市场上最先进的声-振分析软件&#xff0c;用户可以利用Sysnoise软件仿真计算机有关设备噪声的各种数据&#xff0c;并能帮助…

【自主推荐】电磁噪声优化软件(ENOS)

ENOS软件主要功能介绍 ENOS软件主界面如下图所示&#xff0c;主要包括&#xff1a;菜单栏、工程树图、属性设置、绘图区、图表设置、模型筛选等区域。 ENOS软件经过不断优化升级&#xff0c;新版本增加了考虑斜极电磁力优化功能&#xff0c;支持反电势、损耗等优化目标&#…

放大器噪声分析计算

1.运放噪声模型 运放构成的同相放大器的噪声模型如下 运放的噪声主要由三部分组成&#xff0c;运放电压噪声&#xff0c;运放电流噪声&#xff0c;和反馈电阻产生的热噪声。三者有效值的平方和再开根号就是总噪声的有效值。现代运放的电流噪声非常小&#xff0c;通常可以忽略…