当前位置: 首页 > 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…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...