最近有些问题困扰左右。一些小数据的存储问题,现在的片上系统或者单片机系统或多或少的会带一点DATA flash的存储区,大不比以前的24cxx的时代了,当然24CXX也算的上是经典的存储。但是就目前我做过的这种存储大都是一些简单的数据或者变量。只要存几个地址即可,根本不存在管理的问题。也正是基于此,导致现在如果要是实现一个小的FLASH管理就显得很繁杂,甚至无从下手,考虑了许久,想到了内存池,内存池的概念基本上和Data Flash 相似的,对比他们之间的差别主要在于扇区地址寻址和擦写上,SRAM当然是读写随便了,只要指针直捣之处即使原始物理地址写入读出即可,但是FLASH的特性注定不能这样子搞。他是块擦写的。如此就很难搞的和内存池一样灵活。
我想这样解决之:
1、建立一个数据结构来管理已知的FLASH,作一个记录,这个记录由若干个小块组成,小块用链表。
2、按照MEM_POOL构建FLASH的分配和释放机制,为APP提供接口。
3、建立中间区域,所谓中间区域即使最小可擦写扇区,一般标定为512byte,用来作为程序-中间缓冲区-FLASH三者协同。
4、在管理记录中加入两套函数指针,指向驱动层的驱动函数,以提高灵活性,适应片外EEPROM或者小容量FLASH。
5、块校验和存储自己的映像。管理为单链表结构,数据块为线性结构。以减低代码实现的复杂程度。
倘若是上百兆的FLASH或者NAND之类的,毫无疑问直接上文件系统是嘴有效的。主要是有些应用介于大容量之间,有没有足够的资源,只能是自己实现一套管理机制,
数据结构参考如下:
POOL list and BLOCK
BLOCK在这里不适用,换成最小的快,即=512BYTE
POOL管理FLASH
list 提供块数量,
自从此数据结构诞生之时起就决定了他的物理存储边界和块大小。
显然对mem_pool做了裁剪,变成了一个完全是单链表的结构,代码复杂度低得多。
说到底其实就是一张饼,然后用刀切,切成均匀的一小块一小块,小块上面有的有芝麻有的没有。
应该做出这张饼!
老伟
比特电子
|