⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blkmdd.h

📁 包装了一个开源的FAT16文件系统
💻 H
字号:
//file: blkmdd.h
#ifndef __BLKMDD_H__
#define __BLKMDD_H__


//配置cache单元数量,视内存大小和对性能的需要而权衡
//如果只操作一个文件,2个cache单元已经足够。
//如果要操作2个文件,像是copy类似的函数,从一个文件读写到另一个文件,3个足够,但2个与3个的性能有质的区别
#define CFG_CacheUnitCnt	2		



#define CFG_IOStat				1		//是否开通性能统计功能
#define CFG_StatCalcHitRatio	1		//是否开通对命中率的实时计算,此工作需要乘除法运算量,额外开销偏高


#define CON_SectorSize		512
#define CON_SectorSizeShift	9
#ifndef CON_MaxU32
#define CON_MaxU32			0xffffffff
#endif


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>暴露给文件系统的接口>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
typedef uint8_t (*BlkMdd_read_interval_handler_t)(uint8_t* buffer, uint32_t offset, void* p);
typedef uint16_t (*BlkMdd_write_interval_handler_t)(uint8_t* buffer, uint32_t offset, void* p);


#if CFG_CacheUnitCnt>=1
	uint8_t BlkMdd_read(uint32_t offset, uint8_t* OUT buffer, uint16_t length);
	uint8_t BlkMdd_write(uint32_t offset, const uint8_t* buffer, uint16_t length);

#endif
uint8_t BlkMdd_read_interval(uint32_t offset, uint8_t* buffer, uint16_t interval, uint16_t length, BlkMdd_read_interval_handler_t callback, void* p);
uint8_t BlkMdd_write_interval(uint32_t offset, uint8_t* buffer, uint16_t length, BlkMdd_write_interval_handler_t callback, void* p);
uint8_t BlkMdd_RdPhy(uint32_t offset, uint8_t* OUT buffer, uint16_t length);		//直接往物理器件上写,不通过cache
uint8_t BlkMdd_WrPhy(uint32_t offset, const uint8_t* IN buffer, uint16_t length);	//直接从物理器件上读,不通过cache
BOOL BlkMdd_Flush(void);

BOOL BlkMdd_Startup(void);
BOOL BlkMdd_Cleanup(void);
void BlkMdd_SctIOTest(void);
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<暴露给文件系统的接口<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>对物理设备驱动程序的接口>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//物理设备扇区大小必须与下面定义的CON_SectorSize宏一致,通常是512字节

//参数:
//	secNum:		扇区号//	pBuf:		读出来的数据应该放入的缓冲区//返回值: 若成功返回0,失败返回非0typedef UFAV (*pfnPHDRdSct_t)(U32 secNum, U8* OUT pBuf);//参数:
//	secNum:		扇区号//	pBuf:		需要写入数据所在的缓冲区//返回值: 若成功返回0,失败返回非0typedef UFAV (*pfnPHDWrSct_t)(U32 secNum, const U8* IN pBuf);

BOOL PHDInits(void);	//物理设备层必须有一个函数名为PHDInits,用于打开设备并准备好工作环境
BOOL PHDCleanup(void);	//物理设备层必须有一个函数名为PHDCleanup,用于关闭设备并清理工作环境

BOOL PHDRegisterHandlers(pfnPHDRdSct_t pfnRdSct, pfnPHDWrSct_t pfnWrSct);

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<对物理设备驱动程序的接口<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<



typedef struct _DS_SctCache
{
	U8 buf[CON_SectorSize];
	U32 sctNum;		//当前cache单元是在缓存哪个扇区的数据。如果为CON_MaxU32,则表示该cache单元没有启用
	BOOL isDirty;
	U16 idleCnt;	//闲置次数:每一次读写操作,如果发现都不是针对该cache单元的,就把闲置次数加1。需要替换时,就把闲置次数最大的换出去
}DS_SctCache;



#if CFG_IOStat==1
typedef struct _DS_IOStat
{
	U32 rdCnt;		//高层发出的读命令数
	U32 wrCnt;		//高层发出的写命令数
	U32 ioCnt;		//高层发出的I/O总数,应为wrCnt+rdCnt
	U32 rdByteCnt;	//高层发出的读命令涉及的字节总数
	U32 wrByteCnt;	//高层发出的写命令涉及的字节总数
	U32 phdRdCnt;	//物理设备读取次数
	U32 phdWrCnt;	//物理设备写入次数
	U32 hitCnt;		//读写时cache命中数
	#if CFG_StatCalcHitRatio!=0
	U32 hitRatio;	//cache命中率
	#endif
	//U32 cacheRdByteCnt;	//从cache中读取的字节数
	//U32 cacheWrByteCnt;	//写入到cache中的字节数
	//U32 rdHitRatio;	//读取时cache命中率,扩大到了1000倍,如735表示73.5%
	//U32 wrHitRatio;	//写入时cache命中率,扩大到了1000倍 ,如735表示73.5%
}DS_IOStat;
#endif
typedef struct _DS_MDDCB
{
#if CFG_CacheUnitCnt>=1
	DS_SctCache cacheAry[CFG_CacheUnitCnt];
#endif
#if CFG_IOStat==1
	DS_IOStat stat;
#endif
	BOOL isCached;
	pfnPHDRdSct_t pfnPHDRdSct;
	pfnPHDWrSct_t pfnPHDWrSct;
}DS_MDDCB;
#endif



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -