专栏首页嵌入式iot​flash模拟eeprom存储日志的原理

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

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。

本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT),作者:bigmagic

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flash如何模拟EEPROM

    很多的MCU控制器不带有片上EEPROM,但是我们有时候鉴于成本的考虑又不想外扩EEPROM,所以经常用Flash来模拟EEPROM存储,但是Flash都是块擦...

    用户1605515
  • ESPcopter无人机源码分析.1

    PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模...

    云深无际
  • 【STM32H7教程】第71章 STM32H7的内部Flash应用之模拟EEPROM

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

    armfly
  • 关于MCU产品开发参数存储的几种方案(开源项目持续收集整理中)

    在工作中,凡是涉及到产品开发几乎都会实现参数存储功能,一般参数存储会采用如下的存储介质进行,如:eeprom、spi flash、nand flash、SD卡等...

    morixinguan
  • STM8S——Flash program memory and data EEPROM

    1、简介   STM8S内部的FLASH程序存储器和数据EEPROM是由一组通用寄存器来控制的;所以我们可以通过这些通用寄存器来编程或擦除存储器的内容、设置写保...

    Christal_R
  • Arduino+Avr libc制作Badusb原理及示例讲解 | 长文含视频

    一、 前言 2014年美国黑帽大会上研究人员JakobLell和Karsten Nohl展示了badusb的攻击方法后,国内与badusb相关的文章虽然有...

    FB客服
  • ROM与RAM的区别

    ROM、PROM、EPROM、EEPROM、NAND flash、NOR flash

    Jasonangel
  • 学习嵌入式之前,这些概念要搞清~

    ROM(Read Only Memory)和RAM(Random Access Memory)指的都是半导体存储器,ROM在系统停止供电的时候仍然可以保持数据,...

    韦东山
  • STM32F0单片机快速入门九 用 I2C HAL 库读写24C02

    24C02 现在基本是开发板的标配,对于需要掉电存储的应用来说确是不二选择。现在单片机因为内部集成了Flash存储器,一般也都支持数据的掉电保存,但相对于 24...

    用户2366192

扫码关注云+社区

领取腾讯云代金券