点击上方蓝字【囧囧妹】一起学习,一起成长!
一,开篇
背景

解决方案

#define HDR_LEN_IN_HARD (32+4)typedef struct HDR_ST{u8 hash[32];u32 addr; //文件存放的物理地址首地址struct semaphore sem; //文件写操作时锁struct HDR_ST *next;}hdr_st;typedef struct {u32 dir_addr;//文件目标表基地址(缓存到ram,不写入磁盘)u32 count;//当前存储文件数量hdr_st *phdr_front;//文件目录缓存hdr_st *phdr_rear;//文件目录缓存}dir_st;
//inode属性值typedef struct {u8 state; //inode状态u8 name_len; //文件名长度-长度为0则为首块u16 used_len; //该inode已使用长度,只包含文件内容,不含头部和尾部的四个字节}attribute_st;typedef struct {attribute_st attr; //文件属性值u16 total_len; //文件空间大小u16 file_len; //文件目前的长度u32 next_inode_addr; //该文件下一个块的地址}inode_st;
每个inode,我们以1K为单位,文件属性定义如下,我们站在flash角度在定义属性:
开始4字节:
(3)8bit:00-该inode已使用,ff-空闲
(2)8bit:文件名长度(最长256字节)--(长度为0-该inode区为附属区,其它值为文件起始区)
(1-0)16bit:当前inode区已使用长度
偏移4字节:
(1)16bit:文件空间总体大小
(0)16bit:当前文件占用大小
文件名+文件内容
最后4字节存储下一inode区地址
#define FS_ONE_BLK_SIZE (1024) //1K字节#define FS_ROOM_MAX(addr) (VSM_FS_END_ADDR(addr)-VSM_FS_BASE_ADDR(addr)) //文件系统最大空间#define FS_BLK_COUNT(addr) ((VSM_FS_END_ADDR(addr)-VSM_FS_BASE_ADDR(addr))/FS_ONE_BLK_SIZE) //文件系统块数量#define FS_INODE_ROOM_MAX(addr) (FS_ROOM_MAX(addr)-FS_ONE_BLK_SIZE) //inode区空间最大值#define FS_INODE_CONTENT_LEN(addr) ({ \u16 len = 0; \ebc_flash_read(addr, (u8 *)&len, 2); \(FS_ONE_BLK_SIZE-len-4-10); \}) //获取inode节点内部有效数据长度最大值//将索引块标记为等待回收#define fs_set_inode_attr_invalid(inode_addr) fs_set_inode_attr(inode_addr, INODE_IS_USING, INODE_IS_UNVALID, 0, 0, 0, 0, nil);//sb块默认文本长度#define FS_ISB_INODE_LEN(len) (FS_ONE_BLK_SIZE-len-4-10)#define INODE_IS_USING 0x00 //#define INODE_IS_VALID 0xff#define INODE_IS_UNUSING 0xff#define INODE_IS_UNVALID 0x00#define memcpy_fromfs(to, from, n) memcpy((to),(from),(n))#define memcpy_tofs(to, from, n) memcpy((to),(from),(n))//同步磁盘时的脏数据typedef u32 (*file_sync_oper_st)();
现在结构和描述都有了,接下来就来看看程序如何设计和实现。
文章转载自囧囧妹,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




