前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >​flash模拟eeprom存储日志的原理

​flash模拟eeprom存储日志的原理

作者头像
bigmagic
发布于 2021-03-09 07:24:34
发布于 2021-03-09 07:24:34
2.4K0
举报
文章被收录于专栏:嵌入式iot嵌入式iot

flash模拟eeprom存储日志的原理

  • 文章目的
  • 采用flash模拟eeprom的优点
  • 方案设计
  • 注意事项

文章目的

做mcu开发时,涉及到数据存储时,往往都会考虑使用flash、eeprom,或者铁电存储器。从数据储存的角度上来说,安全性最高的肯定是FRAM,接着才会考虑使用EEPROM,对于一般的数据储存,flash就足够了。考虑到一般的MCU都不会携带EEPROM,最简单的方案可以利用flash模拟出eeprom,并且实现基本的日志文件系统操作,下面来描述一下基本的原理。

采用flash模拟eeprom的优点

一般做mcu开发时,都会存储数据,如果有文件系统,可以写到文件中,但是一般不用文件系统时,则直接操作flash的读写。根据flash的操作特点,一方面是flash是只能从1变为0,不能从0写到1。只有当擦除一个页的时候,才能将该页上的数据从0变为1。以一个页为4K大小来计算,如果每次存几十个字节,并且多次重复操作,那么每次都需要擦除一个页之后再写数据。

假如用户数据是一连串的状态信息,每次都只会改变其中的一个状态,或者一个字节,那么每次操作都会将flash上所有的用户数据读到内存中,然后将内存中的数据的变化的状态位改变,然后再擦除page,接着再将内存中的数据写到flash的page上。

由于flash的读写寿命有限,在10w次左右,并且擦除page消耗的时间很长。所以上述方案存在缺陷,那么如何才能让flash像eeprom一样读写,而且操作也不用每次擦除flash呢?

方案设计

为了非常容易的将flash当作eeprom来使用,需要确保两个条件

1.读写的数据量至少小于1/2的flash的一个page数据量的大小

2.准备至少两个pages

然后就可以开始设计数据的搬运了。

每个page的数据结构可以按照上图所示进行设计。

首先每个pages的头部都会有一个标志,用于描述当前的pages的状态,其状态有未初始化、有效、无效。具体场景是,当未初始化时,由于flash的电气特性,其flags为0xff,此时需要初始化该page,往其标志位写有效即可。然后依次向下存放数据,此时由于知道每次写的数据量的大小,只需要确定其偏移量即可。

而这样也会带来一个问题,就是如何确保每次断电后再上电也能知道当前写数据的偏移?

要想解决这个问题,可以在每次上电的时候,遍历该page0,通过读取特定的用户数据的标志位来确保得到当前数据的偏移量,然后就可以记录在内存中,接着执行了。

当数据在一个page0中存满后,此时需要将数据转移到page1了。这个过程比较可以好好分解一下:

因为是日志型的数据类型,一定会存在数据被删除或者更新的情况,所以page0中会有两个同为index=0的用户数据。而且是最新的在后面。

一旦程序在pages上进行数据的写操作时,检查到剩余的pages空间不足则会将page0的状态设置成无效,接着开始将page1的flags设置为有效状态,同时开始将pages0中的数据转移到page1,注意在转移的时候,需要检查page0中的index,用最新的数据取代旧的数据。最后擦除page0即可。

依次按照上面的顺序进行数据的搬运即可实现日志型数据操作的存储。

注意事项

该方案的使用,在很多情况下都可以很好的操作,但是一旦用户数据量很大,接近1/2的page数据量时,频繁的擦写flash的问题也会存在。

随着page个数的增加,也可以减少擦除的次数,带来的问题是程序设计的更加复杂。

实际使用的过程中每个pages的flag标志不一定只有有效和无效的状态,比如在转移过程中,突然断电了,为了保证数据的不丢失,一定要考虑到每个page异常情况下的状态,并能够恢复数据。达到掉电安全状态。

有了这些后台管理机制,再写日志时,上层便可以直接使用读写函数进行操作,而不用管底层到底是flash还是eeprom。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何使用Flash模拟EEPROM
在使用Arduino开发时,有个内置库可以使用Flash模拟EEPROM,极大的方便了嵌入式数据存储的开发。
不脱发的程序猿
2024/01/14
6720
如何使用Flash模拟EEPROM
Flash如何模拟EEPROM
很多的MCU控制器不带有片上EEPROM,但是我们有时候鉴于成本的考虑又不想外扩EEPROM,所以经常用Flash来模拟EEPROM存储,但是Flash都是块擦除,所以需要考虑频繁擦除的影响,需要借鉴软件算法来综合考虑,最近经常在使用NXP的KE系片子,KE系列除过KE02带有256字节的片上EEPROM外,KE04和KE06都不带片上EEPROM,所以我们采用Flash来模拟。
用户1605515
2019/06/17
3K0
Flash如何模拟EEPROM
NAND Flash基础知识简介
NAND Flash是一种非易失存储介质(掉电后数据不会丢失),常见的U盘、TF卡/SD卡,以及大部分SSD(固态硬盘)都是由它组成的。 本文主要介绍其组成及工作原理。
coderhuo
2020/07/23
7.3K0
NAND Flash基础知识简介
全面理解SSD和NAND Flash
本文介绍了全面理解SSD和NAND Flash的重要性和评价标准,包括稳定性、性能、寿命等方面的指标。
Christal_R
2017/12/25
2.3K0
全面理解SSD和NAND Flash
AUTOSAR之FEE模块介绍
FEE(Flash EEPROM Emulation),即Flash模拟EEPROM。为什么要用Flash模拟EEPROM?下面我们来看下两者之间的区别。
xbai921031
2022/05/25
2.2K0
AUTOSAR之FEE模块介绍
EEPROM和flash这样讲,我早就懂了
https://blog.csdn.net/yuanlulu/article/details/6163106
MCU起航
2020/12/01
2.5K0
EEPROM和flash这样讲,我早就懂了
多次读取Flash/EEPROM会影响寿命吗?
多次读取不会像写入那样显著影响 Flash/EEPROM 的寿命,因为 Flash 和 EEPROM 是非易失性存储器(NVM),设计上是为了在断电后保存数据。
不脱发的程序猿
2024/11/23
5120
多次读取Flash/EEPROM会影响寿命吗?
基于stm32f103ze hal库的内部flash磨损均衡算法的实现与测试
stm32f103ze是大容量的芯片,每个page2k字节,每次至少写2字节,即2*n字节数量,通常情况下,写入数据都是1->0,而不能0->1,因为这个是flash的特性决定的,如果是0->1的操作,那么必须要整个page擦除,这个和eeprom是不一样的, eeprom是可以按字节进行读写的,当然容量没有flash大,因此各有利弊。
用户4645519
2022/05/09
1.2K0
什么,恩智浦的flash模拟EEP是这么玩的?
本篇笔记主要记录基于恩智浦MPC5744P的Flash模拟EEPROM存储参数和数据的算法,对官方给出的方案深入学习,并可以添加一些扩展内容。
用户1605515
2022/01/11
1.2K0
什么,恩智浦的flash模拟EEP是这么玩的?
可计算存储: 透明压缩,数据库IO模型和SSD寿命
1990诞生的 Andy and Bill‘Law 依然有效,伴着随着数据量的指数级增长,在数据存储和处理领域愈演愈烈。“在未来的10年中,企业的变化会超过它在过去50年中的总变化。”这是比尔盖茨在1999年著作《未来时速》中的文字。我们很难逐一列举所有的关键变化,但在存储领域也遵循这个预测。比如最近一直提到的华为天才少年,张霁研究磁盘和数据库相关的智能优化,姚婷研究新型存储介质和键值存储系统,左鹏飞研究非易失性内存系统,都与存储领域有直接关系,似乎也说明存储领域的变化还在不断发生。
用户1278550
2020/09/21
1.7K0
可计算存储: 透明压缩,数据库IO模型和SSD寿命
【STM32H7教程】第71章 STM32H7的内部Flash应用之模拟EEPROM
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第71章       STM32H7的内部Flash应用之模拟EEPR
Simon223
2020/03/11
2.2K0
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
SPI总线: STM32本身支持SPI硬件时序,本文示例代码里同时采用模拟时序和硬件时序两种方式读写W25Q64。
DS小龙哥
2022/01/12
4.1K0
STM32入门开发: 介绍SPI总线、读写W25Q64(FLASH)(硬件+模拟时序)
聊聊基于Flash芯片的SSD的问题
基于Flash的SSD 基于Flash芯片的SSD中从整体到局部的分层为Nand Flash => Chip => Plane => Block => Page几个层次。其中Block是Nand Flash擦除的最小单位;Page是读写操作的基本单位 Erase Before OverWrite问题 基于Flash芯片的SSD往某个block写数据的过程中,不论原来的Block是什么,必须先擦除(Erase)整个Block为1,然后在往这个Block写入新数据,这个擦除操作增加了覆盖写的开销
用户4700054
2022/08/17
7410
聊聊基于Flash芯片的SSD的问题
文件碎片对Flash性能的影响
阅读本文前,建议先阅读下这两篇文章:《NAND Flash基础知识简介》、《Flash写入性能下降问题》。
coderhuo
2020/07/24
1.5K0
文件碎片对Flash性能的影响
STM8S——Flash program memory and data EEPROM
Christal_R
2017/12/25
2K0
STM8S——Flash program memory and data EEPROM
NAND FLASH 和NOR FLASH的区别
Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。
杨源鑫
2019/07/04
3.1K0
STM32通信模拟SPI
SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双工同步串行通信接口,它用于MCU与各种外围设备以串行方式进行通信以交换信息,通信速度最高可达25MHz以上。
韦东山
2022/05/09
1.5K0
STM32通信模拟SPI
ESP8266_08基于flash的数据掉电保护
确实很像,但不是!以STM32为例,片上是没有EEPROM的。但是,可以把一部分ROM当做EEPROM,通过程序进行擦写,最终实现的效果和EEPROM几乎是一样的。
MCU起航
2020/06/29
1.5K0
Tina Linux 存储开发指南
介绍TinaLinux Flash,分区,文件系统等存储相关信息,指导方案的开发定制。
韦东山
2023/02/25
3.1K0
存储器基础扫盲
今天和大家浅谈一下存储器相关基础知识,如图1所示我做的一个脑图分类,我们按照这个分类逐一讲解。
工程师说硬件
2022/07/29
1.8K0
存储器基础扫盲
推荐阅读
相关推荐
如何使用Flash模拟EEPROM
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档