📄 blkmdd.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 + -