?? blkmdd.h
字號:
//file: blkmdd.h
#ifndef __BLKMDD_H__
#define __BLKMDD_H__
#define CFG_CacheUnitCnt 1 //配置cache單元數量,視內存大小和對性能的需要而權衡
#define CFG_IOStat 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);
#else
#define BlkMdd_read BlkMdd_RdPhy
#define BlkMdd_write BlkMdd_WrPhy
#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_Startup();
BOOL BlkMdd_Cleanup();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<暴露給文件系統的接口<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>對物理設備驅動程序的接口>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//物理設備扇區大小必須與下面定義的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命中數
U32 hitRatio; //cache命中率
//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 + -