搜索
bottom↓
回复: 235

【开源】嵌入式闪存库 EasyFlash for STM32,支持Env和IAP

  [复制链接]

出0入198汤圆

发表于 2015-1-25 11:42:22 | 显示全部楼层 |阅读模式
本帖最后由 sunnydragon 于 2015-1-25 11:41 编辑

1、介绍
EasyFlash是一款开源的轻量级嵌入式Flash存储器库,主要为MCU(Micro Control Unit)提供便捷、通用的上层应用接口,使得开发者更加高效实现基于的Flash存储器常见应用开发。该库目前提供 两大实用功能
  • Env 让变量轻轻松松实现掉电保存,无需担心变量长度、对其等问题
    使用 键值对(key-value) 方式将变量存储到Flash中,类似U-Boot的 环境变量 ,使用方式与U-Boot一致。
  • IAP 在线升级再也不是难事儿
    该库封装了IAP(In-Application Programming)功能常用的接口,支持CRC32校验,同时支持Bootloader及Application的升级

1.1、文件结构
源文件 描述
\flash\src\flash_env.c Env(环境变量)相关操作接口及实现源码
\flash\src\flash_iap.c IAP(在线升级)相关操作接口及实现源码
\flash\src\flash_utils.c EasyFlash常用小工具,例如:CRC32
\flash\src\flash.c 目前只包含EasyFlash初始化方法
\flash\port\flash_port.c 不同平台下的EasyFlash移植接口及配置参数
\demo\stm32f10x stm32f10x平台下的demo

1.2、资源占用

最低要求: ROM: 6K bytes     RAM: 0.5K bytes + (Env大小)


Demo平台:STM32F103RET6 + RT-Thread 1.2.2 + Env(2K bytes)

实际占用: ROM: 6K bytes     RAM: 2.6K bytes


1.3、支持平台

目前已移植平台只有 STM32F10X 系列的片内Flash,这个也是笔者产品使用的平台。其余平台的移植难度不大,在项目的设计之初就有考虑针对所有平台的适配性问题(64位除外),所以对所有移植接口都有做预留。移植只需修改 \flash\port\flash_port.c 一个文件,实现里面的擦、写、读及打印功能即可。

欢迎大家 fork and pull request 。开源软件的成功离不开所有人的努力,也希望该项目能够帮助大家降低开发周期,让产品更早的获得成功


2、流程
2.1、环境变量
下图为人工通过控制台来调用环境变量的常用接口,演示了环境变量 "temp"从创建到保存,再修改,最后删除的过程。这些接口都支持被应用层直接调用。


2.2、在线升级

下图演示了通过控制台来进行IAP升级软件的过程,使用的是库中自带的IAP功能接口,演示采用的是串口+Ymodem协议的方式。你还也可以实现通过CAN、485、以太网等总线,来实现远程网络更新。


3、下载

Github : https://github.com/armink/EasyFlash

开源中国 : http://git.oschina.net/armink/EasyFlash
本坛下载:





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入198汤圆

 楼主| 发表于 2015-1-25 13:16:21 | 显示全部楼层
dswkl11 发表于 2015-1-25 13:00
可以用于spi flash 不?

支持的哦~实现\flash\port\flash_port.c中的几个移植接口即可

出0入198汤圆

 楼主| 发表于 2015-1-25 13:18:45 | 显示全部楼层
styleno1 发表于 2015-1-25 13:14
不错的想法,请问是开发团队是谁?

我自己设计开源的~

出0入198汤圆

 楼主| 发表于 2015-1-25 20:22:38 | 显示全部楼层
soosqt 发表于 2015-1-25 11:50
有没有写平衡之类的功能?

写平衡目前还没有,因为我的项目擦写次数非常少,如果大家都对这个需求很高,后期我可以加入这个功能。

出0入198汤圆

 楼主| 发表于 2015-1-25 20:23:41 | 显示全部楼层
huchunlei 发表于 2015-1-25 13:44
请问下 用于  spi flash  的时候, 有没有写平衡的功能呢?  最近比较纠结, 有个项目,要保存大量数据,  ...

写平衡目前还没有,因为我的项目擦写次数非常少,如果大家都对这个需求很高,后期我可以加入这个功能。

出0入198汤圆

 楼主| 发表于 2015-1-25 22:14:08 | 显示全部楼层
需要写平衡功能的坛友们,可以再后面跟帖+1,我会根据大家的需求程度来考虑是否增加这个功能。

出0入198汤圆

 楼主| 发表于 2015-1-25 22:35:05 | 显示全部楼层
airwolf09921 发表于 2015-1-25 22:29
谢谢楼主 学习学习 顺便弱弱的请教一下啥叫写平衡

由于flash在写操作之前需要擦除整块且使用寿命有限,所以需要设计合理的“写平衡”机制,来保证数据被安全的保存在未到擦写寿命的Flash区中。常用的JFFS, YAFFS文件系统都有这样的机制。

出0入198汤圆

 楼主| 发表于 2015-1-26 08:19:19 | 显示全部楼层
richards 发表于 2015-1-26 00:11
这个一定得试试 比自己做的应该更规范吧

欢迎试用及反馈哦~可以在github上watch这个项目,这样就能知道随时知道项目新进展。

出0入198汤圆

 楼主| 发表于 2015-1-26 10:14:54 | 显示全部楼层
本帖最后由 sunnydragon 于 2015-1-26 10:17 编辑


不分系统的,我只不过用了rt-thread的printf打印功能

出0入198汤圆

 楼主| 发表于 2015-1-26 21:04:07 | 显示全部楼层
ghostxdy 发表于 2015-1-26 16:43
这个很棒!对NAND有优化吗?

目前主要功能还是以Env及IAP为主,是个非常轻量级的库。对NAND优化还没有考虑,优化的事情文件系统都做好啦~

出0入198汤圆

 楼主| 发表于 2015-1-27 08:10:05 | 显示全部楼层
brieve 发表于 2015-1-27 01:42
这个库要是稳定和支持广泛的画,还是很有用的。

稳定是我最主要的任务~由于我的产品只有使用STM32平台的,别的平台需要大家一起来努力哈,我会大家提供所有力所能及的帮助~

出0入198汤圆

 楼主| 发表于 2015-1-28 08:25:01 | 显示全部楼层
xiaoliusheng 发表于 2015-1-27 23:34
软件分层结构不好弄...


具体哪个地方不好处理?

出0入198汤圆

 楼主| 发表于 2015-1-28 19:22:26 | 显示全部楼层
今天刚刚更新了API说明文档,欢迎大家去Github或开源中国上去查看。

出0入198汤圆

 楼主| 发表于 2015-1-28 21:34:58 | 显示全部楼层
foxpro2005 发表于 2015-1-28 19:55
不错,非常感谢楼主开源分享,  给你点+1024个赞, 之前看过你改写的Freemodbus主/从机协议栈, 都很不错。 ...

过奖哈~欢迎watch并使用github上的项目,分享你的使用感受及建议哈

出0入198汤圆

 楼主| 发表于 2015-1-28 22:25:24 | 显示全部楼层

好用的话记得在Github上给星星哦~

出0入198汤圆

 楼主| 发表于 2015-1-29 21:02:01 | 显示全部楼层
zjwzcn 发表于 2015-1-29 15:46
CAN、485、以太网一样的操作?!

大同小异,Demo演示的串口使用Ymodem协议发送,485、CAN等总线需要自定义协议。我的产品上都是用的这个哈~

出0入198汤圆

 楼主| 发表于 2015-2-3 20:21:51 | 显示全部楼层
pdabug 发表于 2015-2-1 21:55
这个真不错,不知道稳定性如何

已经用在我的很多产品上了,你试试哈~

出0入198汤圆

 楼主| 发表于 2015-2-3 20:22:58 | 显示全部楼层
tang0571 发表于 2015-2-3 14:32
恩,不错,有模有样的!

欢迎试用哈~不只是支持STM32。

出0入198汤圆

 楼主| 发表于 2015-2-6 14:20:40 | 显示全部楼层
dmzy 发表于 2015-2-3 22:32
很好,我现在stm32上试试

多谢支持。直接使用Demo中的工程就行的,同时支持IAR及Keil两个IDE

出0入198汤圆

 楼主| 发表于 2015-2-11 11:15:39 | 显示全部楼层
最新的API文档在这里 http://armink.github.io/EasyFlash/ ,大家在使用的时候可以看下

出0入198汤圆

 楼主| 发表于 2015-2-11 16:41:50 | 显示全部楼层
yaoyyie2003 发表于 2015-2-11 14:20
楼主的例程应该出个最精简的,去掉RTT

亲,用RTT最主要是用它的控制台功能,模拟类似Uboot命令行环境,这样用户好上手体验并测试。
库本身和RTT是没有关系的。

出0入198汤圆

 楼主| 发表于 2015-2-11 17:30:02 | 显示全部楼层
yaoyyie2003 发表于 2015-2-11 17:10
搞在一起的话读代码有点困难,知道是好东西,就是没法上手,不想去研究RTT。多谢楼主的贡献,我会继续学 ...

恩~说的也是。最近在设计让库支持写平衡模式。等忙完了可以考虑在Demo中再增加个裸机版本。
你有没有兴趣搞搞裸机版本呢?我可以协助你做出来。再推送到github上去,方便大家。

出0入198汤圆

 楼主| 发表于 2015-2-11 18:15:52 | 显示全部楼层
多谢支持,大家的支持是我坚持维护的动力。

出0入198汤圆

 楼主| 发表于 2015-2-11 21:04:38 | 显示全部楼层

OK。签名里有我的联系方式,你方便的时候可以跟我联系下哈~

出0入198汤圆

 楼主| 发表于 2015-2-12 21:54:16 | 显示全部楼层
huchunlei 发表于 2015-1-25 13:44
请问下 用于  spi flash  的时候, 有没有写平衡的功能呢?  最近比较纠结, 有个项目,要保存大量数据,  ...

好消息,“写平衡”已经增加上去了,目前环境变量支持两种模式,默认是常规模式,欢迎下载试用并反馈哦。可以通过以下方式获取最新源码。
Github: https://github.com/armink/EasyFlash
OsChina: http://git.oschina.net/armink/EasyFlash
Coding: https://coding.net/u/armink/p/EasyFlash/git

出0入198汤圆

 楼主| 发表于 2015-2-12 21:58:55 | 显示全部楼层
好消息,看到这么多网友需要“写平衡”,现在“写平衡”已经增加上去了,是一种比较简洁的实现思路。
目前环境变量支持两种模式,默认是常规模式,欢迎大家下载试用并反馈哦。可以通过以下方式获取最新源码。
github : https://github.com/armink/EasyFlash
oschina: http://git.oschina.net/armink/EasyFlash
coding : https://coding.net/u/armink/p/EasyFlash/git

出0入198汤圆

 楼主| 发表于 2015-2-13 10:40:03 | 显示全部楼层
guolun 发表于 2015-2-13 09:36
非常感谢你的奉献。我在做一个产品,用STM32F103R8T6,裸机前后台系统。可以用吗? ...

可以的,不需要依赖任何操作系统和mcu

出0入198汤圆

 楼主| 发表于 2015-2-13 10:41:18 | 显示全部楼层
jm2011 发表于 2015-2-13 10:12
建议把文档放在doc目录下

好的,后期逐步完善的,包括文档国际化。

出0入198汤圆

 楼主| 发表于 2015-3-1 13:16:39 | 显示全部楼层
Ourstory 发表于 2015-2-27 10:59
如果stm32开启了读保护(会强制把flash前4k写保护)。bl还能升级吗。实际产品中基本都会开启读保护的,bl升 ...

不明白你说的“Bootloader升级”指的是是升级APP还是自己

出0入198汤圆

 楼主| 发表于 2015-3-1 14:29:25 | 显示全部楼层
Ourstory 发表于 2015-3-1 13:31
bl自己升级。不知是否有好办法

对于STM32没有测试过,但升级Bootloader对于其余MCU应该可以实现的。
如果正如你所说“会强制把flash前4k写保护”,那么可以把负责业务处理的Bootloader放到4K位置之后,Flash前4K只存放跳转到Bootloader的代码。

出0入198汤圆

 楼主| 发表于 2015-3-11 13:44:19 | 显示全部楼层
liujinhan 发表于 2015-2-28 09:38
MARK 备用!

谢谢分享,辛苦了LZ.

最近又做了些优化,欢迎试用并分享感受哈。

出0入198汤圆

 楼主| 发表于 2015-3-19 20:11:43 | 显示全部楼层
yxylxj 发表于 2015-3-14 11:54
IAP的 演示程序有吗?好像这有evn的呢?

IAP的那个演示Demo截图是我即将开源的另外一个Bootloader项目EasyBoot,这个项目是基于EasyFlash,所以我先开源了EasyFlash。
近期会发布EasyBoot的,请及时关注我的Github或论坛动态。

出0入198汤圆

 楼主| 发表于 2015-3-19 20:12:46 | 显示全部楼层
XIUQIN 发表于 2015-3-14 17:14
你好!我看了半天你写的程序,在平衡写里只是通过键值改写单个的变量。而批量写的函数“FlashErrCode flash ...

有做写平衡处理的,你看的是Github上的最新源码吗?

出0入198汤圆

 楼主| 发表于 2015-3-19 20:13:22 | 显示全部楼层

写平衡功能已经加上去了,欢迎试用~

出0入198汤圆

 楼主| 发表于 2015-3-23 09:56:10 | 显示全部楼层
fshunj 发表于 2015-3-20 00:10
楼主,请问在写flash的过程中掉电,下次开机怎么处理坏块?

如果是在断电的过程中产生的坏块,那重新上电的时候只会把默认的坏境变量写入的正常的扇区。目前软件上还没有掉电保护机制。

出0入198汤圆

 楼主| 发表于 2015-3-23 09:57:34 | 显示全部楼层
XIUQIN 发表于 2015-3-20 08:29
是的,我的目的是:需要多次循环储存一个个数组,每个数组2000个字节的数据。在前辈的平衡写文件里,我只 ...

在 FlashErrCode flash_save_env(void)方法中,平时环境变量是存在RAM中的

出0入198汤圆

 楼主| 发表于 2015-3-27 11:09:29 | 显示全部楼层
XIUQIN 发表于 2015-3-23 14:34
谢谢!研究中........

记得你之前用过我开源的FreeModbus主机软件。EasyFlash就是为了配合Modbus来保存远程保存设备的运行参数而设计开发的。多多反馈建议哈~

出0入198汤圆

 楼主| 发表于 2015-3-27 11:10:32 | 显示全部楼层
fshunj 发表于 2015-3-23 16:46
最好弄 掉电保护,例如有一份 最新的副本什么的

好的~我评估下,必要时,后期可以加入这个选项。

出0入198汤圆

 楼主| 发表于 2015-3-27 11:14:02 | 显示全部楼层
sblpp 发表于 2015-3-23 17:19
顶楼主,希望能支持更多的器件,如K64F。谢谢了。

我的重心会集中关注软件的核心框架稳定性上,毕竟精力有限,其余平台的支持也需要大家来一起努力,移植非常简单,我会随时来协助大家解决出现的问题。

出0入198汤圆

 楼主| 发表于 2015-3-27 11:15:21 | 显示全部楼层
soos 发表于 2015-3-24 09:07
掉电机制也很重要,期待加上去

好的啊,已经有两个网友对这个功能有需求了,后面还有需要的网友可以跟帖+1,大家的支持是我坚持开源的动力。

出0入198汤圆

 楼主| 发表于 2015-3-31 08:21:08 | 显示全部楼层
XIUQIN 发表于 2015-3-27 11:30
是的,感觉那个写的很好很规范!自从上次修过那个BUG后很稳定。谢谢前辈,从你这学到很多。内力还不够, ...

首先要定义下数组中元素的名称例如"name",再使用flash_set_env方法给这个元素赋值,这个值是字符串类型,如果整形数组则需要用整形转字符串,最后使用flash_save_env将修改后的环境变量保存到Flash中。
更多细节参考说明文档,那个Gif动画也描述的很清楚。

出0入198汤圆

 楼主| 发表于 2015-4-24 21:26:34 | 显示全部楼层
truefriend 发表于 2015-4-23 21:39
这个确实不错,楼主,其读写效率和文件系统比起来差异有多大?

这个是直接操作Flash,不知道你说的读写效率是从哪个方面进行对比。

出0入198汤圆

 楼主| 发表于 2015-4-25 07:54:08 | 显示全部楼层
散吧散吧 发表于 2015-4-25 00:42
请教一个不是那么主要的事情,楼主您的动态gif图片是使用什么软件制作的,感觉十分厉害? ...

用FSCapture截的图,用Ulead GIF Animator 5做的Gif

出0入198汤圆

 楼主| 发表于 2015-5-13 12:04:08 | 显示全部楼层
videofun 发表于 2015-5-13 00:05
感谢分享,有空移植适用于一下。

http://www.amobbs.com/thread-5620936-1-1.html 这个是较新的版本,建议用最新版本移植

出0入198汤圆

 楼主| 发表于 2015-5-15 21:21:16 | 显示全部楼层
qiushui_007 发表于 2015-5-14 05:15
相当于简化版的u-boot吧

ENV功能是相当于简化版的Uboot

出0入198汤圆

 楼主| 发表于 2015-7-3 15:29:00 | 显示全部楼层

这个功能现在正在测试。建议及时关注Github上的动态。

出0入198汤圆

 楼主| 发表于 2015-7-3 15:42:24 | 显示全部楼层
最近写了一篇《如何在嵌入式产品中应用键值存储数据库》:http://geek.csdn.net/news/detail/35184,里面有一些EasyFlash的使用场景。欢迎大家拍砖。

出0入198汤圆

 楼主| 发表于 2015-9-13 20:03:24 | 显示全部楼层
changxiaoqing11 发表于 2015-9-13 16:07
楼主,在https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32看到一个modbus主站,这个可以用吗 ...

这个项目已经开源很久了,挺成熟的,你放心用吧。ucos的移植之前是别的热心网友做的,你留下邮箱,我邮件发给你。

出0入198汤圆

 楼主| 发表于 2015-10-29 16:03:44 | 显示全部楼层
RAMILE 发表于 2015-10-29 11:14
求教一个使用方法:

我要保存一个工艺参数,参数有很多个数值,我想搞成下面那样的,我想问一下这个数值 ...

放心用吧,这个长度是没有限制的,只要你的环境变量分区有足够的容量

出0入198汤圆

 楼主| 发表于 2015-10-29 21:35:46 | 显示全部楼层
RAMILE 发表于 2015-10-29 16:04
好的,谢谢了,刚才我已经测试没问题

    line = ef_get_env("pf1");            /*  */   

客气~没有问题就好。

另外,strtok会改变源字符串,这里不建议使用,因为这里返回的是环境变量缓冲区中数据地址,所以如果此时再调用保存环境变量方法,会导致环境变量被意外修改。

出0入198汤圆

 楼主| 发表于 2016-6-1 21:20:38 | 显示全部楼层
单飞 发表于 2016-6-1 09:20
昨天用demo试了一下Env,感觉这不是一种高效的存储变量的方式。首先我理解的key和value,key是索引以字符的 ...

1、对齐方式跟你理解的很像,不过是 "key=value" 合在一起进行4字节对齐存储。

2、你说的这个资源占用过高的问题确实存在,EasyFlash 的 Env 功能设计之初的场景是在面向参数存储,产品的参数不像记录,往往比较少,所以使用 字符串 存储的方式,会大大提高 value 各类型的存储时兼容性,所以目前大数据量的可修改记录或参数是不建议使用 EasyFlash 来做。

3、跟你说的一样,降低资源占用,支持大数据确实是 EasyFlash 未来的发展方向。不过最近业余的精力一直在做一款通用的 串行 Flash 驱动的库,做好后,再用到 EasyFlash 上能大大降低其使用门槛。对于 EasyFlash 发展也希望大家都能共同参与,如果有兴趣可以联系我,Q:383016632

出0入198汤圆

 楼主| 发表于 2016-7-27 08:34:14 | 显示全部楼层
myxiaonia 发表于 2016-7-27 00:28
还有楼主的大作有没有支持大数组压缩的功能,我有个90k大的数组,70%以上都是0,而且还基本都是连续的 ...

目前不支持增量更新功能,不对对于 EasyFlash 接下来的开发方向,我是有打算再重新开发一种轻量级的模式来降低环境变量过多时,占用 RAM 过大的问题。该模式就支持你要的增量更新功能及数据压缩功能,对于增量更新还支持动态增量更新(软件运行过程中动态更新)及静态增量更新(开机初始化时,与默认环境变量对比,需要更新时进行更新)两种方式,压缩的 C 库我都选好了,就用 QuickLZ 。之前也做过一些设计工作,就是开发工作,我估计年底前能完成就很不错了,下半年还有一些更实用的、大家需求量更大的开源软件要做的,所以如果你能等,建议先等等吧,到时候有兴趣咱们也可以一起来开发。

出0入198汤圆

 楼主| 发表于 2017-2-18 23:08:28 | 显示全部楼层
Zigbee2012 发表于 2017-2-18 22:54
请问EasyBoot开源了吗?

暂时没有~

出0入198汤圆

 楼主| 发表于 2017-5-30 18:29:15 | 显示全部楼层
凌晨一点 发表于 2017-5-29 22:32
请问楼主,用easy flash 代替eeprom 做参数存储的话,Stm32 ,擦写次数多少呢?有优化吗
编辑原因:写错 ...

每个 Flash 扇区的擦写取决于各个 Flash 本身的特性。如果开启磨损平衡模式,总擦写次数是 Flash 参数全部扇区的总计擦写数量总和。

出0入198汤圆

 楼主| 发表于 2019-1-12 21:01:22 | 显示全部楼层
闪客 发表于 2019-1-11 12:51
你好!

在使用log的过程中发现:ef_log_get_used_size()函数获取到2032之后,再写入log,这个数不变,最 ...


时间有些长了,我也太清楚原因,建议自行深入分析。我记得 EasyLogger 项目里有 EasyFlash log 功能的示例
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 14:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表