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

【嵌入式】嵌入式系统稳定性建设:最后的防线

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。

📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服务,有需要可私信联系。

🗄️ 专栏介绍:本文归属于专栏《嵌入式系统稳定性建设》,为大家带来嵌入式软硬件开发过程中的系统稳定性建设相关的文章,专栏文章平均质量分92,持续更新中,欢迎大家免费订阅关注。

专栏导航
📁 1. 【嵌入式】嵌入式系统稳定性概览:为何它如此重要?
📂 2. 【嵌入式】嵌入式系统稳定性建设:进程监控的不可或缺之力
📁 3. 【嵌入式】嵌入式系统稳定性建设:完善代码容错处理的必由之路
📁 4. 【嵌入式】嵌入式系统稳定性建设:静态代码扫描的稳定性提升术
📁 5. 【嵌入式】嵌入式系统稳定性建设:最后的防线

嵌入式系统稳定性建设:最后的防线

  • 1. 概述
  • 2. 原理介绍
    • 2.1 软件看门狗
    • 2.2 硬件看门狗
    • 2.3 哪个品种更优良
  • 3. 看门狗的应用
    • 3.1 Linux平台
    • 3.2 Arduino平台
    • 3.3 FreeRTOS平台
    • 3.4 RT-Thread平台
  • 4. 看门狗的优化和注意事项
  • 5. 结语

1. 概述

在这里插入图片描述

嵌入式系统的稳定性对于其可靠性和性能至关重要。在现代的嵌入式系统设计中,为了确保系统能够持续稳定地运行并及时恢复,看门狗技术被广泛应用。看门狗是一种硬件或软件机制,用于监视系统的运行状态并在系统出现故障或停顿时执行预定义的恢复操作。本文将深入探讨嵌入式系统稳定性中的看门狗技术,包括其原理、应用和优化等。

2. 原理介绍

看门狗是一种定时器,在系统正常运行时,软件需要周期性地喂狗(重置定时器)。如果由于某种原因导致软件无法喂狗,定时器将超时并触发预定义的恢复机制,例如系统复位或恢复到安全状态。这种机制可以有效应对系统死机、死循环或其他异常情况,确保系统的稳定性和可靠性。

从实现方式上来看,看门狗又分为软件看门狗和硬件看门狗两个品种。

2.1 软件看门狗

软件看门狗是一种基于软件实现的定时器机制,在嵌入式系统中通过定时器或计时器中断来实现。软件看门狗通常由系统软件或应用程序负责定期对其进行“喂狗”,以防止超时。如果系统出现故障或停顿导致喂狗失败,软件看门狗会在预定的超时时间内触发相应的恢复机制,例如系统复位或恢复到安全状态。软件看门狗的实现相对灵活,可以在不同的嵌入式系统和平台上通过软件编程来实现。

2.2 硬件看门狗

硬件看门狗是一种由专用硬件电路实现的定时器机制,在嵌入式系统中通常作为独立的硬件模块存在。硬件看门狗在系统初始化后开始计时,当系统正常运行时,软件需要定期对其进行“喂狗”,以防止超时。如果由于某种原因导致软件无法喂狗,硬件看门狗将在预定的超时时间内触发系统的恢复操作,例如系统复位或恢复到安全状态。硬件看门狗通常具有更高的可靠性和稳定性,可以在系统停顿或死机时独立地执行恢复操作。

2.3 哪个品种更优良

软件看门狗的可靠性取决于系统的整体稳定性,如果系统发生了严重的故障或死机,软件看门狗也可能受到影响而无法正常工作;同时,其实时性也会受限于系统的运行状态和负载,可能受到系统的其他任务或中断的影响而无法精确定时。

而对于目前的主流芯片来讲,看门狗已经集成到芯片内部,经过一些必要的寄存器配置就可以直接使用了,无需复杂的定时器代码逻辑,不依赖操作系统,避免了软件运行带来的干扰和影响。

总的来说,硬件看门狗在稳定性和可靠性方面具有优势,特别是在对系统的稳定性和安全性有更高要求的场景下,硬件看门狗可能更为合适。当然,如果没有必要的硬件或者芯片支持,软件看门狗也不失为一种选择。

3. 看门狗的应用

在嵌入式系统中,看门狗通常与操作系统或应用程序集成,监视系统的运行状态。当系统正常运行时,软件会定期喂狗,以防止看门狗超时。如果系统出现故障或停顿,导致在预定的超时时间内喂狗,那么就会触发相应的恢复操作,从而确保系统能够及时恢复到正常状态。下面以示例代码的形式演示几个常见系统的看门狗初始化和喂狗流程。

3.1 Linux平台

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
#include <fcntl.h>int main(int argc char *argv)
{int fd = 0;int timeout = 10; // 超时时间为10秒// 打开看门狗设备fd = open("/dev/watchdog", O_WRONLY);if (fd == -1) {perror("watchdog device open");exit(EXIT_FAILURE);}// 配置看门狗定时器的超时时间ioctl(fd, WDIOC_SETTIMEOUT, &timeout);//每2秒喂狗1次while (1) {// 执行喂狗操作ioctl(fd, WDIOC_KEEPALIVE, 0);// 延时等待2秒sleep(2);}close(fd);return 0;
}

3.2 Arduino平台

#include <avr/wdt.h>void setup()
{// 启用看门狗定时器,超时时间为2秒wdt_enable(WDTO_2S);
}//定期调用,执行喂狗操作
void loop()
{// 正常操作时重置看门狗wdt_reset();// 在这里执行系统的其他任务
}

3.3 FreeRTOS平台

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "watchdog.h"// 看门狗任务
void vWatchdogTask(void *pvParameters)
{const TickType_t xMaxBlockTime = pdMS_TO_TICKS(1000);for(;;) {// 喂狗vTaskDelay(xMaxBlockTime);taskENTER_CRITICAL();WDT_FEED(); // WDT_FEED是一个假设的喂狗函数taskEXIT_CRITICAL();}
}void main(int argc, char *argv[])
{// 初始化看门狗vWatchdogInit(); // 假设初始化函数为vWatchdogInit// 创建看门狗任务xTaskCreate(vWatchdogTask, "Watchdog", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);// 启动调度器vTaskStartScheduler();
}

3.4 RT-Thread平台

#include <rtthread.h>
#include <rtdevice.h>static void watchdog_thread_entry(void* parameter)
{rt_device_t dev = rt_device_find("wdt"); // 假设"wdt"为看门狗设备的名称rt_device_open(dev, RT_DEVICE_OFLAG_RDWR);while (1) {rt_device_control(dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, RT_NULL); // 喂狗rt_thread_delay(1000); // 延时1秒}
}int rtthread_wdt_sample(void)
{rt_thread_t thread = rt_thread_create("watchdog", watchdog_thread_entry, RT_NULL, 1024, 25, 20);if (thread != RT_NULL) {rt_thread_startup(thread);}return 0;
}

上述代码,仅做功能和流程的延时,无法直接编译运行。项目开发过程中,还需要根据具体的硬件平台和操作系统配置情况来进行对应的调整。

4. 看门狗的优化和注意事项

在实际应用中,需要根据系统的特性和要求来优化和配置看门狗定时器的超时时间、喂狗周期、喂狗优先级等参数。

  1. 确保喂狗的正确性和及时性。比如有个功能在允许时总是会高优先级抢占CPU 6秒钟,那看门狗超时时间就要大于6秒钟+喂狗间隔的总和,否则临界情况下可能会导致错过1次喂狗导致误触发看门狗超时。比如可以把看门狗超时时间设置为20秒,喂狗周期为2秒
  2. 看门狗优先级要恰当。一般情况下是将看门狗的线程任务优先级置为最高,如果最高优先级的定时喂狗任务都超时了,那说明此时系统大概率已经异常或者超负荷了,亟需恢复到正常工作状态。
  3. 触发看门狗恢复机制时保障好用户体验,假设恢复机制为重启系统,那么对于一个有开机铃声的产品来说,需要在开机时判断本次启动是否由看门狗触发的重启,如果是则说明本次启动并非用户的本意和主动操作,需要静默启动,以避免对用户的噪声打扰。
  4. 考虑系统的安全性和可靠性,避免因看门狗机制本身而引入新的故障点。

5. 结语

嵌入式系统稳定性中的看门狗技术是确保系统可靠性的重要手段。通过对看门狗的原理、应用和优化进行深入理解和合理应用,可以有效提高嵌入式系统的稳定性和鲁棒性,确保系统能够持续稳定地运行并及时恢复。希望本文能够为读者提供对嵌入式系统稳定性和看门狗技术的深入理解,并为实际应用提供一些有益的参考。

相关文章:

【嵌入式】嵌入式系统稳定性建设:最后的防线

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…...

【算法】一类支持向量机OC-SVM

【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机&#xff0c;从基础的回归和分类到后来的优化&#xff0c;在接触到支持向量机还有一类支持向量机的…...

深入学习默认成员函数——c++指南

前言&#xff1a;类和对象是面向对象语言的重要概念。 c身为一门既面向过程&#xff0c;又面向对象的语言。 想要学习c&#xff0c; 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…...

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…...

[Python]`threading.local`创建线程本地数据

在Python中&#xff0c;threading.local是一个用于创建线程本地数据的工具。它允许每个线程拥有自己独立的变量副本&#xff0c;这样可以在多线程程序中避免共享变量带来的问题。 通过使用threading.local&#xff0c;你可以为每个线程创建一个独立的变量空间&#xff0c;这样…...

删除数据表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后&#xff0c;就会把数据表 emp30 删除 在…...

前端自带的base64转化方法

前端html的base64使用方法window.btoa()和window.atob()_html用window.btoa();-CSDN博客...

图论(二)之最短路问题

最短路 Dijkstra求最短路 文章目录 最短路Dijkstra求最短路栗题思想题目代码代码如下bellman-ford算法分析只能用bellman-ford来解决的题型题目完整代码 spfa求最短路spfa 算法思路明确一下松弛的概念。spfa算法文字说明&#xff1a;spfa 图解&#xff1a; 题目完整代码总结ti…...

.NET Core 日志记录功能详解

在软件开发和运维过程中&#xff0c;日志记录是一个非常重要的功能。它可以帮助开发者跟踪应用程序的运行状况、诊断和监控问题。.NET Core 提供了一个灵活且易于使用的日志系统&#xff0c;本文将详细介绍.NET Core日志的相关概念、配置和使用方法。 1. 什么是日志记录以及它…...

docker——启动各种服务

1.Mysql 2.Redis 3.nginx 4.ES 注意&#xff1a;ES7之后环境为 -e ELASTICSEARCH_HOSTS http://ip地址:9200...

git远程仓库使用

赋值这个地址clone 克隆之后 cd slam_oncloud/ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/slam_oncloud.git 查看一下 linuxchenxiao:/media/linux/mydisk/cloud_slam/slam_oncloud$ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/sla…...

js导出的excel文件无法打开/打开乱码,excel无法打开xxx.xlsx因为文件格式或文件扩展无效

excel无法打开xxx.xlsx因为文件格式或文件扩展无效 使用 a 标签导出这里就不细说了&#xff0c;直接说上述问题解决方案 在调用导出接口的时候加上两个参数 responseType: “blob” responseEncoding: “utf8” export function test(data) {return util({url: /test,method: …...

透明多级分流系统(用户端缓存和负载均衡)

部件考虑 有些设备位于客户端或者网络边缘&#xff0c;能够迅速响应用户请求&#xff0c;避免给cpu和数据库带来压力&#xff0c;比如&#xff0c;本地缓存&#xff0c;内容分发网络&#xff0c;反向代理等。 有些设备处理能力能够线性扩展&#xff0c;易于伸缩&#xff0c;应…...

Python sort从大到小排序面试题

在Python中&#xff0c;你可以使用内置的sorted()函数或者列表的sort()方法来对列表中的元素进行从大到小的排序。 使用sorted()函数&#xff1a; numbers [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers sorted(numbers, reverseTrue) # 设置reverseTrue实现从大到小排…...

【Stable Diffusion】入门:AI绘画提示词+参数设置攻略

目录 1 提示词1.1 分类和书写方式1.1.1 内容型提示词1.1.2 标准化提示词1.1.3 通用模板 1.2 权重1.2.1 套括号1.2.2 数字权重1.2.3 进阶语法 1.3 负面提示词 2 参数详解2.1 Sampling steps2.2 Sampling method2.3 Width, Height2.4 CFG Scale2.5 Seed2.6 Batch count, Batch si…...

Qt使用Q_DECLARE_INTERFACE Q_INTERFACES宏实现接口类使用qobject_cast进行类型转换

在写抽象类或者接口的时候&#xff0c;肯定是不能继承QObject的 但是又想使用qobject_cast进行类型转换&#xff0c;使用以下办法就能实现 #ifndef FACTORYINTERFACE_H__ #define FACTORYINTERFACE_H__ #include <QObject> class FactoryInterface{ public:FactoryInterf…...

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…...

ABC344 A-E题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目AC Code&#xff1a; E题目AC Code&#xff1a; 不易不难&#xff0c;写到5题很简单&#xff0c;但是要有足够的思维能力。 A 题目 我们用一个 flag 变量记录我们是不是在两个竖…...

Jeecg-boot 初次启动项目失败

1.将IDEA的字符编码全部改成utf-8 2. 更改database的密码 3.换个jdk重新启动...

封装的echarts子组件使用watch监听option失效的问题

项目场景&#xff1a; 我在项目里面封装了一个echarts组件&#xff0c;组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化&#xff0c;option变化之后&#xff0c;销毁&#xff0c;然后再新建一个charts表 碎碎念 问题如标题所示&#xff0c;这篇…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...