【嵌入式】嵌入式系统稳定性建设:最后的防线
🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。
📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等服务,有需要可私信联系。
🗄️ 专栏介绍:本文归属于专栏《嵌入式系统稳定性建设》,为大家带来嵌入式软硬件开发过程中的系统稳定性建设相关的文章,专栏文章平均质量分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. 看门狗的优化和注意事项
在实际应用中,需要根据系统的特性和要求来优化和配置看门狗定时器的超时时间、喂狗周期、喂狗优先级等参数。
- 确保喂狗的正确性和及时性。比如有个功能在允许时总是会高优先级抢占CPU 6秒钟,那看门狗超时时间就要大于6秒钟+喂狗间隔的总和,否则临界情况下可能会导致错过1次喂狗导致误触发看门狗超时。比如可以把看门狗超时时间设置为
20秒,喂狗周期为2秒。 - 看门狗优先级要恰当。一般情况下是将看门狗的线程任务优先级置为最高,如果最高优先级的定时喂狗任务都超时了,那说明此时系统大概率已经异常或者超负荷了,亟需恢复到正常工作状态。
- 触发看门狗恢复机制时保障好用户体验,假设恢复机制为重启系统,那么对于一个有开机铃声的产品来说,需要在开机时判断本次启动是否由看门狗触发的重启,如果是则说明本次启动并非用户的本意和主动操作,需要静默启动,以避免对用户的噪声打扰。
- 考虑系统的安全性和可靠性,避免因看门狗机制本身而引入新的故障点。
5. 结语
嵌入式系统稳定性中的看门狗技术是确保系统可靠性的重要手段。通过对看门狗的原理、应用和优化进行深入理解和合理应用,可以有效提高嵌入式系统的稳定性和鲁棒性,确保系统能够持续稳定地运行并及时恢复。希望本文能够为读者提供对嵌入式系统稳定性和看门狗技术的深入理解,并为实际应用提供一些有益的参考。
相关文章:
【嵌入式】嵌入式系统稳定性建设:最后的防线
🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…...
【算法】一类支持向量机OC-SVM
【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机,从基础的回归和分类到后来的优化,在接触到支持向量机还有一类支持向量机的…...
深入学习默认成员函数——c++指南
前言:类和对象是面向对象语言的重要概念。 c身为一门既面向过程,又面向对象的语言。 想要学习c, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…...
psutil, 一个超级有用的Python库
Python的psutil是一个跨平台的库,可以用于获取系统运行时的各种信息,包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、…...
[Python]`threading.local`创建线程本地数据
在Python中,threading.local是一个用于创建线程本地数据的工具。它允许每个线程拥有自己独立的变量副本,这样可以在多线程程序中避免共享变量带来的问题。 通过使用threading.local,你可以为每个线程创建一个独立的变量空间,这样…...
删除数据表
oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后,就会把数据表 emp30 删除 在…...
前端自带的base64转化方法
前端html的base64使用方法window.btoa()和window.atob()_html用window.btoa();-CSDN博客...
图论(二)之最短路问题
最短路 Dijkstra求最短路 文章目录 最短路Dijkstra求最短路栗题思想题目代码代码如下bellman-ford算法分析只能用bellman-ford来解决的题型题目完整代码 spfa求最短路spfa 算法思路明确一下松弛的概念。spfa算法文字说明:spfa 图解: 题目完整代码总结ti…...
.NET Core 日志记录功能详解
在软件开发和运维过程中,日志记录是一个非常重要的功能。它可以帮助开发者跟踪应用程序的运行状况、诊断和监控问题。.NET Core 提供了一个灵活且易于使用的日志系统,本文将详细介绍.NET Core日志的相关概念、配置和使用方法。 1. 什么是日志记录以及它…...
docker——启动各种服务
1.Mysql 2.Redis 3.nginx 4.ES 注意: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 标签导出这里就不细说了,直接说上述问题解决方案 在调用导出接口的时候加上两个参数 responseType: “blob” responseEncoding: “utf8” export function test(data) {return util({url: /test,method: …...
透明多级分流系统(用户端缓存和负载均衡)
部件考虑 有些设备位于客户端或者网络边缘,能够迅速响应用户请求,避免给cpu和数据库带来压力,比如,本地缓存,内容分发网络,反向代理等。 有些设备处理能力能够线性扩展,易于伸缩,应…...
Python sort从大到小排序面试题
在Python中,你可以使用内置的sorted()函数或者列表的sort()方法来对列表中的元素进行从大到小的排序。 使用sorted()函数: 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进行类型转换
在写抽象类或者接口的时候,肯定是不能继承QObject的 但是又想使用qobject_cast进行类型转换,使用以下办法就能实现 #ifndef FACTORYINTERFACE_H__ #define FACTORYINTERFACE_H__ #include <QObject> class FactoryInterface{ public:FactoryInterf…...
docker离线搭建仓库
要在Docker中搭建本地仓库,可以按照以下步骤进行操作: 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具(如Terminal或PowerShell),运行以下命令来创建一个新的容器并将其设置为本地…...
ABC344 A-E题解
文章目录 A题目AC Code: B题目AC Code: C题目AC Code: D题目AC Code: E题目AC Code: 不易不难,写到5题很简单,但是要有足够的思维能力。 A 题目 我们用一个 flag 变量记录我们是不是在两个竖…...
Jeecg-boot 初次启动项目失败
1.将IDEA的字符编码全部改成utf-8 2. 更改database的密码 3.换个jdk重新启动...
封装的echarts子组件使用watch监听option失效的问题
项目场景: 我在项目里面封装了一个echarts组件,组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化,option变化之后,销毁,然后再新建一个charts表 碎碎念 问题如标题所示,这篇…...
设置 Docker 化的 Python 环境 — 优雅的方式
原文:towardsdatascience.com/setting-a-dockerized-python-environment-the-elegant-way-f716ef85571d?sourcecollection_archive---------1-----------------------#2024-04-02 本文提供了一个逐步指南,介绍如何使用 VScode 和 Dev Containers 扩展设…...
为什么你的.NET 9边缘服务在Raspberry Pi 5上启动慢400ms?——基于JIT预编译+LLVM IR优化的3层根因定位法
第一章:为什么你的.NET 9边缘服务在Raspberry Pi 5上启动慢400ms?——基于JIT预编译LLVM IR优化的3层根因定位法在 Raspberry Pi 5(Broadcom BCM2712,4Cortex-A76 2.4GHz,LPDDR4X-4267)上运行 .NET 9 自托…...
高光谱成像基础(十二)光谱重建(Spectral Reconstruction)卸
认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...
VMware Workstation 16 中 Windows Server 2019 数据中心版安装与优化指南
1. VMware Workstation 16 环境准备 在开始安装 Windows Server 2019 数据中心版之前,我们需要先准备好 VMware Workstation 16 的环境。我建议大家在安装前检查下自己的电脑配置,毕竟跑虚拟机还是挺吃资源的。我的经验是,至少要有 16GB 内存…...
官方插件包尚未公开?手把手教你从PyPI预发布通道抢鲜下载Python 2026 AOT编译器,含离线安装包与签名验证脚本
第一章:Python 原生 AOT 编译方案 2026 插件下载与安装Python 原生 AOT(Ahead-of-Time)编译方案 2026 是 CPython 官方实验性扩展项目,旨在为 Python 提供无需运行时解释器即可生成独立可执行文件的能力。该插件目前以预发布版本形…...
【电商PHP高并发订单处理黄金法则】:20年架构师亲授5大防超卖、零重复、秒级响应的实战方案
第一章:电商PHP高并发订单处理的底层挑战与认知重构在亿级日活的电商场景中,PHP 传统同步阻塞式订单流程在秒杀、大促等峰值时刻频繁遭遇超卖、库存错乱、数据库连接耗尽与事务死锁等问题。这些表象背后,是开发者对 PHP 运行模型、MySQL 事务…...
GameHub部署指南:Flatpak、AppImage和原生包安装的完整对比
GameHub部署指南:Flatpak、AppImage和原生包安装的完整对比 【免费下载链接】GameHub All your games in one place 项目地址: https://gitcode.com/gh_mirrors/ga/GameHub 想要将所有游戏集中管理在一个地方?GameHub是你的终极游戏库解决方案&am…...
从像素到点云:RGB、深度与LiDAR的视觉感知技术全解析
1. 视觉感知技术的三大支柱:RGB、深度与LiDAR 当你用手机拍照时,摄像头捕捉的是二维的彩色图像;当扫地机器人避开你家宠物时,它"看到"的是物体距离信息;而自动驾驶汽车行驶时,则依赖激光构建的精…...
用 SEONIB批量生成 SEO 博客来提升 Google 排名
用 SEONIB 批量生成 SEO 博客来提升 Google 排名,核心是:先用正确关键词+站内结构“打底”,再用 SEONIB 把这个结构规模化,最后用 Search Console 做数据反馈并持续优化。 下面是一套可以直接在团队里照着做的“SEONIB…...
技术判断力之AI三问涌
认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...
