搜索
bottom↓
123
返回列表 发新帖
楼主: sunnydragon

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

  [复制链接]

出0入0汤圆

发表于 2016-6-1 09:26:02 | 显示全部楼层
从现在版本来看,EasyFlash面向的应用方向应该是参数存储和日志存储吧(拙见),不知道有没有意向朝连续记录数据存储(最好是多属性,千、万级的数据量)方向发展。

出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入0汤圆

发表于 2016-6-2 08:12:32 | 显示全部楼层
sunnydragon 发表于 2016-6-1 21:20
1、对齐方式跟你理解的很像,不过是 "key=value" 合在一起进行4字节对齐存储。

2、你说的这个资源占用过 ...

写数据库还没那个能力,不过出几个demo还是问题不大,主要是我发现和楼主的写作方式(跟我这样跟着开发板学过来的人)差异挺大的,例:变量命名那么长、硬件初始化不会把所有IO写在一起等等,导致demo并不是很易读(很想知道楼主以前是写什么的)。
现在想到一个以文件为单位的处理方案(基于文件系统),解决当前的多分类的数据记录问题(例如:4个通道,通道的输入类型每修改一次,重新创建一个文件,每个文件开始是一个信息段,记录后面的数据的属性)。

出0入0汤圆

发表于 2016-6-3 21:36:29 | 显示全部楼层
很好  很强大

出0入0汤圆

发表于 2016-7-27 00:26:27 | 显示全部楼层
楼主又出大作,真是令人敬仰

我现在打算把铁电保存参数的功能改用片上flash模拟eeprom的方式来做,基本思路是有的,不过如果你的东西已经解决问题了我不打算再闭门造车了

正如前面有坛友提出一样,我的参数也组合成一个大结构体,里面套好多结构体数组,总共有5k大,每次用户修改后立刻修改对应参数在铁电中备份值,如果改用flash模拟的话也只能用这样的增量做法,如果全局修改flash估计撑不了多久,改用掉电时全局修改也不现实,按照数据手册,5k保存时最大耗时有50ms,何况还有其他掉电保存的工作参数

请问你的大作支持类似于铁电或e2的增量操作吗,是指模拟的flash增量操作

出0入0汤圆

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

出0入198汤圆

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

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

出0入0汤圆

发表于 2016-7-27 08:52:06 | 显示全部楼层
Mark. Good job!

出0入0汤圆

发表于 2016-7-27 09:51:27 | 显示全部楼层
sunnydragon 发表于 2016-7-27 08:34
目前不支持增量更新功能,不对对于 EasyFlash 接下来的开发方向,我是有打算再重新开发一种轻量级的模式 ...

增量更新我也是这么想的,普通修改操作就是动态增量更新,换扇区的时候,或者开机初始化的时候,或者到某个临界点的时候进行一次静态更新,即删除全部增量更新,将全局更新一次写入,相当于一次整理,因为太多的增量很可能出差错,还是需要重新开始的

出0入0汤圆

发表于 2016-7-27 10:19:19 | 显示全部楼层
不错,挺强大的

出0入0汤圆

发表于 2016-7-27 10:26:55 | 显示全部楼层
mark  嵌入式闪存库 EasyFlash for STM32,支持Env和IAP

出0入0汤圆

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

出0入198汤圆

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

暂时没有~

出0入0汤圆

发表于 2017-3-4 15:07:44 | 显示全部楼层
正需要,谢谢大神,

出0入0汤圆

发表于 2017-5-29 22:32:29 来自手机 | 显示全部楼层
本帖最后由 凌晨一点 于 2017-5-29 22:46 编辑
sunnydragon 发表于 2017-2-18 23:08
暂时没有~


请问楼主,用easy flash 代替eeprom 做参数存储的话,Stm32 ,擦写次数多少呢?有优化吗
编辑原因:写错字

出0入0汤圆

发表于 2017-5-29 22:51:28 | 显示全部楼层

期待Easy boot 出来啊,最好支持USB 虚拟U 盘更新程序,期待啊

出0入198汤圆

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

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

出0入0汤圆

发表于 2017-6-2 13:20:47 | 显示全部楼层
好东西,收藏

出0入0汤圆

发表于 2017-7-6 19:48:59 | 显示全部楼层
看楼主IAP 都是先接收数据到备份区 在从备份区拷贝数据到app的指定地址,这样的话岂不是效率很低,且要求flash大小至少大于2倍的app

出0入0汤圆

发表于 2017-9-23 10:21:14 | 显示全部楼层
改为STM32X8系列,IAR7.2编译
下面这警告很奇怪。。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2018-1-15 16:09:58 | 显示全部楼层
正式我想要的,谢谢分享。

出0入0汤圆

发表于 2019-1-11 12:51:04 | 显示全部楼层
你好!

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

工程:easyflash     no_os     stm32f10x env的例子
log配置为20k大小

测试代码:
  1.           sprintf(log,"%ld", times);         
  2.           ef_log_write((const uint32_t*)test,4);
  3.        
  4.           log_size = ef_log_get_used_size();
  5.           ef_print("log used_size is :%d ",log_size);
  6.        
  7.           ef_log_read(times,(uint32_t *)log,4);
  8.                         ef_print("read log times :%d , log text is %s",times,log);

  9.           times += 4;                       
复制代码


本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2019-1-11 13:45:47 | 显示全部楼层
mark EEPROM flash 写平衡

出0入0汤圆

发表于 2019-1-12 21:00:44 | 显示全部楼层
sunnydragon 发表于 2017-5-30 18:29
每个 Flash 扇区的擦写取决于各个 Flash 本身的特性。如果开启磨损平衡模式,总擦写次数是 Flash 参数全 ...

在吗?EasyFlash使用LOG出现了几个问题。
在222楼。

出0入198汤圆

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

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


时间有些长了,我也太清楚原因,建议自行深入分析。我记得 EasyLogger 项目里有 EasyFlash log 功能的示例

出0入0汤圆

发表于 2019-1-12 21:05:48 | 显示全部楼层
sunnydragon 发表于 2019-1-12 21:01
时间有些长了,我也太清楚原因,建议自行深入分析。我记得 EasyLogger 项目里有 EasyFlash log 功能的示 ...

好的。我再测试一下easyloger

出0入0汤圆

发表于 2019-1-12 22:41:13 | 显示全部楼层
sunnydragon 发表于 2019-1-12 21:01
时间有些长了,我也太清楚原因,建议自行深入分析。我记得 EasyLogger 项目里有 EasyFlash log 功能的示 ...

我也许找到原因了。log只写了一页就停止了。

ef_log.c 有一处小BUG

613-617行
  1.             /* change the current sector status to FULL */
  2.             result = write_sector_status(write_addr, SECTOR_STATUS_FULL);
  3.             if (result != EF_NO_ERR) {
  4.                 goto exit;
  5.             }
  6.             write_size += writable_size;
复制代码


这一页写满之后,应该寻找下一页。因此,把源代码的第625-667替换掉上面的if语句即可
  1.     /* erase and write remain log */
  2.     while (true) {
  3.         /* calculate next available sector address */
  4.         erase_addr = write_addr = get_next_flash_sec_addr(write_addr - 4);
  5.         /* move the flash log start address to next available sector address */
  6.         if (log_start_addr == erase_addr) {
  7.             log_start_addr = get_next_flash_sec_addr(log_start_addr);
  8.         }
  9.         /* erase sector */
  10.         result = ef_port_erase(erase_addr, EF_ERASE_MIN_SIZE);
  11.         if (result != EF_NO_ERR) {
  12.             goto exit;
  13.         }
  14.         /* change the sector status to USING when write begin sector start address */
  15.         result = write_sector_status(write_addr, SECTOR_STATUS_USING);
  16.         if (result == EF_NO_ERR) {
  17.             write_addr += LOG_SECTOR_HEADER_SIZE;
  18.         } else {
  19.             goto exit;
  20.         }
  21.         /* calculate current sector writable data size */
  22.         writable_size = EF_ERASE_MIN_SIZE - LOG_SECTOR_HEADER_SIZE;
  23.         if (size - write_size >= writable_size) {
  24.             result = ef_port_write(write_addr, log + write_size / 4, writable_size);
  25.             if (result != EF_NO_ERR) {
  26.                 goto exit;
  27.             }
  28.             /* change the current sector status to FULL */
  29.             result = write_sector_status(write_addr, SECTOR_STATUS_FULL);
  30.             if (result != EF_NO_ERR) {
  31.                 goto exit;
  32.             }
  33.             log_end_addr = write_addr + writable_size;
  34.             write_size += writable_size;
  35.             write_addr += writable_size;
  36.         } else {
  37.             result = ef_port_write(write_addr, log + write_size / 4, size - write_size);
  38.             if (result != EF_NO_ERR) {
  39.                 goto exit;
  40.             }
  41.             log_end_addr = write_addr + (size - write_size);
  42.             break;
  43.         }
  44.     }
复制代码


经过测试可见,log可以写满20k预定大小,而且读出也是正确的。请sunnydragon看一下是否是这样?

本帖子中包含更多资源

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

x

出0入4汤圆

发表于 2019-1-29 22:11:06 | 显示全部楼层
这个真是不错!!

出0入0汤圆

发表于 2019-2-11 07:36:21 | 显示全部楼层
赞楼主!!

出0入0汤圆

发表于 2019-2-11 22:11:08 | 显示全部楼层

最近写了一篇《如何在嵌入式产品中应用键值存储数据库》:http://geek.csdn.net/news/detail/35184,里面有一些EasyFlash的使用场景。欢迎大家拍砖。
這個聯結失效了~~~~~~~~~~~~~`

出0入0汤圆

发表于 2019-2-13 09:03:17 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-2-13 09:04:52 | 显示全部楼层
mark一下:嵌入式闪存库 EasyFlash for STM32,支持Env和IAP

出0入0汤圆

发表于 2019-2-13 11:04:02 | 显示全部楼层
平衡功能+1

出0入0汤圆

发表于 2019-2-14 09:37:07 | 显示全部楼层
easyflash 顶起

出0入0汤圆

发表于 2019-2-28 11:37:38 | 显示全部楼层
支持楼主,感谢楼主分享!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-3-29 23:50

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

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