380121850 发表于 2011-5-10 22:52:13

关于FLASH存储的一个算法

一般,在用FLASH进行存储时,所写的驱动程序,因为FLASH要先擦后写的特性,操作的算法一般都是先读出一个扇区到缓冲区,数据写入缓冲区,把扇区擦掉,再把缓冲区写入。而一般的FLASH扇区,常用的是4K大小,这样,就要求单片机在进行操作时,至少要用到4K的RAM。而且,这样操作,有可能造成只对某一个扇区频率读写,会降低寿命
总之,一般的FLASH操作算法存在:
1、占用RAM大
2、写操作麻烦,并且耗时
3、造成磨损不均衡
4、若一次写失败,会造成整个扇区数据损坏

而对于大一点的,像LINUX,都会有专门算法的,基于FLASH的文件系统,不过,好像需要的资源也大,非一般单片机所能用的。

就此,我想问一下,若有一个能够解决以上这些问题的算法代码,大概2K,且占用资源也不多,RAM最高时占用也就一百多字节,且是动态分配的。不过,除去底层驱动,算法代码有2K,大家觉得为实现这个算法,占用2K空间,算大吗?

380121850 发表于 2011-5-17 23:41:23

写出来了,感觉比以前顺畅多了
在此基础上,很容易构造自己的文件系统,或是数据存储格式

WithSword 发表于 2011-5-18 00:17:30

算法代码2K完全可以接受,只是使用malloc/free或者new/delete来动态分配内存,可能并不是完全能够接受。不过对楼主的方法有兴趣。

380121850 发表于 2011-5-18 23:18:09

回复【2楼】WithSword倚剑
算法代码2k完全可以接受,只是使用malloc/free或者new/delete来动态分配内存,可能并不是完全能够接受。不过对楼主的方法有兴趣。
-----------------------------------------------------------------------

其实也可以用局部变量来完成,不过,因为每次用完后,就free掉了,我觉得应该没有什么问题吧。
这几天一直在测试,都没有问题,不过,没试过在中断内有malloc的情况下试过

xtss1230 发表于 2011-5-19 08:17:22

LZ,能否共享下,测试下性能如何,

avrgogo 发表于 2011-5-19 08:46:16

就是做个缓冲区来存储,不知都楼主有什么好办法?

again 发表于 2011-5-19 08:47:59

偶写的算法就是占有点静态RAM,代码量倒没多少行,就是把每个扇区的属性比如擦写次数、空闲标志等在上电加载到RAM,这样加快写入搜索操作,还有在上一层构造一个虚拟扇区到物理扇区的隐射表。不知道楼主的写平衡算法是咋样的?还有读写速度

380121850 发表于 2011-5-19 16:31:07

回复【6楼】again
偶写的算法就是占有点静态ram,代码量倒没多少行,就是把每个扇区的属性比如擦写次数、空闲标志等在上电加载到ram,这样加快写入搜索操作,还有在上一层构造一个虚拟扇区到物理扇区的隐射表。不知道楼主的写平衡算法是咋样的?还有读写速度
-----------------------------------------------------------------------

虚拟扇区到物理扇区的隐射表....
有一点类似,但是前面不是这么处理的

1、占用RAM大              可以减少到几十字节,我现在设置是一百多字节,用的malloc。。。不是静态RAM
2、写操作麻烦,并且耗时  我现在测试用伪随机数写32768次,平均时间在80ms左右
3、造成磨损不均衡          理想情况下,FLASH每一块写的次数都会一样,趋向于。。
4、若一次写失败,会造成整个扇区数据损坏   最多新数据丢失,对旧数据没有影响

总之,是类似于日志型的
我发给我朋友在用,看会出现什么问题

xtx8962 发表于 2011-5-20 12:04:13

期待.....
自己也在写.....

brownheart 发表于 2011-6-22 09:39:34

LZ不给力,思路也不给分享,问问题时倒是很洒脱。。。

lw30402048 发表于 2013-7-9 15:53:10

顶下 {:lol:}

zhugean 发表于 2013-7-9 16:05:56

省RAM,无非是把数据备份到另外一块FLASH上、
或者做个存储结构,牺牲一点FLASH空间,来换取RAM
不知LZ做的是那种?{:lol:}
页: [1]
查看完整版本: 关于FLASH存储的一个算法