【升级】嵌入式Flash闪存库EasyFlash,可以直接保存日志了

2019-12-14 12:52发布

EasyFlash 是一款开源的轻量级嵌入式Flash存储器库,主要为MCU(Micro Control Unit)提供便捷、通用的上层应用接口,使得开发者更加高效实现基于的Flash存储器常见应用开发。该库目前提供 三大实用功能
  • Env 让变量轻松实现掉电保存,支持 写平衡 模式,无需担心变量长度、磨损平衡等问题
使用 键值对(key-value) 方式将变量存储到Flash中。在产品上,能够更加简捷的实现 设定参数运行日志等信息掉电保存的功能。
  • IAP 在线升级再也不是难事儿
该库封装了IAP(In-Application Programming)功能常用的接口,支持CRC32校验,同时支持Bootloader及Application的升级。
  • (新增)Log 无需文件系统,日志可直接存储在Flash上
非常适合应用在小型的不带文件系统的产品中。同时配合EasyLogger(我开源的超轻量级、高性能C日志库,它提供与EasyFlash的无缝接口)一起使用,轻松实现日志的Flash存储功能。
更多详细介绍,点击:https://github.com/armink/EasyFlash
原帖:http://www.amobbs.com/thread-5613261-1-1.html

更新日志
V1.06.10
  • 新增 Flash存储日志功能,无需文件系统的支持;
  • 删除 用户以前需要自定义的types.h头文件,全部采用C99自带头文件,降低移植复杂度;
  • 增加 C++ 编译器的支持;
  • 增加 环境变量同步锁,提升库在并发量较大的环境下的稳定性;
  • 修复 部分bug;


下载方式
Github:https://github.com/armink/EasyFlash
本坛下载: EasyFlash-V1.06.10.zip (6.9 MB, 下载次数: 344) 2015-6-10 19:18 上传 点击文件名下载附件
EasyFlash-V1.06.10



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
sunnydragon
1楼-- · 2019-12-27 00:11
qq302011 发表于 2015-9-21 11:12
但是我的可用的FLASH地址 在  0x08004000------0x0800bfff之间的一段,应该怎么做?
并不是通常的 最后几 ...

那就把起始地址设置为:0x08004000,flash擦写最小单位为:16K

务必要保证Demo在自己的板子上运行起来,然后看懂文档,不懂的再跟帖。
qq302011
2楼-- · 2019-12-27 01:27
sunnydragon 发表于 2015-9-21 13:51
那就把起始地址设置为:0x08004000,flash擦写最小单位为:16K

务必要保证Demo在自己的板子上运行起来, ...

换了新的EASYFLASH成功写入,但是不敢确定是否会超过这个地址范围,不知道怎么测试这玩意,这两个版本相差太大了,重新移植一遍,还是挺麻烦的,对了有需要的兄弟可以参考,我在FREERTOS上的移植源码
sunnydragon
3楼-- · 2019-12-27 02:35
 精彩回答 2  元偷偷看……
qq302011
4楼-- · 2019-12-27 03:32
sunnydragon 发表于 2015-9-21 18:11
1、恭喜~已经入门EasyFlash了,EasyFlash还有更多实用的功能有待你去挖掘。感谢你的FreeRTOS的移植分享。 ...

2、擦写平衡模式:3*EF_ERASE_MIN_SIZE(它将会有2个Flash扇区去存储环境变量,按照每个Flash扇区可被擦写10W次计算,那么当前配置至少可擦写20W次);
感觉楼主这个磨损平衡有点蛋疼,我的理解如下:
  1.必须要2块以上的SECTOR
  2.大概是这两个SECTOR交替写,写一次就要擦除一次二不管这个环境变量区域有多大。
  3.因此可以计算出最多可保存次数 就是 SECTOR个数*10W,注意有的FLASH只能保证擦写1W次则还要降低十倍
能不能这样做呢?、

不是写一次就要擦除一次FLASH,而是跟着FLASH后面继续写
  1.在整个环境变量结构体中头部 保留一个头部判断变量,start_flag=0xa5a5a5a5,有效数据判断变量为valid_flag=0XFFFFFFFF,则存入的数据格式表示如下
假设整个要存入的数据大小为size,
{
  0xa5a5a5a5,//开头标记
  0XFFFFFFFF,//数据有效标记
size, // 整个数据大小
xxxxxxxxxx, //其他的包头数据
。。。。。。。。。
sssssssssss,//环境变量
ssssssssss, //环境变量
sssssssssssssssssss//环境变量
。。。。。。。。。
ssssssssss//环境变量
ssssssss//环境变量
。。。。。。。。。。
0xa6a6a6a6,//末尾结束标记
}

  2.当下次再次保存环境变量的时候,将上一次的valid_flag数据设置为其他数据即可,代表上一次的环境变量木有用了,然后在后面存入本次要保存的数据结构即可

3.考虑到再次上电需要读取环境变量的时候,需要查找有效的查找到最后一次保存的数据,则从第一个0xa5a5a5a5找过去找到无效存储的size,指针一段一段的跳,几下就找到最后的写入位置了,因此也很快
  
罗里吧嗦写了这么多,不知道说清楚没,希望能对楼主有所帮助
sunnydragon
5楼-- · 2019-12-27 06:04
qq302011 发表于 2015-9-21 21:44
2、擦写平衡模式:3*EF_ERASE_MIN_SIZE(它将会有2个Flash扇区去存储环境变量,按照每个Flash扇区可被擦 ...

我的磨损平衡策略不是你想的那样,你可以看下这部分源码:https://github.com/armink/EasyFl ... _env_wl.c#L719-L812  。另外,你写那个方法应该是“在擦除最小单位比环境变量大很多的Flash上,可以在保存时自动在后面追加,扇区写满后,再擦除。”吧,如果是这个有在我计划内的,属于以后的优化方向。
vjcmain
6楼-- · 2019-12-27 11:46
sunnydragon 发表于 2015-8-10 08:17
1、保存为字符串主要是为了方便各种类型无损互转。目前我正在设计一个EasyFlash的类型自动转换插件,还支 ...


ymodem.h请问哪里有呀。我技术菜啊IAP跑不起来楼主。

一周热门 更多>