FatFs中文譯文
原網(wǎng)絡(luò)的地址如下,下面是我做的一些中文解釋。大家可以到原網(wǎng)站獲取更多的信息。
英文原文:FatFs is a generic file system module to implement the FAT file system to small embedded systems. The FatFs is written in compliance with ANSI C, therefore it is independent of hardware architecture. It can be incorporated into cheap microcontrollers, such as 8051, PIC, AVR, SH, Z80, H8, ARM and etc..., without any change.
中文譯文:
FatFs是一個(gè)通用的文件系統(tǒng)模塊,以小的嵌入式系統(tǒng)的FAT文件系統(tǒng)。 FatFs的編程遵守的ANSI C格式語(yǔ)法標(biāo)準(zhǔn),因此,它是具有獨(dú)立于硬件架構(gòu)。 在不做任何改變就可以被移植到常用的微控制器中,如8051, PIC, AVR, SH, Z80, H8, ARM等。
FatFs 特點(diǎn)
分離緩沖的FAT結(jié)構(gòu)和每一個(gè)文件,適合快速訪問(wèn)多個(gè)文件。
支持多個(gè)驅(qū)動(dòng)器和分區(qū)。
支持FAT12 , FAT16和FAT32 。
支持8.3格式的文件名(LFN不支持)
支持兩個(gè)分區(qū)規(guī)則: Fdisk和超級(jí)軟盤。
優(yōu)化8/16-bit微控制器。
應(yīng)用接口
FatFs /微型FatFs模塊提供下列功能。
f_mount - 登記或注銷一個(gè)工作領(lǐng)域
f_open -打開(kāi)或創(chuàng)建文件
f_close - 關(guān)閉一個(gè)文件
f_read - 讀文件
f_write - 寫文件
f_lseek -移動(dòng)文件讀/寫指針
f_truncate - 截?cái)辔募?br />
f_sync - 刷新緩存的數(shù)據(jù)
f_opendir - 打開(kāi)一個(gè)目錄
f_readdir - 閱讀目錄項(xiàng)目
f_getfree -獲取免費(fèi)集群
f_stat - 獲取文件狀態(tài)
f_mkdir - 創(chuàng)建一個(gè)目錄
f_unlink - 刪除文件或目錄
f_chmod - 更改屬性
f_utime - 變更時(shí)間戳記
f_rename -重命名/移動(dòng)文件或目錄
f_mkfs - 創(chuàng)建一個(gè)文件系統(tǒng)的驅(qū)動(dòng)器
f_forward -轉(zhuǎn)發(fā)文件數(shù)據(jù)流直接
fgets - 讀一個(gè)字符串
fputc - 寫一個(gè)字符
fputs - 寫一個(gè)字符串
fprintf - 寫格式化字串
Disk I/O Interface
disk_initialize -初始化的磁盤驅(qū)動(dòng)器
disk_status - 獲取磁盤狀態(tài)disk_read - 讀部門(星期日)disk_write - 收件部門(星期日)disk_ioctl - 控制裝置依賴功能get_fattime - 獲取當(dāng)前時(shí)間
一種易于移植和使用的文件系統(tǒng)FatFs Moule
引 言
隨著信息技術(shù)的發(fā)展,當(dāng)今社會(huì)的信息量越來(lái)越大,以往由單片機(jī)構(gòu)成的系統(tǒng)簡(jiǎn)單地對(duì)存儲(chǔ)媒介按地址、按字節(jié)的讀/寫已經(jīng)不滿足人們實(shí)際應(yīng)用的需要,于是利用文件系統(tǒng)對(duì)存儲(chǔ)媒介進(jìn)行管理成了今后單片機(jī)系統(tǒng)的一個(gè)發(fā)展方向。目前常用的文件系統(tǒng)主要有微軟的FATl2、FATl6、FAT32、NTFS,以及Linux系統(tǒng)下的EXT2、EXT3等。由于微軟Windows的廣泛應(yīng)用,在當(dāng)前的消費(fèi)類電子產(chǎn)品中,用得最多的還是FAT文件系統(tǒng),如U盤、MP3、MP4、數(shù)碼相機(jī)等,所以找到一款容易移植和使用、占用硬件資源相對(duì)較小而功能又強(qiáng)大的FAT開(kāi)源文件系統(tǒng),對(duì)于單片機(jī)系統(tǒng)設(shè)計(jì)者來(lái)說(shuō)是很重要的。
FatFs Module是一種完全免費(fèi)開(kāi)源的FAT文件系統(tǒng)模塊,專門為小型的嵌入式系統(tǒng)而設(shè)計(jì)。它完全用標(biāo)準(zhǔn)C語(yǔ)言編寫,所以具有良好的硬件平臺(tái)獨(dú)立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列單片機(jī)上而只需做簡(jiǎn)單的修改。它支持FATl2、FATl6和FAT32,支持多個(gè)存儲(chǔ)媒介;有獨(dú)立的緩沖區(qū),可以對(duì)多個(gè)文件進(jìn)行讀/寫,并特別對(duì)8位單片機(jī)和16位單片機(jī)做了優(yōu)化。FatFs Module有個(gè)簡(jiǎn)化版本Tiny—FatFs,它跟完全版FatFs的不同之處主要有兩點(diǎn):
①占用內(nèi)存更少,只要1 KB RAM;
②1次僅支持1個(gè)存儲(chǔ)介。
FatFs和Tiny—FatFs的用法一樣,僅僅是包含不同的頭文件即可,非常方便,本文主要介紹Tiny-FatFs.
1 Tiny-FatFs
1.1 移植前的準(zhǔn)備
FatFs Module一開(kāi)始就是為了能在不同的單片機(jī)上使用而設(shè)計(jì)的,所以具有良好的層次結(jié)構(gòu),如圖1所示。最頂層是應(yīng)用層,使用者無(wú)需理會(huì)FatFs Module的內(nèi)部結(jié)構(gòu)和復(fù)雜的FAT協(xié)議,只需要調(diào)用FatFs Module提供給用戶的一系列應(yīng)用接口函數(shù),如f_open,f_read,f_write、f_close等,就可以像在PC上讀/寫文件那樣簡(jiǎn)單。
中間層FatFs Module實(shí)現(xiàn)了FAT文件讀/寫協(xié)議。FatFs Module的完全版提供的是ff.c、ff.h,簡(jiǎn)化版Tiny—FatFs提供的是tff.c、tff.h。除非有必要,使用者一般不用修改,使用時(shí)將需要版本的頭文件直接包含進(jìn)去即可。
需要使用者編寫移植代碼的是FatFs Module提供的底層接口,它包括存儲(chǔ)媒介讀/寫接口DiskIO和供給文件創(chuàng)建修改時(shí)間的實(shí)時(shí)時(shí)鐘。
本移植硬件平臺(tái)使用型號(hào)為ATmegal28的AVR單片機(jī)和SD卡。ATmegal28是一種8位RISC單片機(jī),具有多達(dá)4 KB的RAM、128 KB的內(nèi)部Flash和豐富的外設(shè)。軟件平臺(tái)是WINAVR,具有代碼優(yōu)化能力強(qiáng)和完全免費(fèi)的優(yōu)點(diǎn)。
1.2 移植步驟
1.2.1 編寫SPI和SD卡接口代碼
本文使用SD卡的SPI通信模式。SD卡的DI接MOSI,DO接MISO,CS接SS。這就需要ATmegal28提供SPI讀/寫接口代碼,主要包括初始化、讀和寫。SPI初始化包括SPI相關(guān)寄存器的初始化和相關(guān)I/O口的初始化。將ATmega 128的SPI配置成主機(jī)模式、數(shù)據(jù)高位先傳、時(shí)鐘速率為二分之一系統(tǒng)時(shí)鐘等。代碼如下:
SPCR=(O<<SPIE)|
(1<<SPE)|
(O<<DORD) |
(1<<MSTR)|
(O<<CPOL) |
(O<<CPHA)|
(O<<SPR1) |
(O<<SPRO);
SPSR|=(1<<SPI2X);
接著配置I/O口的輸入/輸出。MOSI腳和Ss腳配置成輸出,MISO腳配置成輸入。然后,就可以進(jìn)行讀/寫了。
讀1個(gè)字節(jié)的SPI接口代碼:
static BYTE rcvr_spi(void){
SPDR=OxFF;
loop_until_bit_is_set(SPSR,SPIF);
return SPDR;
}
寫1個(gè)字節(jié)的SPI接口代碼:
static void xmit_spi(BYTE dat){
SPDR=dat;
loop_until_bit_is_set(SPSR,SPIF)
}
在具備SPI讀/寫接口的基礎(chǔ)上編寫SD卡接口代碼,需要編寫3個(gè)基本接口函數(shù):
①向SD卡發(fā)送1條命令:
Static BYTE send-cmd(BYTE cmd,DWORD arg);
②向SD卡發(fā)送1個(gè)數(shù)據(jù)包:
Static BOOL xmit—datablock(const BYTE *buff,BYTE token);
③從SD卡接收1個(gè)數(shù)據(jù)包:
static BCK]L rcvr-datablock(BYTE*buff,UINT btr);
1.2.2 編寫DiskIO
編寫好存儲(chǔ)媒介的接口代碼后,就可以編寫DiskIO了,DiskIO結(jié)構(gòu)如圖2所示。
Tiny—FatFs的移植實(shí)際上需要編寫6個(gè)接口函數(shù),分別是:
①DSTATUS disk_initialize(BYTE drv);
存儲(chǔ)媒介初始化函數(shù)。由于存儲(chǔ)媒介是SD卡,所以實(shí)際上是對(duì)SD卡的初始化。drv是存儲(chǔ)媒介號(hào)碼,由于Tinv—FatFs只支持一個(gè)存儲(chǔ)媒介,所以drv應(yīng)恒為O。執(zhí)行無(wú)誤返回0,錯(cuò)誤返回非O。
②DSTATUS disk_status(BYTE drV);
狀態(tài)檢測(cè)函數(shù)。檢測(cè)是否支持當(dāng)前的存儲(chǔ)媒介,對(duì)Tinv—FatFs來(lái)說(shuō),只要drv為0,就認(rèn)為支持,然后返回O。
③DRESULT disk_read(BYTE drv,BYTE*buff,DWORD sector,BYTE.count);
讀扇區(qū)函數(shù)。在SD卡讀接口函數(shù)的基礎(chǔ)上編寫,*buff存儲(chǔ)已經(jīng)讀取的數(shù)據(jù),sector是開(kāi)始讀的起始扇區(qū),count是需要讀的扇區(qū)數(shù)。1個(gè)扇區(qū)512個(gè)字節(jié)。執(zhí)行無(wú)誤返回O,錯(cuò)誤返回非0。
④DRESULT disk_write(BYTE drv,const BYTE*buff,DWORD sector,BYTE count);
寫扇區(qū)函數(shù)。在SD卡寫接口函數(shù)的基礎(chǔ)上編寫,*buff存儲(chǔ)要寫入的數(shù)據(jù),sector是開(kāi)始寫的起始扇區(qū)count是需要寫的扇區(qū)數(shù)。1個(gè)扇區(qū)512個(gè)字節(jié)。執(zhí)行無(wú)誤返回O,錯(cuò)誤返回非0。
⑤DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff);
存儲(chǔ)媒介控制函數(shù)。ctrl是控制代碼,*buff存儲(chǔ)或接收控制數(shù)據(jù)。可以在此函數(shù)里編寫自己需要的功能代碼,比如獲得存儲(chǔ)媒介的大小、檢測(cè)存儲(chǔ)媒介的上電與否存儲(chǔ)媒介的扇區(qū)數(shù)等。如果是簡(jiǎn)單的應(yīng)用,也可以不用編寫,返回O即可。
⑥D(zhuǎn)WORD get_fattime(Void);
實(shí)時(shí)時(shí)鐘函數(shù)。返回一個(gè)32位無(wú)符號(hào)整數(shù),時(shí)鐘信息包含在這32位中,如下所示:
bit31:25 年(O..127)從1980年到現(xiàn)在的年數(shù)
bit24:21 月(1…12)
bit20:16 日(1..31)
bitl5.1] 時(shí)(O..23)
bitl0:5 分(O..59)
bit4:0 秒/2(0..29)
如果用不到實(shí)時(shí)時(shí)鐘,也可以簡(jiǎn)單地返回一個(gè)數(shù)。正確編寫完DiskIO,移植工作也就基本完成了,接下來(lái)的工作就是對(duì)Tiny—FatFs進(jìn)行配置。
2 Tiny—FatFs的配置
Tiny—FatFs是一款可配置可裁減的文件系統(tǒng),使用者可以選擇自己需要的功能。Tiny—FatFs總共有5個(gè)文件,分別是tff.c、tff.h、diskio.c、diskio.h和integer.h。tff_c和integer.h一般不用改動(dòng),前面的移植工作主要更改的是diskio.c,而配置Tiny—FatFs則主要修改tff.h和diskio.h。
在diskio.h中,使用者可以根據(jù)需要使能disk—write或disk_ioetl。以下代碼使能disk_write和disk_ioctl:
#define—R'EADONLY 0
#define—USE_IOCTL 1
在tff.h中,使用者可以根據(jù)需要對(duì)整個(gè)文件系統(tǒng)進(jìn)行全面的配置:
① #define_MCU_ENDIAN。有1和2兩個(gè)值可設(shè),默認(rèn)情況下設(shè)1,以獲得較好的系統(tǒng)性能。如果單片機(jī)是大端模式或者設(shè)為1時(shí)系統(tǒng)運(yùn)行不正常,則必須設(shè)為2。
② #define_FS_READONLY。設(shè)為1時(shí)將使能只讀操作,程序編譯時(shí)將文件系統(tǒng)中涉及寫的操作全部去掉,以節(jié)省空間。
③#define_FS_MINIMIZE。有0、1、2、3四個(gè)選項(xiàng)可設(shè)。設(shè)0表示可以使用全部Tiny-FatFs提供的用戶函數(shù);設(shè)1將禁用f_stat、f_getfree、f_unlink、f_mkdir、f_chmod和f_rename;設(shè)2將在1的基礎(chǔ)上禁用f_opendir和f_readdir;設(shè)3將在1和2的基礎(chǔ)上再禁用f_lseek。使用者可以根據(jù)需要進(jìn)行裁減,以節(jié)省空間。
3 TINY-FatFs 的讀/寫測(cè)試
Tiny-FatFs的功能很強(qiáng)大,提供了豐富而易于使用的用戶接口函數(shù),如圖3所示。
Tiny—FatFs的功能很全,本文僅測(cè)試f_mount、f_open、f_read、f_write和f_close五個(gè)函數(shù)來(lái)讀一個(gè)3.4 MB的文件和寫一個(gè)1MB的文件,文件名分別為testl.dat和test2.dat。主要代碼如下:
經(jīng)過(guò)實(shí)際測(cè)試,在單片機(jī)系統(tǒng)時(shí)鐘為11.059 2 MHz下讀一個(gè)3.4 MB文件耗時(shí)約20 s,平均約170 KB/s;寫一個(gè)1 MB文件耗時(shí)約6s,平均約166 KB/s,在資源有限的單片機(jī)系統(tǒng)下這個(gè)讀/寫速度是相當(dāng)令人滿意的。綜上所述,F(xiàn)atFs Module具有容易移植、功能強(qiáng)大和易于使用的優(yōu)點(diǎn),適用于小型嵌入式系統(tǒng);又是完全的免費(fèi)和開(kāi)源,也可以用于教育科研及其商業(yè)用途。 |