嵌入式系统如何尽可能避免存储数据丢失与损坏?

news2024/11/29 10:37:58

a0ea85a774f9ef5bb5bb9c57f2118bed.gif

正文


大家好,我是bug菌~

对于一些需要动态存储数据的嵌入式系统往往我们需要考虑系统在各种状态的数据可靠性问题。当然也不仅仅这些数据敏感的协议,最常见的就是你向存储系统写入数据的过程中给断电了,系统下一次上电跑飞了~

掉电过程是最为敏感的情景,也是一般在系统设计前期要重点考虑的,那么今天bug菌就跟大家重点聊聊一般的嵌入式系统如何尽可能的避免重要存储数据的丢失与损坏。

1

掉电检测  

前面也提到了,掉电过程是数据丢失和损坏比较高发的状态,一方面离不开硬件上掉电备电电源的相对稳定性和持久性,另一方面也需要软件部分最好掉电过程系统完整的收尾工作,最常见的问题就是正在掉电,你还在使劲的写文件或者其他改变存储介质的操作,运气好可能只是文件写少了;运气不好直接文件系统就崩溃了~

那么快速的掉电检可以帮助系统在断电前尽早将这些数据进行保存,以确保系统重新上电后能够恢复到正常工作状态,而不会因为掉电导致数据丢失或损坏。

2

存储器件的寿命与稳定性

电子产品都有使用寿命,在嵌入式设备里面常用闪存存储器,即Flash,而闪存通常以擦除/写入循环次数(P/E cycles)来衡量其寿命。

常见的闪存产品如NAND和NOR闪存都有固定的P/E周期数量,一般在几千到几十万次之间,所以如果频繁擦写就会导致损坏,最终也会使得数据丢失,另外,闪存的寿命还受到温度、电压以及擦除/写入操作的影响。

所以为了减少存储介质上的数据丢失要么选择高品质且可靠的存储介质,要么根据介质的特点优化存储算法,延长使用寿命。

那么通常在软件层面有如下几种软件处理方法和策略:

磨损均衡

在闪存中,频繁写入相同的块会导致这些块的寿命提前耗尽,从而降低整个存储器的寿命。

磨损均衡算法旨在平衡闪存中不同块的使用次数,避免某些块过早失效。可以通过选择写入次数最少的块来进行新数据的写入,或者通过重新映射块来实现。

垃圾回收

当删除或更新数据时,闪存中会产生垃圾数据,占用空间而无法直接写入。垃圾回收算法会定期检查闪存中的垃圾数据,并将其重新组织以释放可用空间。有效的垃圾回收算法可以减少擦除操作的频率,从而延长闪存的寿命,当然如果你没有用文件系统,只是裸写,基本上都是按顺序去写了。

坏块管理

坏块管理指的是处理闪存存储器中出现的无法正常读取或写入数据的坏块的过程。通过坏块检测、标记和替换,系统可以有效地识别和处理坏块,确保数据的完整性和可靠性。坏块管理还包括维护坏块映射表,以记录坏块的位置和替代块的使用情况。有效的坏块管理可以延长闪存存储器的寿命,提高系统的可靠性,并确保数据安全。

写入放大减少

写入放大指的是实际写入闪存的数据量与应用程序请求的数据量之间的差异。减少写入放大可以减少对闪存的写入操作,从而延长其寿命。这可以通过合并小的写入请求、延迟写入、以及数据压缩等技术来实现。

静态和动态数据分离

将静态数据(很少修改的数据)与动态数据(频繁修改的数据)分开存储在不同的闪存块中。这样可以避免频繁写入对静态数据块的影响,延长其寿命。

温度和电压管理

通过一些辅助的采样。来调节读写负荷,维持在合适的工作温度和电压可以减少对闪存的损坏和老化,从而延长其寿命。

3

数据备份

对于数据动态存储非常严格的应用需求场合,保证嵌入式设备的实时数据存储稳定性是非常重要的,特别是对于需要高可靠性和实时性的应用场景。以下是一些办法来确保嵌入式设备的实时数据存储稳定性:

实时数据备份

实时将数据备份到多个分区或者其他位置,例如本地存储和远程服务器,即是一块区域物理上遭到破坏,也能从其他区域进行恢复,极大的降低了数据丢失或损坏的概率。

使用事务性存储机制

采用具有事务性支持的存储机制,确保数据的原子性操作,即要么全部写入成功,要么全部失败,以避免数据不一致性,以免存在第三种状态完成系统的混乱与破坏。

实时监控和错误处理

建立实时监控系统来检测存储设备的健康状况,及时发现并处理存储设备的故障或错误,以前bug菌就接手到一些项目,写数据出了问题,好几天系统也没有提示,客户也没有及时查看,等发现问题已经好几周的数据异常了。

采用更加成熟的文件系统

一些支持掉电保护的实务型文件系统基本都支持日志功能或者文件系统级的保护机制。

数据完整性校验

实施数据完整性校验机制,例如循环冗余校验(CRC)或者哈希校验,来检测存储数据的完整性,及时发现和纠正数据损坏。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

bug菌唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 a2a1934e9501ede3a05bd16c18c104b0.gif

☞  嵌入式C语言进阶专辑 14f5dc9d593bcbfcf2cce4b9bae9c692.gif

☞  “bug说”专辑 c3d2f293feca0168cd0600df19f9e28a.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

481ea59290ed59368a6d2ccb1d70d70e.gif

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

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

相关文章

ssm621大湾区旅游推荐系统的设计与实现+vue【已测试】

前言:👩‍💻 计算机行业的同仁们,大家好!作为专注于Java领域多年的开发者,我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源: 👩‍💻 SpringBoot…

ICLR24大模型提示(8) | 退一步思考:在大型语言模型中通过抽象引发推理

【摘要】我们提出了一种简单的提示技术,即后退提示法,它使 LLM 能够进行抽象,从包含特定细节的实例中得出高级概念和第一原理。通过使用概念和原理来指导推理,LLM 显著提高了遵循正确推理路径解决问题的能力。我们使用 PaLM-2L、G…

Android Media Framework(三)OpenMAX API阅读与分析

这篇文章我们将聚焦Control API的功能与用法,为实现OMX Core、Component打下坚实的基础。 1、OMX_Core.h OMX Core在OpenMAX IL架构中的位置位于IL Client与实际的OMX组件之间,OMX Core提供了两组API给IL Client使用,一组API用于管理OMX组件…

对Java中二维数组的深层认识

首先,在JAVA中,二维数组是一种数组的数组。它可以看作是一个矩阵,通常是由于表示二维数据节后,如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…

数据结构 -- 树状数组

前言 树状数组或二叉索引树(Binary Indexed Tree),又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 …

Django更改超级用户密码

Django更改超级用户密码 1、打开shell 在工程文件目录下敲入: python manage.py shell再在python交互界面输入: from django.contrib.auth.models import User user User.objects.get(username root) user.set_password(123456) user.save()其中ro…

千行赏金:闲暇时间的价值创造者

在这个高速发展的信息时代,人们的生活节奏越来越快,闲暇时间似乎成为了一种奢侈品。然而,正是这些看似零散的闲暇时间,如果能够妥善利用,也能产生巨大的价值。今天,我要为大家介绍一款能够充分利用闲暇时间…

深度学习 - 梯度下降优化方法

梯度下降的基本概念 梯度下降(Gradient Descent)是一种用于优化机器学习模型参数的算法,其目的是最小化损失函数,从而提高模型的预测精度。梯度下降的核心思想是通过迭代地调整参数,沿着损失函数下降的方向前进&#…

金融领域的AI解决方案

AI可赋能金融营销、资管、风控等领域,面向金融消费者、金融机构和金融监管机构,改善金融 市场信息对称性并提升金融交易的效率和安全性。目前,金融行业各机构对于安全认证和客户身份识别的需求较为迫切,身份识别和智能客服应用和落…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中,一个新的领域——提示词工程(prompt engineering)——开始显露头角。 这个领域的核心在于精心设计输入,以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展,特别…

值类型和引用类型在使用和存储上的区别

使用上的区别 //值类型 int a 10; //引用类型 int[] arr new int[] { 1, 2, 3, 4, 5 };//声明了一个b让其等于之前的a int b a; //声明了一个arr2让其等于之前的arr int[] arr2 arr; Console.WriteLine("a{0},b{1}", a, b); Console.WriteLine("arr[0]{0},…

【JavaEE】Spring Boot 配置文件详解

一.配置文件的相关概念. 配置文件主要用于配置应用程序的行为和属性. Spring Boot的配置文件提供了一种灵活且强大的方式,用于管理应用程序的配置信息。很多项目或框架的配置信息也放在配置文件中: 项目的启动端口.数据库的连接信息(用户名/密码/驱动等的信息).第三…

AI图书推荐:这就是ChatGPT

这本书《这就是ChatGPT》(What Is ChatGPT Doing ... and Why Does It Work )由Stephen Wolfram撰写 全书内容概要如下: **引言与预备知识** - 作者首先表达了对ChatGPT技术突破的兴奋之情,指出这不仅是技术的故事,也是…

Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1)

3、Job工作机制源码解读 用之前wordcount案例进行源码阅读,debug断点打在Job任务提交时 提交任务前,建立客户单连接 如下图,可以看出,只有两个客户端提供者,一个是YarnClient,一个是LocalClient。 显然&a…

ChatTTS 文字生成语言本地模型部署

ChatTTS部署 官方信息 [ChatTTS首页](https://chattts.com/)搭建步骤 1、下载源码 git clone https://github.com/2noise/ChatTTS.git 2、按照环境 pip install torch ChatTTS pip install -r requirements.txt 3、下载模型 git clone https://www.modelscope.cn/pzc163/ch…

ssm610学生社团管理系统+vue【已测试】

前言:👩‍💻 计算机行业的同仁们,大家好!作为专注于Java领域多年的开发者,我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源: 👩‍💻 SpringBoot…

Hadoop3:MapReduce源码解读之Map阶段的数据输入过程整体概览(0)

一、MapReduce中数据流向 二、MapTask并行度 1、原理概览 数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapRed…

ctfshow解题,知识点学习

1.easy_zip(misc) 1)打开环境后是一个压缩包,解压里面有个flag.txt文件需要密码, 2)直接用工具爆破,即可找到密码 2.easy_eval 1)进入题目环境,先进行代码审计 首先说是…

「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》

大模型风潮已掀起,各大巨头争相入局,从ChatGPT到Sora,全球的AI应用“卷出了花”。然而,网络安全人员在享受AI技术带来的便捷之余,也不得不面对一系列新兴的安全挑战,无法忽视。 ⭐️ 赠书 - 图书简介 人…

RabbitMQ python第三方库pika应用入门实践

1. RabbitMQ简介 RabbitMQ是一个可靠、高效的开源消息代理服务器,基于AMQP协议。它具备以下特点: 可以支持多种消息协议,如AMQP、STOMP和MQTT等。提供了持久化、可靠性和灵活的路由等功能。支持消息的发布和订阅模式。具备高可用性和可扩展…