看门狗应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
看门狗应用编程

看门狗应用编程介绍
看门狗定时器的基本概念
-
看门狗是一个可以在一定时间内被复位/重置的计数器
-
如果在规定时间内没有复位,看门狗计时器溢出会对CPU产生复位信号使系统重启
-
有些看门狗可以只产生中断信号而不会使系统复位
I.MX6UL/I.MX6ULL SoC 中的看门狗定时器
-
集成了两个看门狗定时器:WDOG1 和 WDOG2
-
WDOG2 用于安全目的
-
WDOG1 是一个普通的看门狗,支持产生中断信号和复位CPU
Linux 系统中的看门狗设备节点
-
注册的看门狗外设在 /dev/ 目录下生成设备节点,通常命名为 watchdogX(X为数字编号)
-
例如 /dev/watchdog0、/dev/watchdog1
-
这些设备节点用于控制看门狗外设
默认看门狗设备节点
-
/dev/watchdog0 对应 I.MX6U 的 WDOG1
-
系统中可能注册多个看门狗设备,/dev/watchdog 是系统默认的看门狗设备节点
-
通常 /dev/watchdog 代表系统默认的看门狗设备,即 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
- #define WDIOC_GETSUPPORT _IOR(WATCHDOG_IOCTL_BASE, 0, struct watchdog_info)
-
常用的 ioctl 指令宏
看门狗应用编程流程
打开设备
-
在调用 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
-
调用 ioctl() 函数来获取功能信息
-
ioctl(int fd, WDIOC_GETSUPPORT, struct watchdog_info *info);
-
fd:文件描述符
-
WDIOC_GETSUPPORT:指令宏,获取设备的信息
-
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:记录设备支持的功能或选项
-
#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 */ -
常见的 options 值
-
WDIOF_SETTIMEOUT:设备支持设置超时时间
-
WDIOF_KEEPALIVEPING:设备支持“喂狗”操作(重置看门狗计时器)
-
-
-
firmware_version:记录设备的固件版本号
-
identity:描述性的字符串
-
-
使用示例
- 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”, info.firmware_version);
if (0 == (WDIOF_KEEPALIVEPING & info.options))
printf(“设备不支持喂狗操作\n”);
if (0 == (WDIOF_SETTIMEOUT & info.options))
printf(“设备不支持设置超时时间\n”);
- struct watchdog_info info;
获取/设置超时时间:WDIOC_GETTIMEOUT、WDIOC_SETTIMEOUT
-
获取超时时间
-
使用指令:WDIOC_GETTIMEOUT
-
功能:获取设备当前设置的超时时间
-
ioctl(int fd, WDIOC_GETTIMEOUT, int *timeout);
-
timeout:指向一个整数的指针,用于存储获取的超时时间(单位:秒)
-
-
设置超时时间
-
使用指令:WDIOC_SETTIMEOUT
-
功能:设置看门狗的超时时间
-
ioctl(int fd, WDIOC_SETTIMEOUT, int *timeout);
-
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
-
-
停止看门狗计时
- 同样使用指令: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 */
- #define WDIOS_DISABLECARD 0x0001 /* Turn off the watchdog timer /
-
-
使用示例
- 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;
}
- int option = WDIOS_ENABLECARD; // 开启看门狗计时
-
注意事项
-
当调用 open() 打开看门狗设备时,即使程序中没有显式开启看门狗计时器,当 close() 关闭设备时,看门狗会自动启动
-
因此,在打开设备后,需要立即使用 WDIOC_SETOPTIONS 指令停止看门狗计时器,完成所有设置后再开启看门狗计时器
-
喂狗:WDIOC_KEEPALIVE
-
看门狗计时器启动后喂狗的必要性
-
启动看门狗计时器后,需要在设定的超时时间之前进行“喂狗”操作
-
如果未在超时前喂狗,计时器溢出将导致系统复位或产生中断信号
-
-
喂狗的指令
-
使用指令:WDIOC_KEEPALIVE
-
作用:重置看门狗计时器,防止系统复位或产生中断信号
-
-
调用方式
-
ioctl(int fd, WDIOC_KEEPALIVE, NULL);
-
fd:看门狗设备的文件描述符
-
WDIOC_KEEPALIVE:喂狗指令宏
-
NULL:指示不需要额外的参数
-
-
使用示例
- if (0 > ioctl(fd, WDIOC_KEEPALIVE, NULL)) {
fprintf(stderr, “ioctl error: WDIOC_KEEPALIVE: %s\n”, strerror(errno));
}
- if (0 > ioctl(fd, WDIOC_KEEPALIVE, NULL)) {
看门狗应用编程实战
#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);}
}
大致流程与上一级内容一致,实现了看门狗计时器的启动、停止、超时时间设置以及喂狗操作,确保系统在正常工作时不会因为超时导致复位重启
在开发板测试
看门狗默认已经被其他功能使用,需要其手动关闭
-
打开/etc/init.d/watchdog.sh 文件,在开头加个 exit 0 将整个文件注释掉,然后开发板重新启动,再执行程序
执行程序后,看门狗计时器自动启动,并持续进行喂狗操作。当程序被终止(如通过 Ctrl + C)而未停止看门狗计时器时,计时器会溢出导致系统重启
-
计时器溢出系统重启
相关文章:
看门狗应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
看门狗应用编程 看门狗应用编程介绍 看门狗定时器的基本概念 看门狗是一个可以在一定时间内被复位/重置的计数器 如果在规定时间内没有复位,看门狗计时器溢出会对CPU产生复位信号使系统重启 有些看门狗可以只产生中断信号而不会使系统复位 I.MX6UL/I.MX6ULL So…...
Bug 解决 | 本地项目上线后出现错误
目录 一、前言 二、原因分析 1、本地代码误发线上 2、环境差异 3、配置差异 4、资源路径差异 5、API 接口差异 6、用量差异 一、前言 大家好,我是小洪爱分享。在开发上线项目的过程中,我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能…...
为什么我工作 10 年后转行当程序员?逆袭翻盘!
今天文章的主人公暂且称他为 A 君。不过 A 君有点特别,非科班,工作 10 年后才转行 iOS 程序员。今年 36 岁,目前在某行业头部企业任职前端负责人,管理 40 人的前端团队。 废话不多说,我们开始 A 君(为了描…...
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》
见证中国数据库的崛起:从追赶到引领的壮丽征程《四》 四、未来展望:中国数据库的机遇与挑战新技术带来的机遇全球化竞争的挑战数据安全与隐私保护的挑战人才培养的持续挑战 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天,数据库作…...
OpenCV||超细节的基本操作
一、图像读取 retval cv2.imread(filename[, flags]) filename:需要读取的图片路径名,支持多种图片格式,如JPEG、PNG、TIFF等。flags:一个可选参数,指定加载图像的颜色类型。常用的值包括: cv2.IMGEAD_A…...
算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列
刷题记录 *1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列 *1143. 最长公共子序列 leetcode题目地址 本题和718. 最长重复子数组相似,只是本题不要求连续,需要记录前面最长的子序列,在此基础上累计长度。 dp[i][j]…...
STM32——外部中断(EXTI)
目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断(External Interrupt,简称EXTI)是微控制器用于响应外部事件的一种方式,当外部事件发生时(如按键按下、传感器信号…...
MySQL多实例部署
1、软件包下载 //环境:一台rocky Linux虚拟机,并且做好的基本配置及时钟同步,使用Xshell连接 [rootmysql ~]# yum -y install tar lrzsz libncurses* libaio perl//将包文件拖进去 [rootmysql ~]# rz -E rz waiting to receive. [rootmysql…...
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 【已去除流量主】
云开发喝酒小程序3.6全新漂亮UI猜拳喝酒小程序 已去除流量主。UI特别漂亮,实属精品代码。 【已测】云开发喝酒小程序3.6漂亮UI猜拳喝酒小程序 已去除流量主。 云开发(serverless)小程序无需服务器,注册一个小程序就可以直接上线…...
图论进阶之路-最短路(Floyd)
时间复杂度:O(n^3) 使用场景:当需要得知任意两个点的最短距离以及其路径时使用 准备:需要两个矩阵 一个记录最短距离(D) 一个记录最短路径的最后一个结点(P) 其核心在于不断的判断越过中间…...
安装sqllab靶机之后,练习关卡报403 forbidden
解决办法: 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx,就完成了。 ./nginx -s reload...
微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件
UI设计: 1. EXUI界面库20240204 调用的模块: 1. wow64_hook_3.02.ec(压缩包内含) 2. 精易模块[v11.1.0].ec(自行下载) 更新日志: v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…...
JavaEE 从入门到精通(一) ~ Maven
晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 1.1 概念 什么是 Maven? Maven 的核心概念 1.2 maven依赖坐标 1.3 maven仓库 1.4 maven安装 1.5 mave…...
滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障
丝杆支撑座是连接滚珠丝杆与电机的轴承,采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么,滚珠丝杆搭连接杆支撑座有哪些优缺点呢? 正常情况下,丝杆支撑座能够提供稳定的支撑力,确保滚珠丝杆在复杂工况下保持…...
实验5-11 空心的数字金字塔
本题要求实现一个函数,输出n行空心的数字金字塔。 函数接口定义: void hollowPyramid( int n );其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔,请注意,最后一行的…...
C#对象和类型
属性、方法、字段 字段和属性的区别 在C#中,字段(fields)和属性(properties)都是类的成员,它们提供了类存储数据的方式,但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类…...
免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue图书(图书借阅)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…...
数据结构与算法--队列
文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…...
<Qt> 常用控件
目录 一、控件概述 二、QWidget 核心属性 (一)QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…...
关于C/C++的编译、构建、CMake、x86_amd64等问题(自用)
被这些玩意整红温了 编译器版本 x86:编译器为x86版本,输出文件为x86。amd64_x86:编译器为amd64版本,输出文件为x86。amd64:编译器为amd64版本,输出文件为amd64。x86_amd64:编译器为x86版本&am…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
