免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
FatFS文件系統(tǒng)詳解

FatFS文件系統(tǒng)詳解-附移植建議

分類: vxWorksFlash文件系統(tǒng)Linux學(xué)習(xí)PowerPC5264人閱讀評(píng)論(3)收藏舉報(bào)

    最近做的spi flash,本打算弄個(gè)文件系統(tǒng),由于之前用過(guò)了JFFS、YAFFS和TrueFFS,代碼量都相當(dāng)?shù)拇?,這次想找款代碼量不那么嚇人的,學(xué)習(xí)一下,聽(tīng)說(shuō)配置會(huì)相對(duì)復(fù)雜一些。選來(lái)選去,最終選定了FatFS,代碼量足夠的小,最新的R0.09版本只有1個(gè).c文件(當(dāng)然,還有一個(gè)底層的要自己寫,option文件夾里的無(wú)視),老點(diǎn)版本就更小了。而且更新很頻繁,用戶量也夠大,就選定它了。盡管最后由于硬件和項(xiàng)目原因未能實(shí)際的移植它到vxWorks,但學(xué)過(guò)的還是要記錄下。

    在這里http://elm-chan.org/fsw/ff/00index_e.html下載源碼,只有800多K,小的可憐,還可以下載示例程序,有AVR、Win32、lpc等多平臺(tái)已實(shí)現(xiàn)的方案。打開(kāi)看src文件夾,一個(gè)option文件夾、00readme.txt、diskio.h、ff.c、ff.h、ffconf.h和interger.h。移植時(shí)需要修改的文件主要包括ffconf.h和interger.h,后者是在它的定義與目標(biāo)平臺(tái)上的有沖突,或者用的不習(xí)慣時(shí)修改的。

    在做具體修改之前,先大概閱讀下FatFS的源代碼,可以先讀integer.h,了解所用的數(shù)據(jù)類型,然后是ff.h,了解文件系統(tǒng)所用的數(shù)據(jù)結(jié)構(gòu)和各種函數(shù)聲明,再就是diskio.h,了解與介質(zhì)相關(guān)的數(shù)據(jù)結(jié)構(gòu)和操作函數(shù)。ff.c這個(gè)文件相對(duì)較大,可以在最后將所實(shí)現(xiàn)的函數(shù)大致掃描一遍,之后根據(jù)用戶應(yīng)用層程序調(diào)用函數(shù)的次序仔細(xì)閱讀相關(guān)代碼。各個(gè)文件都可以直接用記事本打開(kāi)查閱,非常方便。ff.h中的幾個(gè)結(jié)構(gòu)體十分重要,列舉如下,首先是最基礎(chǔ)的文件系統(tǒng)結(jié)構(gòu)體:

  1. /* File system object structure (FATFS) */  
  2. typedef struct {  
  3.     BYTE    fs_type;        /* FAT子類型,一般在mount時(shí)用,置0表示未掛載*/  
  4.     BYTE    drv;            /* 物理驅(qū)動(dòng)號(hào),一般為0*/  
  5.     BYTE    csize;          /* 每個(gè)簇的扇區(qū)數(shù)目(1,2,4...128) */  
  6.     BYTE    n_fats;         /* 文件分配表的數(shù)目(1,2) */  
  7.     /*FAT文件系統(tǒng)依次為:引導(dǎo)扇區(qū)、兩個(gè)文件分配表、根目錄區(qū)和數(shù)據(jù)區(qū)*/  
  8.     BYTE    wflag;          /* 標(biāo)記文件是否被改動(dòng)過(guò),為1時(shí)要回寫*/  
  9.     BYTE    fsi_flag;       /* 標(biāo)記文件系統(tǒng)信息是否被改動(dòng)過(guò),為1時(shí)要回寫*/  
  10.     WORD    id;             /* 文件系統(tǒng)掛載ID */  
  11.     WORD    n_rootdir;      /* 根目錄區(qū)入口(目錄項(xiàng))的個(gè)數(shù)(用于FAT12/16)*/  
  12. #if _MAX_SS != 512  
  13.     WORD    ssize;          /* 每扇區(qū)的字節(jié)數(shù)(用于扇區(qū)大于512Byte的flash) */  
  14. #endif  
  15. #if _FS_REENTRANT  
  16.     _SYNC_t sobj;           /* 允許重入,即定義同步對(duì)象,用在tiny中*/  
  17. #endif  
  18. #if !_FS_READONLY  
  19.     DWORD   last_clust;     /* 最后一個(gè)被分配的簇*/  
  20.     DWORD   free_clust;     /* 空閑簇的個(gè)數(shù)*/  
  21.     DWORD   fsi_sector;     /* 存放fsinfo的扇區(qū)(用于FAT32) */  
  22. #endif  
  23. #if _FS_RPATH  
  24.     DWORD   cdir;           /* 允許相對(duì)路徑時(shí)用,存儲(chǔ)當(dāng)前目錄起始簇(0:root)*/  
  25. #endif  
  26.     DWORD   n_fatent;       /* FAT入口數(shù)(簇的數(shù)目 + 2)*/  
  27.     DWORD   fsize;          /* 每個(gè)FAT所占扇區(qū)*/  
  28.     DWORD   fatbase;        /* FAT起始扇區(qū)*/  
  29.     DWORD   dirbase;        /* 根目錄起始扇區(qū)(FAT32:Cluster#) */  
  30.     DWORD   database;       /* 數(shù)據(jù)目錄起始扇區(qū)*/  
  31.     DWORD   winsect;        /* 當(dāng)前緩沖區(qū)中存儲(chǔ)的扇區(qū)號(hào)*/  
  32.     BYTE    win[_MAX_SS];   /* 單個(gè)扇區(qū)緩存*/  
  33. } FATFS;  

 然后是與之相關(guān)的文件和文件夾結(jié)構(gòu)體,附上具體注釋:

  1. /* File object structure (FIL) */  
  2. typedef struct {  
  3.     FATFS*  fs;             /* 所在的fs指針*/  
  4.     WORD    id;             /* 所在的fs掛載編號(hào)*/  
  5.     BYTE    flag;           /* 文件狀態(tài)*/  
  6.     BYTE    pad1;           /* 不知道含義,也未見(jiàn)程序使用*/  
  7.     DWORD   fptr;           /* 文件讀寫指針*/  
  8.     DWORD   fsize;          /* 大小*/  
  9.     DWORD   sclust;         /* 文件起始簇(fsize=0時(shí)為0) */  
  10.     DWORD   clust;          /* 當(dāng)前簇*/  
  11.     DWORD   dsect;          /* 當(dāng)前數(shù)據(jù)扇區(qū)*/  
  12. #if !_FS_READONLY  
  13.     DWORD   dir_sect;       /* 包含目錄項(xiàng)的扇區(qū) */  
  14.     BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */  
  15. #endif  
  16. #if _USE_FASTSEEK  
  17.     DWORD*  cltbl;          /*指向簇鏈接映射表的指針*/  
  18. #endif  
  19. #if _FS_SHARE  
  20.     UINT    lockid;         /* File lock ID (index of file semaphore table) */  
  21. #endif  
  22. #if !_FS_TINY  
  23.     BYTE    buf[_MAX_SS];   /* File data read/write buffer */  
  24. #endif  
  25. } FIL;  

 下面是目錄的:

  1. /* Directory object structure (DIR) */  
  2. typedef struct {  
  3.     FATFS*  fs;             /* 同上*/  
  4.     WORD    id;  
  5.     WORD    index;          /* 當(dāng)前讀寫索引號(hào) */  
  6.     DWORD   sclust;         /* 文件數(shù)據(jù)區(qū)開(kāi)始簇*/  
  7.     DWORD   clust;          /* 當(dāng)前簇*/  
  8.     DWORD   sect;           /* 當(dāng)前扇區(qū)*/  
  9.     BYTE*   dir;            /* 扇區(qū)緩存中當(dāng)前SFN入口指針,SFN含義未知,猜測(cè)和LFN類似,與文件名相關(guān)*/  
  10.     BYTE*   fn;             /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */  
  11. #if _USE_LFN  
  12.     WCHAR*  lfn;            /* Pointer to the LFN working buffer */  
  13.     WORD    lfn_idx;        /* Last matched LFN index number (0xFFFF:No LFN) */  
  14. #endif  
  15. } DIR;  

    其他類似f_mount、f_open等接口API就不細(xì)說(shuō)了,在掛載的時(shí)候其實(shí)真正起作用的是chk_mounted函數(shù),在這里才會(huì)將掛載分區(qū)的相關(guān)信息分配到FatFS結(jié)構(gòu)體中;還有一個(gè)get_fat函數(shù),也比較重要,在f_open和許多目錄操作的函數(shù)中都有用到,而且FAT入口這個(gè)表達(dá)也十分晦澀,而它又調(diào)用了一個(gè)move_window的函數(shù),也是十分晦澀難懂,可能是我英語(yǔ)太爛的緣故吧。實(shí)際上,move_window的作用是改變文件系統(tǒng)的當(dāng)前工作扇區(qū),如果要遷移到的是當(dāng)前扇區(qū),直接返回,如果不是,就將原扇區(qū)寫回,若是FAT表,還要寫進(jìn)備份區(qū)。

    熟悉了代碼結(jié)構(gòu)后,現(xiàn)在開(kāi)始作修改了,首先修改ffconf.h文件配置與硬件相關(guān)的文件系統(tǒng)特性,然后自己添加一套底層操作即可。先看ffconf.h,里面定義了很多宏,可以根據(jù)自己需要一一配置:

    先看功能配置:

_FS_TINY:文件系統(tǒng)為標(biāo)準(zhǔn)的還是微型的,默認(rèn)為標(biāo)準(zhǔn)的(0);

_FS_READONLY:文件系統(tǒng)是否為只讀,默認(rèn)為可讀寫(0),若只讀則f_write、f_sync、 f_unlink、f_mkdir、f_chmod、f_rename、f_truncate和f_getfree不可用;

_FS_MINIMIZE:裁剪文件系統(tǒng)的功能,默認(rèn)為全部功能(0),若為1、2則會(huì)移除大部分鏈接、目錄等功能;

_USE_STRFUNC:是否允許字符串操作,默認(rèn)為不允許(0),這個(gè)看個(gè)人需求,一般情況下設(shè)置為1即可,如果工作在windows下,為保證文件兼容性(如換行符’\n’和回車符’\r’)建議將此項(xiàng)設(shè)置為2;

_USE_MKFS:是否允許使用f_mkfs函數(shù),默認(rèn)為0,用于創(chuàng)建文件夾,建議開(kāi)啟;

_USE_FORWARD:用于允許f_forward函數(shù),只有開(kāi)啟tiny文件系統(tǒng)時(shí)才用到,該函數(shù)用于將讀寫的數(shù)據(jù)立即轉(zhuǎn)存到數(shù)據(jù)流中,以節(jié)省RAM空間;

_USE_FASTSEEK:是否開(kāi)啟快速索引,默認(rèn)為0,開(kāi)啟后,會(huì)使用FIL結(jié)構(gòu)體中的cltbl元素來(lái)加快搜索;

_CODE_PAGE:指定目標(biāo)系統(tǒng)使用的OEM代碼頁(yè),默認(rèn)為日語(yǔ)(932),改為936簡(jiǎn)體中文;OEM是什么意思呢?在OS編碼中,unicode是一種雙字節(jié)字符編碼,無(wú)論中文還是英文,或者其他語(yǔ)言統(tǒng)一到2個(gè)字節(jié),它與現(xiàn)有的任何編碼(ASCII,GB等)都不兼容。WindowsNT(2000)的內(nèi)核即使用該編碼,所有數(shù)據(jù)進(jìn)入內(nèi)核前轉(zhuǎn)換成UNICODE,退出內(nèi)核后在轉(zhuǎn)換成版本相關(guān)的編碼(通常稱為OEM,在簡(jiǎn)體中文版下即為GB);

_USE_LEN、_MAX_LEN、_LFN_UNICODE:這三個(gè)的意思不是很清楚,但是確定是與長(zhǎng)文件名有關(guān)的,不建議開(kāi)啟,否則又要多加函數(shù),麻煩;

_FS_RPATH:是否允許相對(duì)路徑,讓我選擇就不開(kāi)啟,否則邏輯變得復(fù)雜不說(shuō),代碼量也變多了一些;

    再看硬件相關(guān)配置:

_VOLUMES:磁盤(flash)邏輯卷數(shù),默認(rèn)為1,不建議修改;

_MAX_SS:扇區(qū)大小,默認(rèn)512Byte,最大可設(shè)置4096Byte;

_MULTI_PARTITION:分區(qū)選項(xiàng),默認(rèn)為0,即一個(gè)分區(qū),若想要多分區(qū)可自行設(shè)置;

_USE_ERASE:是否允許扇區(qū)擦除,默認(rèn)為0,若開(kāi)啟則要在disk_ioctl函數(shù)中添加擦除命令代碼;

    最后是文件系統(tǒng)配置:

_WORD_ACCESS:數(shù)據(jù)遞進(jìn)格式,默認(rèn)為0,即以字節(jié)為單位遞進(jìn),兼容性更強(qiáng),若你的系統(tǒng)最新單位為字(2Byte),則可設(shè)為1;

_FS_REENTRANT、_FS_TIMEOUT、_SYNC_t:這三個(gè)選項(xiàng)與文件系統(tǒng)是否允許重入有關(guān),所直白點(diǎn),就是能否被多線程同時(shí)訪問(wèn),像RTOS中,一般建議開(kāi)啟,_SYNC_t可定義為對(duì)應(yīng)OS中的操作對(duì)象,windows下為HANDLE,uCos中為OS_EVENT,vxWorks中為SEMAPHORE。另外,開(kāi)啟后還需要添加ff_req_grant、ff_rel_grant和ff_del_syncobj三個(gè)函數(shù),實(shí)際上實(shí)現(xiàn)的功能就是申請(qǐng)互斥量、釋放互斥量和刪除互斥量的意思,可以定義OS封裝即可;

_FS_SHARE:和上面的類似,表示文件系統(tǒng)最大允許同時(shí)打開(kāi)多少文件,默認(rèn)為0,即只能打開(kāi)一個(gè)。

    在配置這些選項(xiàng)的時(shí)候,可以根據(jù)定義閱讀ff.c文件中的相關(guān)代碼,基本上能對(duì)整體的結(jié)果有了了解,完成了ffconf.h后,再就是編寫底層接口了,在新一點(diǎn)的FatFs中,并未提供函數(shù)接口模版,可以下老版的拷過(guò)來(lái),也可以打開(kāi)doc文件夾下的幫助文檔00index_e.htm文件,里面有底層函數(shù)接口的格式及各個(gè)參數(shù)的描述。至于底層驅(qū)動(dòng),我只做過(guò)spi flash的,這個(gè)可以參考我上一篇文章。需要注意的是,底層讀寫函數(shù)中的參數(shù)sector指的是扇區(qū)的序號(hào),需要自己換算成驅(qū)動(dòng)接口中的字節(jié)位置。

    到這里,移植基本完成了,如果你的文件系統(tǒng)出現(xiàn)LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr))有問(wèn)題(數(shù)據(jù)異常終止DATA ABORT exception之類的)的情況,請(qǐng)百度搜索“轉(zhuǎn)一篇比較詳細(xì)介紹FatFS文件系統(tǒng)移植的文章”就可以搞定了,那里有詳細(xì)的解決辦法。

分享到:
8
0
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
FatFS簡(jiǎn)介
FatFs移植筆記(R0.09)
FatFs模塊功能配置選項(xiàng)
【青風(fēng)帶你學(xué)stm32f051系列教程】第15課 文件系統(tǒng)操作SD卡 | 愛(ài)板網(wǎng)
STM32筆記之FatFS文件系統(tǒng)移植
STM32 之四 標(biāo)準(zhǔn)外設(shè)版 USB 驅(qū)動(dòng) + MSC(Host) + Fatfs 移植
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服