当前位置: 首页 > news >正文

看门狗应用编程-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
  • 常用的 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”);

获取/设置超时时间: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 */
  • 使用示例

    • 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);

    • fd:看门狗设备的文件描述符

    • WDIOC_KEEPALIVE:喂狗指令宏

    • NULL:指示不需要额外的参数

  • 使用示例

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

看门狗应用编程实战

#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应用编程学习笔记基于正点原子阿尔法开发板

看门狗应用编程 看门狗应用编程介绍 看门狗定时器的基本概念 看门狗是一个可以在一定时间内被复位/重置的计数器 如果在规定时间内没有复位&#xff0c;看门狗计时器溢出会对CPU产生复位信号使系统重启 有些看门狗可以只产生中断信号而不会使系统复位 I.MX6UL/I.MX6ULL So…...

Bug 解决 | 本地项目上线后出现错误

目录 一、前言 二、原因分析 1、本地代码误发线上 2、环境差异 3、配置差异 4、资源路径差异 5、API 接口差异 6、用量差异 一、前言 大家好&#xff0c;我是小洪爱分享。在开发上线项目的过程中&#xff0c;我们经常会遇到一种让人头疼的情况。那就是开发好的项目功能…...

为什么我工作 10 年后转行当程序员?逆袭翻盘!

今天文章的主人公暂且称他为 A 君。不过 A 君有点特别&#xff0c;非科班&#xff0c;工作 10 年后才转行 iOS 程序员。今年 36 岁&#xff0c;目前在某行业头部企业任职前端负责人&#xff0c;管理 40 人的前端团队。 废话不多说&#xff0c;我们开始 A 君&#xff08;为了描…...

见证中国数据库的崛起:从追赶到引领的壮丽征程《四》

见证中国数据库的崛起&#xff1a;从追赶到引领的壮丽征程《四》 四、未来展望&#xff1a;中国数据库的机遇与挑战新技术带来的机遇全球化竞争的挑战数据安全与隐私保护的挑战人才培养的持续挑战 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天&#xff0c;数据库作…...

OpenCV||超细节的基本操作

一、图像读取 retval cv2.imread(filename[, flags]) filename&#xff1a;需要读取的图片路径名&#xff0c;支持多种图片格式&#xff0c;如JPEG、PNG、TIFF等。flags&#xff1a;一个可选参数&#xff0c;指定加载图像的颜色类型。常用的值包括&#xff1a; cv2.IMGEAD_A…...

算法训练(leetcode)第三十八天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和、392. 判断子序列

刷题记录 *1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列 *1143. 最长公共子序列 leetcode题目地址 本题和718. 最长重复子数组相似&#xff0c;只是本题不要求连续&#xff0c;需要记录前面最长的子序列&#xff0c;在此基础上累计长度。 dp[i][j]…...

STM32——外部中断(EXTI)

目录 前言 一、外部中断基础知识 二、使用步骤 三、固件库实现 四、STM32CubeMX实现 总结 前言 外部中断&#xff08;External Interrupt&#xff0c;简称EXTI&#xff09;是微控制器用于响应外部事件的一种方式&#xff0c;当外部事件发生时&#xff08;如按键按下、传感器信号…...

MySQL多实例部署

1、软件包下载 //环境&#xff1a;一台rocky Linux虚拟机&#xff0c;并且做好的基本配置及时钟同步&#xff0c;使用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特别漂亮&#xff0c;实属精品代码。 【已测】云开发喝酒小程序3.6漂亮UI猜拳喝酒小程序 已去除流量主。 云开发&#xff08;serverless&#xff09;小程序无需服务器&#xff0c;注册一个小程序就可以直接上线…...

图论进阶之路-最短路(Floyd)

时间复杂度&#xff1a;O(n^3) 使用场景&#xff1a;当需要得知任意两个点的最短距离以及其路径时使用 准备&#xff1a;需要两个矩阵 一个记录最短距离&#xff08;D&#xff09; 一个记录最短路径的最后一个结点&#xff08;P&#xff09; 其核心在于不断的判断越过中间…...

安装sqllab靶机之后,练习关卡报403 forbidden

解决办法&#xff1a; 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx&#xff0c;就完成了。 ./nginx -s reload...

微信VX多开 免扫码 登录 互斥体 可视化 Exui v1.1 易语言源码附成品软件

UI设计&#xff1a; 1. EXUI界面库20240204 调用的模块&#xff1a; 1. wow64_hook_3.02.ec&#xff08;压缩包内含&#xff09; 2. 精易模块[v11.1.0].ec&#xff08;自行下载&#xff09; 更新日志&#xff1a; v1.1 2024年7月25日13:28:43 { 1. 有人反馈 设置了V…...

JavaEE 从入门到精通(一) ~ Maven

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 1.1 概念 什么是 Maven&#xff1f; Maven 的核心概念 1.2 maven依赖坐标 1.3 maven仓库 1.4 maven安装 1.5 mave…...

滚珠丝杆与丝杆支撑座:稳定性与精度的双重保障

丝杆支撑座是连接滚珠丝杆与电机的轴承&#xff0c;采用优质的轴承能确保支撑座与滚珠丝杆之间的刚性平衡。那么&#xff0c;滚珠丝杆搭连接杆支撑座有哪些优缺点呢&#xff1f; 正常情况下&#xff0c;丝杆支撑座能够提供稳定的支撑力&#xff0c;确保滚珠丝杆在复杂工况下保持…...

实验5-11 空心的数字金字塔

本题要求实现一个函数&#xff0c;输出n行空心的数字金字塔。 函数接口定义&#xff1a; void hollowPyramid( int n );其中n是用户传入的参数&#xff0c;为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔&#xff0c;请注意&#xff0c;最后一行的…...

C#对象和类型

属性、方法、字段 字段和属性的区别 在C#中&#xff0c;字段&#xff08;fields&#xff09;和属性&#xff08;properties&#xff09;都是类的成员&#xff0c;它们提供了类存储数据的方式&#xff0c;但它们在用途和功能上有着明显的区别。 字段 字段通常用来存储类…...

免费分享一套SpringBoot+Vue图书(图书借阅)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue图书(图书借阅)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue图书(图书借阅)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文阐述了一套先进的图书管理系…...

数据结构与算法--队列

文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…...

<Qt> 常用控件

目录 一、控件概述 二、QWidget 核心属性 &#xff08;一&#xff09;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&#xff1a;编译器为x86版本&#xff0c;输出文件为x86。amd64_x86&#xff1a;编译器为amd64版本&#xff0c;输出文件为x86。amd64&#xff1a;编译器为amd64版本&#xff0c;输出文件为amd64。x86_amd64&#xff1a;编译器为x86版本&am…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

Spring Boot SQL数据库功能详解

Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖&#xff08;如org.postgresql:postgresql&#xff09;后&#xff0c;应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息&#xff1a; 数据库URL格…...

智能问数Text2SQL Vanna windows场景验证

架构 Vanna 是一个开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关功能。 机制 Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”&#xff0c;然后提出问题&#xff0c;这些问题将返回 SQL 查询&#xff0c;这些查…...

CKA考试知识点分享(2)---ingress

CKA 版本&#xff1a;1.32 第二题是涉及ingress相关。本文不是题目&#xff0c;只是为了学习相关知识点做的实验。 1. 环境准备 需要准备一套K8S集群。 1.1 安装ingress-nginx 下载deploy文件&#xff1a; wget -O controller-v1.12.2.yaml https://raw.githubusercontent…...