RK3568平台(时间篇)看门狗

一.看门狗原理

在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。

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

这就好比你的身边有一只时刻饥饿的狗,你不按时给它肉吃,它就会吃你的肉,你被吃了......挂了,投胎转世,彻底重新做人了。不幸的是来世你还得喂狗.

二.看门狗种类

在现在的嵌入式系统中主要可以分为两种类型的看门狗:

1、CPU内部自带的看门狗:此类看门狗一般是将一个芯片中的定时器来作为看门狗,通过程序的初始化,写入初值,设定溢出时间,并启动定时器。程序按时对定时器赋初值(或复位),以免被咬。这种看门狗是可以被禁用的(只要停止这个定时器即可),好比对那只要咬你的狗来个“葵花点穴手”。大部分CPU都内置看门狗,硬件原理可参考各芯片数据手册。

优点:可以通过程序改变溢出时间;可以随时禁用

缺点:需要初始化;如果程序在初始化、启动完成前跑飞或在禁用后跑飞,看门狗就无法复位系统,这样看门狗的作用就没有了,系统恢复能力降低。

2、独立的看门狗芯片:这种看门狗主要有一个用于喂狗的引脚(一般与CPU的GPIO相连)和一个复位引脚(与系统的RESET引脚相连),如果没有在一定时间内改变喂狗脚的电平,复位引脚就会改变状态复位CPU。此类看门狗一上电就开始工作,无法禁用。现在常用的芯片有:CAT705/CAT706、IMP706等等,溢出时间在1.6秒左右。 

优点:无须配置,上电即用。无法禁用,系统必须按时喂狗,系统恢复能力高。

缺点:无法灵活配置溢出时间,无法禁用,灵活性降低。

三.DTS配置

wdt: watchdog@feaf0000 {compatible = "snps,dw-wdt";reg = <0x0 0xfeaf0000 0x0 0x100>;clocks = <&cru TCLK_WDT0>, <&cru PCLK_WDT0>;clock-names = "tclk", "pclk";interrupts = <GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH>;status = "disabled";
};

看门狗默认没有使能,首先需在 DTS 文件中打开 wdt 节点:

&wdt{status = "okay";
};

四.看门狗的使用

watchdog 的驱动文件为 kernel-5.10/drivers/watchdog/dw_wdt.c

看门狗设备的查看:

ls /dev/watchdog* -l

可以通过 echo 命令来控制该设备:

# 写入任意内容(大写字母‘V’除外),开启看门狗,每 44 秒内需要写入一次(喂狗)
echo A > /dev/watchdog
# 开启看门狗,并且内核会每隔 22 秒自动喂一次狗
echo V > /dev/watchdog

也可以通过程序来控制看门狗,通过Android.mk编译生成可执行文件,在机器启动后,adb push到上面运行,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/watchdog.h>
#define WDIOC_SETTIMEOUT        _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT        _IOR(WATCHDOG_IOCTL_BASE, 7, int)
int main(void)
{int timeout;int fd;int ret = 0;fd = open("/dev/watchdog", O_WRONLY); //start watchdogif (fd == -1) {perror("watchdog");exit(EXIT_FAILURE);}timeout = 22;ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout); //set timeoutif (ret < 0) {printf("ioctl WDIOC_SETTIMEOUT failed.\n");goto fail;}ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeout); //get timeoutif (ret < 0) {printf("ioctl WDIOC_SETTIMEOUT failed.\n");goto fail;} else {printf("timeout = %d\n", timeout);}while (1) {ret = write(fd, "\0", 1); //feed the dogif (ret != 1) {ret = -1;break;}printf("feed the dog\n");sleep(10);}
fail:close(fd);return ret;
}

代码说明:

1、内部看门狗在使用 open 函数打开后会立刻开始计时。

2、通过用 ioctl 来设置超时时间和获取超时时间。当没有设置超时时间时,驱动会应用默认请求的超时时间为 30 s。需要说明的是驱动最终设置的超时时间并不一定是应用层传输的时间或者驱动一开始设置的默认时间。驱动函数里有一个超时时间的列表,该列表中存放了 16 个超时时间(前 9 个是 0)。驱动会在超时时间列表中找到一个合适的时间作为最终 watchdog 设置的超时时间。

以下为超时时间的详细列表:

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

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

相关文章

私有开源LLM实例的三个考虑因素

原文地址&#xff1a;three-considerations-for-private-open-source-llm-instances 2024 年 4 月 29 日 在生产应用中使用商业 LLM APIs 会带来明确且经过充分研究的风险。因此&#xff0c;企业越来越多地转向利用开源的私有托管LLM实例&#xff0c;并通过RAG技术进行增强。 介…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…

MathType如何使用LaTex代码编辑公式?MathType使用LaTex代码编辑公式教程 mathtype高仿latex

MathType专为解决数学公式输入问题打造&#xff0c;内置有自定义函数识别、国际性字符输入、拖放表达式、标签命名等丰富的功能&#xff0c;下面就来看看如何使用LaTex代码编辑公式吧。 MathType使用LaTex代码编辑公式教程 第一步&#xff1a;首先打开软件&#xff0c;并准备…

海亮杯总结

写在前面&#xff1a; 1001003002020270&#xff0c;rnk42&#xff0c;超级菜 你说的对&#xff0c;但是《第三届“海亮杯”》是由海亮教育集团自主研发的一款全新开放世界冒险游戏。游戏发生在一个被称作「浙江省诸暨海亮高级中学」的幻想世界&#xff0c;在这里&#xff0c;…

【电子取证篇】WinHex哈希校验值大小写转换和WinHex常规设置功能

【电子取证篇】WinHex哈希校验值大小写转换和WinHex常规设置功能 简单记录下WinHex哈希校验大小写值转换和新增加的一些功能、常用设置&#xff0c;WinHex时不时增加点小功能的&#xff0c;挺喜欢这种的&#xff0c;像挖宝藏一样&#xff0c;总会给你一些惊喜—【蘇小沐】 1、…

Python基础学习之sys.argv[0]及类似方法

前言 在Python编程中&#xff0c;经常会遇到要拿取当前代码路径或者当前代码名称&#xff0c;今天分享几个拿取的方法。 一.功能目的 拿取当前代码路径或者当前代码名称。 二.功能调研 根据搜索引擎&#xff0c;我们可以提取到以下信息&#xff1a; 1.sys.argv[0] 是脚本自身…

在浏览器中查看Revit模型:原理及实现

Greg Schleusner AIA 有一天向我提到&#xff0c;业内许多人认为带有 SVF2 的 Autodesk Viewer 是建筑模型最强大、性能最强的在线查看器之一&#xff0c;并且想知道开源 VIM 查看器和格式如何比较。 可以使用NSDT 3DConvert的 Revit插件 上传你的模型并在线查看预览&#xff…

全新神经网络架构KAN一夜爆火!200参数顶30万,MIT华人一作 | 最新快讯

白交衡宇发自凹非寺 量子位公众号 QbitAI 一种全新的神经网络架构 KAN&#xff0c;诞生了&#xff01; 与传统的 MLP 架构截然不同&#xff0c;且能用更少的参数在数学、物理问题上取得更高精度。 比如&#xff0c;200 个参数的 KANs&#xff0c;就能复现 DeepMind 用 30 万参数…

如何同时或者按顺序间隔启动多个程序

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;切换到定时器模块&#xff0c;快捷键&#xff1a;Ctrl3 2、新建一个定时器&#xff0c;我这里演示同时打开多个程序&#xff08;比…

WPF基础应用

WPF参考原文 MVVM介绍 1.常用布局控件 1.1 布局控件 WPF&#xff08;Windows Presentation Foundation&#xff09;提供了多种布局容器来帮助开发者设计用户界面&#xff0c;以下是一些常用的布局&#xff1a; Grid: Grid是最常用的布局容器之一&#xff0c;它允许你通过定…

链表经典面试题上

目录 创作不易&#xff0c;如若对您有帮助&#xff0c;还望三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 题目一&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目二&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff…

22-ESP32-S3模数转换器(ADC)

ESP32-S3模数转换器&#xff08;ADC&#xff09; 什么是模数转换器&#xff08;ADC&#xff09;&#x1f50d;&#xff1f; 模数转换器&#xff08;ADC&#xff09;是一种将模拟信号&#xff08;如电压&#xff09;转换为数字信号的设备。在ESP32-S3中&#xff0c;ADC用于将模…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…

羊大师:羊奶营养好选择

羊大师&#xff1a;羊奶营养好选择 羊奶确实是一种营养丰富的饮品&#xff0c;它被视为乳品中的精品&#xff0c;被称为“奶中之王”是世界上公认的最接近人奶的乳品。以下是一些羊奶的主要营养成分和其对人体的益处&#xff1a; 蛋白质&#xff1a;羊奶中的蛋白质含量丰富&a…

k8s部署maven项目

failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题&#xff0c;看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get current server API group list: Get “https://kubernetes.docker…

什么是死锁?代码演示,死锁如何排查和解决

死锁的概念 死锁是指在多线程或多进程中&#xff0c;两个或两个以上的线程或进程在执行过程中&#xff0c;因抢夺资源而造成的一种相互等待的现象。简单来说&#xff0c;就是两个或两个以上的线程或进程都在等待对方释放资源&#xff0c;从而导致所有线程或进程都无法继续执行的…

【python】python标准化考试系统[单项选择题 简易版](源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

[python]texthero安装后测试代码

测试环境&#xff1a; anaconda3python3.8 texthero1.1.0 测试代码来自官方&#xff1a;https://github.com/jbesomi/texthero 代码&#xff1a; import texthero as hero import pandas as pddf pd.read_csv("https://gitee.com/FIRC/texthero/raw/master/dataset/…

解决Linux中磁盘满/dev/vda1使用率100%问题

发现根目录下占用100%&#xff0c;具体还要排场到底是有哪些大文件占用 那么就在根目录下查询各个子文件夹的占用状态&#xff0c;有过大不用的即可删除 df -h *我的磁盘是100G&#xff0c;但这些总共加起来也接近不了这个数值 那就是有可能出现 已删除空间却没有释放的进程…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…