freeRTOS中使用看门狗的一点思考

news2024/11/24 2:33:19

关于看门狗想必各位嵌入式软件开发的朋友应该都不会陌生的。在嵌入式软件开发中,看门狗常被用于监测cpu的程序是否正常在运行,如果cpu程序运行异常会由看门狗在达到设定的阈值时触发复位,从而让整个cpu复位重新开始运行。

看门狗的本质是一个计数器,一开始的时候配置其为一个特定的值,然后这个计数器就会一直运行倒数自减,自减到0就会引发系统复位。所以为了避免被复位,就需要隔一定的时间复位看门狗的计数值,也就是我们常说的 “喂狗” 。

这个 “喂狗” 的动作应当发生在看门狗引发复位的阈值的间隔中,否者超过或者达到这个阈值,会导致系统被复位,这是我们所不希望看到的。

关于看门狗在程序中使用,可以分两种情况去讨论:

1)裸机中使用看门狗;
2)RTOS环境中使用看门狗。

1、裸机中使用看门狗

在裸机中使用看门狗,由于裸机的编程和程序执行流的方式的影响,一般开发人员通常会在主循环中进行看门狗的“喂狗”操作。

这种时候是要开发人员很合理的评估自己所写代码的执行流程,能够估算整个主循环中最坏的执行时间的值,从而设定看门狗的阈值时间,保证最坏的情况下,看门狗不至于复位系统。

裸机中使用看门狗进行系统监测的常见的两种方式:

(1)在代码的执行流中插入喂狗

这是一种最简单的方式。开发的时候一般都是在程序执行流中插入看门狗的“喂狗”,特别是针对程序中需要较长时间占用执行的程序段中要加入“喂狗”操作。对于执行过程中占用时间较少的,可以在主循环流程中添加“喂狗”即可。

(2)用定时器进行定时“喂狗”

在裸机中也可以使用定时器的方式进行定时喂狗。这种方式相比在代码中多处插入“喂狗”操作要使代码看起来简洁一下,但是一般都需要占用硬件定时的硬件资源,还要多加定时器中断,如果程序本身就较为复杂的话,多加异常中断可能会给系统维护和稳定性带来一些不可预料的问题。

当然,还有其他的实现和使用的方式,对于裸机的看门狗“喂狗”,总体而言是比较简单的,需要考虑的东西相对少一些,实现起来更加简单。

2、RTOS中使用看门狗

在RTOS中使用看门狗就复杂很多,需要考虑的问题就较为多。因为RTOS中的多任务机制的存在,理论上程序越复杂,系统运行就越复杂,多任务的存在就可能会有更多的变化情况,有些可能还不好预料。

在多任务中,用看门狗的时候,我们希望可以实现看门狗监测整个系统每个任务的健康存活情况。假如系统中某个任务死掉了,能够通过看门狗进行系统复位,从而重新复位系统,以使系统重新开始运行。而每个任务都正常的时候,不要进行看门狗复位,从而不影响系统的正常执行。

浅显的讨论一下在RTOS下的看门狗 “喂狗” 的实现方式:

(1)在代码的执行流中插入“喂狗”

这种方式就是在每个任务的调度流中都插入“喂狗”操作,然后通过任务的调度执行实现“喂狗”的操作。这种方式就比较好理解也不复杂,只要开发者熟悉代码,知道代码的执行顺序流,然后在程序中插入“喂狗”操作即可。

这种方式有什么优缺点呢?

优点:

方便实现。只要在各个任务中调用“喂狗”操作即可,在占用cpu执行时间较长的程序段也要注意“喂狗”。

缺点:

不能实现监控每个任务的存活情况。因为当使用这种方式的时候,有多处地方可以进行喂狗操作,这个时候假如某个任务已经死掉了,它自身因为已经死掉不能在进行喂狗,但是其他的任务可以喂狗,整个系统依然不回被复位,也就不能知道某个任务是否出现问题。

(2)监视各个任务的存活状态进行喂狗

这种方式相比较于到处去调用喂狗操作更加实用,它是要在确认每个任务都正常存活的情况下才喂狗。如果某个任务因为故障不再运行了,就会导致超时不能喂狗,从而会导致系统被看门狗复位。

这种方式的实现有很多种手段,比如用事件标志组的方式就比较容易实现。

做法是:

1)创建一个“喂狗”的独立任务;
2)申请一个事件标志组,并为每个任务留一个标志位;
3)在每个单独的任务中执行的时候置位属于这个任务的标志位;
4)在“喂狗”的独立任务中检测这些所有的任务所关联的标志位,
如果所有的标志位都置位成立,说明所有的任务都正常,进行一次喂狗操作。反之则引发一次复位。

这种方式也有一个问题需要留意的:

其他的任务可以通过这个“喂狗”的独立任务进行监测,那这个独立的“喂狗”任务由谁来监测它呢?答案肯定是由看门狗进行监测啊。

在这个独立的“喂狗”任务中,它除了要监测其他任务的事件标志外,还要自身能够定时的进行“喂狗”的操作,防止长时间不“喂狗”导致系统复位。这样可以实现看门狗监测这个“喂狗”任务,而“喂狗”任务监测其他的任务的状态。

特别注意:因为RTOS环境下的软件开发毕竟与裸机开发不同,RTOS下的有阻塞、挂起、删除、恢复任务等的操作,所以对使用看门狗会有更多的难度,需要综合实际的使用场景进行考虑。

当然,文章里只是简单的分析了一些使用看门狗的思路,做法是多种多样的,如果有觉得文中分析的有误,还望指正!有更好的思路也望多多分享!!!

 

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

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

相关文章

Qt QQueue 安全的多线程队列、阻塞队列

文章目录 1. C queue 队列基本用法2. Qt QQueue 队列基本用法3. Qt QQueue 多线程队列4. Qt BlockingQueue 自定义线程安全的阻塞队列 1. C queue 队列基本用法 在C中,queue是一个模板类,用于实现队列数据结构,遵循先进先出的原则。 ♦ 常用…

测试3:用例

目录 1.测试用例的基本要素 2.测试用例的设计方法 1.基于需求的设计方法 2.等价类 1.概念 2.步骤: 3.例子 3.边界值 1.概念 2.步骤 3.例子 4.判定表 1.概念 2.设计测试用例 3.例子 5.正交排列 1.什么是正交表 2.测试用例 3.如何通过正交表设计测试用例 6.场景…

(3)Qt——信号槽

目录 1.信号槽的概念** 2.信号槽的连接*** 2.1自带信号 → 自带槽 2.2 自带信号 → 自定义槽 2.3 自定义信号 3. 参数传递** 3.1 全局变量 3.2 信号槽传参 4. 对应关系** 4.1 一对多 4.2 多对一 1.信号槽的概念** 信号槽指的是信号函数与槽函数的连接,可…

AI绘图入门 安装 stable-diffusion-webui

下面介绍了N卡,A卡,或CPU跑 stable-diffusion-webui的方法。 1.安装python 3.10.x https://www.python.org/downloads/ 2.安装Git https://git-scm.com/downloads 【非必要】打开代理工具(比如clash)然后在cmd配置git的http和…

软件测试相关概念

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 需求需求的定义测试人员眼中的需求为什么需求对测试人员如此重要如何深入理解需求 测试用例定义为什么要有测试用例 软件错误…

IT服务规划设计笔记

规划设计处于整个IT服务生命周期中的前端,其主要目的在于: (1)设计满足业务需求的IT服务 (2)设计SLA、测量方法和指标 (3)设计服务过程及其控制方法 (4)规…

learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景)

return 关键字 不知道我们大家是否有一个疑惑:我们下载一个大型游戏软件(王者荣耀),都要花几个小时去下载,但是一旦我们游戏连输,想要删除这个软件的时候,它仅仅只需要十几秒,这是为…

主题建模和文本聚类:理论与实践

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

真题详解(3FN)-软件设计(六十九)

真题详解(构造二叉树)-软件设计(六十八)https://blog.csdn.net/ke1ying/article/details/130536155 学生信息学生id姓名性别1{家长ID}*班主任班级。 解析:当存在1对多的情况,要写个1{}*,中间用{}。 ()表…

一篇学会Gitlab搭建及使用

目录 一、Gitlab介绍 1、什么是Gitlab 二、搭建gitlab并实现ssl 1、配置yum源或下载gitlab包 2、安装依赖软件及获取GPG密钥 3、安装gitlab-ce 4、创建私有密钥 5、创建私有证书 6、创建CRT签名证书 7、利用openssl签署pem 证书 8、配置证书到gitlab 9、初始化gitla…

读书笔记:《图解CIO工作指南》

《图解CIO工作指南》第 4 版,日 . 野村综合研究所系统咨询事业本部 著,周自恒 译 大数据、云计算时代下的IT战略和IT实务 CIO工作:IT管理、IT架构、IT实践 以着眼企业未来的观点进行构思:可视化(业务与系统&am…

初始化vue中data中的数据

当组件的根元素使用了v-if的时候, 并不会初始化data中的数据 如果想完全销毁该组件并且初始化数据,需要在使用该组件的本身添加v-if 或者是手动初始化该组件中的数据 初始化化数据的一些方法 Object.assign(this.$data, this.$options.data()) this.$data:当前的da…

TortoiseGit(大乌龟)安装教程(Git 图形化工具,告别手敲命令)

TortoiseGit安装教程 1. 下载TortoiseGit 官方下载地址:https://tortoisegit.org/download/ 自行选择下载对应版本(大部分位64位),进行下载 2. 安装TortoiseGit 打开安装包,如下图所示: 点击 Next&…

IDM绿色最新2023中文版磁力下载工具

Internet Download Manager(idm)是一款优秀的多线程下载工具。它支持自动捕获剪贴板及浏览器及流媒体网站的音视频下载链接,还有批量队列下载、静默下载、站点抓取等众多功能选项,可以说是 Windows 平台上功能最为强大的多线程下载…

通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器

文章目录 一.stack二.queue三.deque(双端队列)四.优先级队列优先级队列中的仿函数手搓优先级队列 五.反向迭代器手搓反向迭代器 vector和list我们称为容器,而stack和queue却被称为容器适配器。 这和它们第二个模板参数有关系,可以…

录屏界鼻祖Camtasia 2023中文版功能介绍/下载安装激活教程

随着网络科技的迅速发展,所以对于电脑的使用率也就越来越高了!然而,也可能跟这有关系,目前各种类型的软件层出不穷,当然也就包括了电脑录屏软件。这给我们造成了一些困难,究竟哪一款适合自己呢?…

DMA的补充笔记

DMA有两个总线: 1、DMA存储器总线:DMA通过该总线来执行存储器数据的传入和传出。 2、DMA外设总线:DMA通过该总线访问AHB外设(AHB主要是针对高效率、高频宽以及快速系统模块所设计的,主要有Flash 存储器、复位和时钟控…

栈和队列OJ题思路分享之栈和队列互换(C语言实现)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:刷题分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你刷更多C语言和数据结构的题!   🔝🔝 栈和队列刷题分享二 1. 前言⚡…

基于人类反馈的强化学习(RLHF) 理论

gpt 进程 GPT-1 用的是无监督预训练 有监督微调,只有简单的单向语言模型任务;GPT-2用的是纯无监督预训练,使用更多的数据,更大的模型,又新增了几个辅助的训练任务;GPT-3 沿用了 GPT-2 的纯无监督预训练&a…

postgresql standby启动流程分析

专栏内容:postgresql内核源码分析个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 原理机制 关键流程 备节点启动 walreceiver启动的时机 结尾 前…