1、介绍(English)
提示 :从 EasyFlash V4.1 后,基于 EasyFlash 全新设计开发的 FlashDB 开源项目正式上线,新集成了时序数据库、多分区管理,多数据库实例等功能,也从一定程度上提升了整体性能,欢迎关注:https://github.com/armink/FlashDB 。同时,现有的 EasyFlash 也会继续维护。
EasyFlash是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发。非常适合智能家居、可穿戴、工控、医疗、物联网等需要断电存储功能的产品,资源占用极低,支持各种 MCU 片上存储器。该库主要包括 三大实用功能 :
- ENV 快速保存产品参数,支持 写平衡(磨损平衡) 及 掉电保护 功能
EasyFlash不仅能够实现对产品的 设定参数 或 运行日志 等信息的掉电保存功能,还封装了简洁的 增加、删除、修改及查询 方法, 降低了开发者对产品参数的处理难度,也保证了产品在后期升级时拥有更好的扩展性。让Flash变为NoSQL(非关系型数据库)模型的小型键值(Key-Value)存储数据库。
- IAP 在线升级再也不是难事儿
该库封装了IAP(In-Application Programming)功能常用的接口,支持CRC32校验,同时支持Bootloader及Application的升级。
- Log 无需文件系统,日志可直接存储在Flash上
非常适合应用在小型的不带文件系统的产品中,方便开发人员快速定位、查找系统发生崩溃或死机的原因。同时配合EasyLogger(我开源的超轻量级、高性能C日志库,它提供与EasyFlash的无缝接口)一起使用,轻松实现C日志的Flash存储功能。
目前 ENV 功能有两种主要模式,一种为 V4.0 带来的 NG 模式,还有一种为延续 V3.0 的 legacy 模式
对应源码文件为:
ef_env.c
自 2019 年春节后,EasyFlash 经过 4 年多的迭代,结合众多开发者的需求及建议,终于发布了 V4.0 版本,该版本中的 ENV 功能被命名为 NG (Next Generation) 模式,这是一个完全重构的新版本,具有以下新特性:
- 更小的资源占用,内存占用 几乎为 0 ;(V4.0 以前版本会使用额外的 RAM 空间进行缓存)
- ENV 的值类型支持 任意类型 、任意长度,相当于直接 memcpy 变量至 flash ;(V4.0 之前只支持存储字符串)
- ENV 操作效率比以前的模式高,充分利用剩余空闲区域,擦除次数及操作时间显著降低;
- 原生支持 磨损平衡、掉电保护功能 (V4.0 之前需要占用额外的 Flash 扇区);
- ENV 支持 增量升级 ,固件升级后 ENV 也支持升级;
- 支持大数据存储模式,长度无限制,数据可在多个 Flash 扇区上顺序存储。像脚本程序、音频等占用 Flash 超过 1 个扇区的资源也都可以存入 ENV(即将在 V4.2 支持);
- 支持 数据加密 ,提升存储的安全性,物联网时代的必备功能(即将在 V4.3 支持);
- 支持 数据压缩 ,减低 Flash 占用(即将在 V4.4 支持);
V4.0 设计及内部原理,V4.0 迁移指南等更多内容请继续阅读下面的 文档章节
注意 :个别 Flash 存在无法逆序写入的问题,例如 STM32L4 片内 Flash,所以无法使用 NG 模式,这种情况下建议使用 V3.0 的 legacy 模式
对应源码文件为:
ef_env_legacy.c
及ef_env_legacy_wl.c
legacy 模式也具有磨损平衡及掉电保护功能,相比于 V 4.0 NG 模式,使用 legacy 模式,需要有额外的 RAM 空间来临时缓存每个 ENV ,最终调用 save 接口,统一擦除扇区再存储到 Flash 上。
V4.0 NG 模式 | V3.0 legacy 模式 | |
---|---|---|
RAM 资源占用 | 低 | 高 |
支持 Flash 全面性 | 个别 Flash 受限:例如 STM32L4 片内 | 比较全面 |
是否需要 GC 垃圾回收 | 需要 GC ,这会导致触发 GC 时,写入速度变慢 | 不需要 |
value 类型限制 | 无限制 | 对字符串类型支持的比较好 |
掉电保护 | 支持 | 支持 |
磨损平衡 | 支持 | 支持 |
增量升级 | 支持 | 支持 |
最低要求: ROM: 6K bytes RAM: 0.1K bytes