关于FLASH存储的一个算法
一般,在用FLASH进行存储时,所写的驱动程序,因为FLASH要先擦后写的特性,操作的算法一般都是先读出一个扇区到缓冲区,数据写入缓冲区,把扇区擦掉,再把缓冲区写入。而一般的FLASH扇区,常用的是4K大小,这样,就要求单片机在进行操作时,至少要用到4K的RAM。而且,这样操作,有可能造成只对某一个扇区频率读写,会降低寿命总之,一般的FLASH操作算法存在:
1、占用RAM大
2、写操作麻烦,并且耗时
3、造成磨损不均衡
4、若一次写失败,会造成整个扇区数据损坏
而对于大一点的,像LINUX,都会有专门算法的,基于FLASH的文件系统,不过,好像需要的资源也大,非一般单片机所能用的。
就此,我想问一下,若有一个能够解决以上这些问题的算法代码,大概2K,且占用资源也不多,RAM最高时占用也就一百多字节,且是动态分配的。不过,除去底层驱动,算法代码有2K,大家觉得为实现这个算法,占用2K空间,算大吗? 写出来了,感觉比以前顺畅多了
在此基础上,很容易构造自己的文件系统,或是数据存储格式 算法代码2K完全可以接受,只是使用malloc/free或者new/delete来动态分配内存,可能并不是完全能够接受。不过对楼主的方法有兴趣。 回复【2楼】WithSword倚剑
算法代码2k完全可以接受,只是使用malloc/free或者new/delete来动态分配内存,可能并不是完全能够接受。不过对楼主的方法有兴趣。
-----------------------------------------------------------------------
其实也可以用局部变量来完成,不过,因为每次用完后,就free掉了,我觉得应该没有什么问题吧。
这几天一直在测试,都没有问题,不过,没试过在中断内有malloc的情况下试过 LZ,能否共享下,测试下性能如何, 就是做个缓冲区来存储,不知都楼主有什么好办法? 偶写的算法就是占有点静态RAM,代码量倒没多少行,就是把每个扇区的属性比如擦写次数、空闲标志等在上电加载到RAM,这样加快写入搜索操作,还有在上一层构造一个虚拟扇区到物理扇区的隐射表。不知道楼主的写平衡算法是咋样的?还有读写速度 回复【6楼】again
偶写的算法就是占有点静态ram,代码量倒没多少行,就是把每个扇区的属性比如擦写次数、空闲标志等在上电加载到ram,这样加快写入搜索操作,还有在上一层构造一个虚拟扇区到物理扇区的隐射表。不知道楼主的写平衡算法是咋样的?还有读写速度
-----------------------------------------------------------------------
虚拟扇区到物理扇区的隐射表....
有一点类似,但是前面不是这么处理的
1、占用RAM大 可以减少到几十字节,我现在设置是一百多字节,用的malloc。。。不是静态RAM
2、写操作麻烦,并且耗时 我现在测试用伪随机数写32768次,平均时间在80ms左右
3、造成磨损不均衡 理想情况下,FLASH每一块写的次数都会一样,趋向于。。
4、若一次写失败,会造成整个扇区数据损坏 最多新数据丢失,对旧数据没有影响
总之,是类似于日志型的
我发给我朋友在用,看会出现什么问题 期待.....
自己也在写..... LZ不给力,思路也不给分享,问问题时倒是很洒脱。。。 顶下 {:lol:} 省RAM,无非是把数据备份到另外一块FLASH上、
或者做个存储结构,牺牲一点FLASH空间,来换取RAM
不知LZ做的是那种?{:lol:}
页:
[1]