itop-3568 开发板系统编程学习笔记(20)看门狗应用编程

news2024/11/26 0:42:07

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记

文章目录

  • 看门狗简介
  • 看门狗编程命令(方法)
    • 开启和关闭看门狗
    • 设置超时时间
    • 获取超时时间
    • 喂狗
  • 看门狗底层简析
  • 看门狗编程实验

看门狗简介

看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。 看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。

——百度百科

RK3568 带有两个看门狗,一个普通看门狗和一个安全看门狗(本文将操作普通看门狗),

在这里插入图片描述

在 Linux 中,看门狗设备位于 /dev,名称通常为 watchdogx(x 为数字编号),如我所用的 iTOP-3568 的 /dev 目录有 watchdog 和 watchdog0,这里的 watchdog 是默认看门狗设备(其实就是 watchdog0)。

在这里插入图片描述

看门狗编程命令(方法)

应用层通过 ioctl() 来操作底层看门狗设备(ioctl 在之前的驱动笔记已经学习,这里不作介绍),下面是一些常用的看门狗控制命令:

ioctl 命令作用
WDIOC_SETOPTIONS用于开启或者关闭看门狗
WDIOC_KEEPALIVE喂狗
WDIOC_SETTIMEOUT设置超时时间
WDIOC_GETTIMEOUT获取超时时间

接下来将对这些命令进行简单介绍:

开启和关闭看门狗

开启和关闭看门狗需要调用如下函数:

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

开启和关闭 option 的宏定义如下:

#define WDIOS_DISABLECARD 0x0001
#define WDIOS_ENABLECARD  0x0002

设置超时时间

调用下面的函数可以设置当前看门狗设备的超时时间,

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

获取超时时间

调用下面的函数可以获取当前看门狗设备的超时时间,

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

喂狗

喂狗操作:

ioctl(int fd, WDIOC_KEEPALIVE, NULL);

在看门狗定时器到达超时时间前,需要进行喂狗(可以重置看门狗定时时间),不然看门狗超时后会导致系统复位或产生中断信号。

看门狗底层简析

只分析驱动层看门狗涉及的文件,不讲原理

在 rk3568 SDK 的内核代码中,看门狗的驱动文件位于 kernel/drivers/watchdog 目录下,主要涉及的驱动文件包括 watchdog_dev.c,watchdog_core.c 和 dw_wdt.c,前两个是看门狗通用驱动(在 menuconfig 中使能看门狗后,前两个驱动文件便被编进内核中),dw_wdt.c 是专属驱动(dw 全称为 Synopsys DesignWare,)

上文介绍的 ioctl() 接口,其对应的驱动代码就在 watchdog_dev.c 中,该驱动文件还包括看门狗杂项设备的注册、文件描述符成员函数定义(open、write…)等等内容。

在这里插入图片描述

而 dw_wdt.c 是一个平台驱动文件,它能通过与平台设备(或设备树)匹配,获得寄存器地址、时钟等数据,操作底层看门狗设备。

在这里插入图片描述

iTOP-3568 的设备树中看门狗节点信息如下:

在这里插入图片描述

设备树描述了看门狗的寄存器、时钟和中断等属性,0xfe600000 为 RK3568 普通看门狗的寄存器首地址:

在这里插入图片描述

看门狗编程实验

实验代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>

#define WDT_DEV  "/dev/watchdog0"

int main(int argc, char** argv)
{
	int fd;
	int ret = 0;
	int option;
	int timeout = 0, feed_time = 0;
	
	// 参数判断
	if(argc != 3)
	{
		printf("the right format: ./app timout feed_time.\n");
		return 0;
	}
	
	// 打开看门狗设备节点
	fd = open(WDT_DEV, O_RDWR);
	if(fd < 0)
	{
		printf("%s open failed.\n", WDT_DEV);
		return 0;
	}
	printf("%s open successfully.\n", WDT_DEV);
	
	// 关闭看门狗定时器(设备打开后会自动计时)
	option = WDIOS_DISABLECARD;
	ret = ioctl(fd, WDIOC_SETOPTIONS, &option);
	if(ret < 0)
	{
		printf("set option failed.\n");
		return 0;
	}
	printf("set option successfully.\n");
	
	
	// 设置超时时间
	timeout = atoi(argv[1]);
	ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
	if(ret < 0)
	{
		printf("set timeout failed.\n");
		return 0;
	}
	printf("set timeout successfully.\n");
	
	// 喂狗时间
	feed_time = atoi(argv[2]);

	// 开启看门狗定时器
	option = WDIOS_ENABLECARD;
	ret = ioctl(fd, WDIOC_SETOPTIONS, &option);
	if(ret < 0)
	{
		printf("set option failed.\n");
		return 0;
	}
	printf("set option successfully.\n");

	// 循环喂狗
	while(feed_time)
	{
		// 喂狗操作
		ret = ioctl(fd, WDIOC_KEEPALIVE, NULL);
		if(ret < 0)
		{
			printf("feed dog failed.\n");
			return 0;
		}
		printf("feed dog successfully.\n");
		sleep(feed_time); // 喂狗间隔时间
	}

	// 关闭设备文件
	close(fd);
	return 0;
}

实验结果:

设置看门狗定时器的超时时间和喂狗时间 feed_time 后,程序每隔 feed_time 秒喂一次狗,如果 feed_time 小于超时时间,或者程序退出后(程序代码中没有关闭看门狗),系统会重启。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MiniGPT-4开源了:看图聊天、教学、创作、搭网站

深度学习系列文章 文章目录 深度学习系列文章前言MiniGPT4效果展示 前言 一个月前&#xff0c;OpenAI 总裁 Greg Brockman 向世人展示了 GPT-4 令人惊讶的多模态能力&#xff0c;如从手写文本直接生成网站和识别图像中的幽默元素等。 尽管目前 OpenAI 暂未对 GPT-4 用户开放这…

农业灌溉以电折水测控终端-开启用水计量新模式

产品概述 农业灌溉以电折水测控终端&#xff08;MGTR-W&#xff09;是一款拥有“最强大脑”的农业水资源计量管理终端&#xff0c;内置以电折水逻辑运算&#xff0c;主要研究耗电量与取水量之间的关系&#xff0c;分析水电折算系数&#xff0c;进而通过计算耗电量与水电折算系数…

如何在个人web项目中使用Servlet监听器?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 服务器软件&#xff1a;apache-tomcat-8.5.27 目录 一. Servlet监听器是什么&#xff1f;二. Servlet监听器有哪些作用?2.1 监听域对象的创建和销毁2.1.1 ServletContextListener接口…

zabbix自定义监控项脚本

以下脚本具体如何使用可参考以下文章 配置zabbix自定义监控项_Apex Predator的博客-CSDN博客 1.检测url是否存活 vi /opt/zabbix_jb/check_url_status.sh #!/bin/bash acurl -s -o /dev/null -w "%{http_code}" "$1" bcurl -s -o /dev/null -w "%…

heic的照片怎么转化jpg格式,3个工具分享

heic的照片怎么转化jpg格式&#xff1f;当我想要把照片进行人物抠像的话那我们得需要使用专业图片软件PS。因为人物抠像是一种常见的图像处理技术&#xff0c;它在我们职场中有广泛的需求&#xff0c;它可以将人物从照片中提取出来放置到其他地方&#xff0c;使得照片更具专业性…

如何在 Cockpit 中管理虚拟机

Cockpit 是一个很将整个服务器置于一个集中的控制面板中&#xff0c;并对它们进行相当程度的控制。还可以在Cockpit中创建和管理虚拟机。 环境 Centos8 安装Cockpit 要使用 Cockpit 创建和管理虚拟机&#xff0c;必须在运行 Cockpit 的计算机上安装 cockpit-machines 模块&…

【传统方式部署Ruoyi微服务】

IP机器与部署组件 部署思路顺序&#xff1a; 1 安装mysql wget https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm rpm --import https://repo.mysql.com/RPM-GPG-K…

排序 - 快速排序(Quick Sort)

文章目录 快速排序介绍快速排序实现快速排序时间复杂度和稳定性快速排序稳定性快速排序时间复杂度 代码实现核心&总结 快速排序介绍 它的基本思想是: 选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一…

使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

使用QToolButton和QStackedWidget的侧边栏&#xff08;SideBar&#xff09;的实现与实现原理解析 原文链接&#xff1a;https://blog.csdn.net/qq153471503/article/details/128528072 Demo下载&#xff1a;https://gitee.com/jhuangBTT/QtSideBar 1、简介 侧边栏是一个很常用…

ModStartBlog v7.2.0 暗黑模式,超级搜索,富文本升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

Spring Security Ldap 登录认证流程的源码梳理

一、通过请求Controller开始登录认证 通过authenticationManager调用authenticate()方法开始登录认证&#xff0c;因为authenticationManager是通过Bean注入&#xff0c;因为SecurityLdapConfig是继承的WebSecurityConfigurerAdapter类&#xff0c;所以authenticationManager的…

【Unity+MySQL】实现注册登录系统(封装版)

目录 1 MySQL封装2 用户注册、登录方法封装3 Unity交互 接着 上篇文章的注册登录系统&#xff0c;这篇文章将MySQL相关操作封装&#xff0c;在Unity交互脚本中直接调用封装的方法。 1 MySQL封装 编写一个DBConnector脚本&#xff0c;封装MySQL中常用的操作&#xff0c;如连接…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境&#xff1a;IDEA&#xff0c;JDK1.8 2.服务打包类型&#xff1a; war包 3.war包部署环境&#xff1a;Linux系统&#xff0c;tomcat服务器&#xff0c;端口号&#xff1a;8081 4.war包部署位置&#xff1a;tomcat-8081/webapps/temp.war 5.服务名为&#xff1a;t…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Postman轻松签名,让SHA256withRSA保驾护航!

postman接口签名教程&#xff1a;https://www.bilibili.com/video/BV1r14y1A7MQ/? 目录&#xff1a;导读 前言 获取pmlib 引入依赖bundle.js&#xff0c;有以下两种方式&#xff1a; 使用Pre-request Script对请求进行加签(具体加签字段请看自己项目) 结语 前言 在接口测…

荔枝派Zero(全志V3S)开启alsa,测试codec

文章目录 前言一、ALSA 简介二、ALSA 框架三、buildroot 配置四、烧录到 SD 卡五、测试1、查看 CODEC 设备2、alsa-utils 使用①、查看设备②、调节音量③、查看控制器④、录音测试⑤、播放测试 前言 默认 dts 中使能了 codec 需要使用的话&#xff0c;在 buildroot 中勾选 a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高&#xff0c;大家在运动的时候都喜欢戴上耳机&#xff0c;享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况&#xff0c;这是因为传统耳机佩戴方式是通过空气振动来传递声音&#xff0c;而人在运动时就会伴随着大量的汗水&#xff0…

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用&#xff0c;无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中&#xff0c;都很容易遇到注意力模型的身影。从注意力模型的命名方式看&#xff0c;很明显其借鉴了人类的注意力机制。我们来看…

GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现

规范解读 GB/T28181-2022和GB/T28181-2016规范&#xff0c;有这么一条“更改了附录 D 基于 TCP 协议的视音频媒体传输要求&#xff08;见附录 D&#xff0c;2016 年版的附录 L&#xff09;。”。 本文主要是针对GB/T28181-2022里面提到的“基于 TCP 协议的视音频媒体传输要求…