新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于CC/CCS的Flash文件系統(tǒng)設計

基于CC/CCS的Flash文件系統(tǒng)設計

作者: 時間:2005-02-24 來源:網(wǎng)絡 收藏
摘要:在深入分析TI為開發(fā)DSP提供的RTS.LIB(RTS.SRC為源泉代碼)的基礎上,介紹對自定義的和設備的操作方法;一個簡易的,極大地方便了應用編程。

關鍵詞:DSP

1 概述

在開發(fā)DSP的應用程序過程中,經(jīng)常需要處理一些數(shù)據(jù)文件。這些數(shù)據(jù)文件可以是實際采集到的數(shù)據(jù)集合,也可以是用模擬仿真軟件產(chǎn)生的數(shù)據(jù)集合,一般是以文件的形式存放在主機磁盤上的。一般的開發(fā)環(huán)境(如TI的CCS和CC)都提供了ANSI C標準操作文件格式,如打開一個文件fopen("盤符:路徑文件名",“打開模式”)。嵌入式一般都外掛。我們希望能夠和讀寫主機磁盤文件一樣操作Flash讀寫時序等問題,使應用編程人員可以把精力用在解決實際應用問題上,從而提供一個良好的編程接口。同時,在需要鍵盤、串口等設備的系統(tǒng)中,也希望提供一個簡易的API接口,如從鍵盤得到一個鍵,只需作如下操作,在執(zhí)行fopen("keyboard","讀")后,就可以用fread函數(shù)讀入一個字符。

結(jié)合TI公司提供的DSP開發(fā)環(huán)境(CC針對3X系列,CCS針對5X和6X系列)和實際開發(fā)經(jīng)驗,提供上述問題的解決方案,并成功應用到我們的產(chǎn)品中。

2 文件操作機制

TI公司為其TMS320C3X系列DSP提供了一個開發(fā)環(huán)境Code Composer,配套的C語言編譯器提供了文件的標準操作。在調(diào)試(debug)環(huán)境下,對主機(host)硬盤文件的操作是通過標準的ANSI文件操作格式與主機的通信來完成的。ANSI C I/O操作分為三個等級―high level、low level和Device level。在High level中,標準接口是Fopen和Fwrite等函數(shù);而Low level中是Open和Write等函數(shù)。這三個等級功能用三個表來實現(xiàn)―文件表、流表(實質(zhì)就是內(nèi)存緩沖區(qū)索引)和設備表。文件的打開和關閉等基本屬性在文件表中反應。當打開一個文件時,文件表中便相應增加一個描述該文件的信息單元;同樣,關閉一個文件時,該文件的信息單元從文件表中被刪除。流表提供了對文件的緩沖操作處理,緩沖區(qū)位置和大小等均在流表中記錄。一個文件對應一個流,即緩沖區(qū)。對文件的讀寫就是對緩沖區(qū)的讀寫。當緩沖區(qū)填滿時,再一次性寫入Flash等設備中,避免了對Flash的頻繁操作,延長了Flash的使用壽命。設備包括Flash、硬盤、鍵盤等在設備表中體現(xiàn)。多個流可以對應一個設備,例如在Flash中可以打開多個文件,但是一個設備不能對應多個流。流操作和設備操作是緊密聯(lián)系在一起的。當打開一個文件時,同時給出了該文件在什么設備上操作,再分配一個流。以后對該文件的操作通過流對應的具體設備的驅(qū)動函數(shù)來完成。主機的target任何外設都可被加入進去成為設備表的成員之一。

Code Composer對HOST磁盤文件的操作最終是通過與HOST集成開發(fā)環(huán)境通信的方式來進行。TI提供的RTS.LIB提供兩個函數(shù)與主機通信,writemsg()函數(shù)發(fā)送數(shù)據(jù)和參數(shù)到主機。Readmsg()函數(shù)從主機讀取數(shù)據(jù)到目標機。Code Composer再與主機進行交互,利用主機文件系統(tǒng)的支持,屏蔽了具體的物理地址讀寫問題。在調(diào)試階段,當要在主機上建立文件、讀取文件和存儲數(shù)據(jù)時,只需用標準的ANSI C函數(shù)操作就可以,從而極大方便了編程調(diào)試。

3 Flash文件系統(tǒng)的實現(xiàn)

嵌入式文件系統(tǒng)一般有集中管理文件系統(tǒng),存儲空間的使用信息集中存在存儲器的某個地方,如DOS的FAT,Unix的inode表。線性文件系統(tǒng),又稱為連續(xù)文件系統(tǒng),每個文件相關的所有信息都連續(xù)存放在存儲器中。與集中式文件系統(tǒng)相比,實現(xiàn)更簡單,讀寫更快,特別是將文件的關鍵系統(tǒng)分布存放。日志文件系統(tǒng)順序?qū)懭胛募到y(tǒng)的修改,如同日志記錄一樣,可加速文件寫入和崩潰修復。采用Log唯一結(jié)構,Log包含索引信息、名稱和數(shù)據(jù)。嵌入式系統(tǒng)不可能帶硬盤,一般都是Flash存儲器的。

3.1 Flash特點及其相應處理

Flash的讀操作與普通RAM時序一樣,但是寫和擦除操作則具有自身的特點。同一地址不能同時寫入兩次,必須進行費時的擦除操作。執(zhí)行擦除的方式有三種:一是片擦除,即一次性全部擦除所有內(nèi)容(這個相當于格式化功能,在第一次使用時可以執(zhí)行這種操作);二是塊擦除;三是扇區(qū)擦除。以SST39VF400A為例,塊Block的大小是32KB,扇區(qū)的大小是2KB,塊擦除一次擦除一個塊內(nèi)容;扇區(qū)類似。如果一個文件內(nèi)容被改動,且改動的內(nèi)容不足一個扇區(qū)的話,則更新文件時必須重寫這個扇區(qū)的所有內(nèi)容;在重寫前必須擦除該扇區(qū)的所有內(nèi)容。因此Flash的文件系統(tǒng)不能完全套用已有的文件系統(tǒng),但可以在其基礎上進行改動。Flash能夠擦除的范圍越小,對文件的改動就越小,所執(zhí)行的I/O操作就越小,從而減少I/O時間,提供文件系統(tǒng)的實時性能。我們使用的SST39VF400A的扇區(qū)大小是2KB,也就是2048B(1K=1024)。用常數(shù)定義,#define FileUnit 2048。

3.2 Flash文件系統(tǒng)的層次性

與ANSI C標準相對應,我們將Flash文件系統(tǒng)分為3個層次。第一層次,API層。API層是文件系統(tǒng)與用戶應用程序之間的接口,包含一個與文件函數(shù)相關的函數(shù)庫,如FS_FOpen、FS_Fwrite等,也相當于High Level層。第二層次,文件系統(tǒng)層,即Low Level層。該層處理文件是否存在,打開,關閉和為文件分配相應的緩存等。該層調(diào)用底層驅(qū)動。第三層是Device Level層,就是設備驅(qū)動層。Flash的實際讀寫操作就是在該層進行的,特定的Flash存儲器對應特定的讀寫程序。

3.3 Flash文件信息表的

該表保存Flash中已有文件的屬性,F(xiàn)lash大小和文件的屬性等都在該表中反映出來。該表與Flash中的內(nèi)容保持同步更新,即一個文件最小塊更新完畢時,寫入Flash中。

Flash的空間分配:

①Flash空間,以簇為單位,讀和寫都是一簇,即一個扇區(qū)單位;

②0簇給文件分配表,不被應用文件占用;

③每次文件系統(tǒng)初始化時,把Flash內(nèi)0簇的內(nèi)容讀取到內(nèi)存中,保存在數(shù)組FAT16[]中。

常量定義

#define CLUSTER_BLOCK_SIZE 2048 //每一簇的字節(jié)數(shù)

#define NUMBER_OF_CLUSTER_IN_FAT16 25

//在文件分配表中,一共有多少個簇

#define NUMBER_OF_FILE_BUF 10

//一共有幾個文件緩沖區(qū)

#define MODE_OPEN_FILE_READ 0x01 //讀?。ㄎ募蜷_模式)

#define MODE_OPEN_FILE_WRITE 0x02 //寫入(文件打開模式)

#define MAX_SIZE_OF_FIEL 2048 //文件的最大尺寸

文件結(jié)構體:

typedef struct{

unsigned int IsLock:1;//文件是否被上鎖,=0沒打開;=1已被打開。此標志只在文件的第一簇使用

unsigned int status:7;//簇的狀態(tài),=0,此簇為色,沒使用;=1,此簇是第一簇;=2,此簇不是第一簇

char FileName[8];//文件名,在第一簇有效

char FileExName[3]; //文件擴展名,在第一簇有效

unsigned int SizeOfFile;//文件的字節(jié)數(shù),在第一簇有效

unsigned int NextCluster;//下一簇的簇號。當為0xffffffff時,說明這是當前文件的最后一簇

}FlashFAT;

文件句柄結(jié)構體:

typedef struct{

unsigned int Buffer[CLUSTER_BLOCK_SIZE];//文件緩沖區(qū)

unsigned int fileblock;//文件當前簇的位置

unsigned int filemode;//打開支持的模式

unsigned int filebufnum;//文件緩沖區(qū)中已被/寫的字節(jié)數(shù)

unsigned int fileCurpos;//文件讀寫的當前位置

unsigned int filesize;//文件的大小

}FlashFILE;

3.4 Device Level驅(qū)動函數(shù)

SST39VF400A標準設備級驅(qū)動函數(shù)如下:

void Program_One_Word(WORD SrcWord,WORD far Dst){/*寫入一個字*/

WORD far *Temp;WORD far*SourceBuf;WORD far*DestBuf;

Int Index;DestBuf=Dst;

Temp=(WORD far *)0xC0005555;/*設置地址為C000:555h*/

*Temp=0xAAAA; /*寫數(shù)據(jù)0xAAAA到此地址*/

Temp=(WORD far *)0xC0002AAA;/*設置地址為C000:2AAAh*/

*Temp=0x5555;/*寫數(shù)據(jù)0x5555到此地址*/

Temp=(WORD far*)0xC0005555;/*設置地址為C000:5555h*/

*Temp=0xA0A0;/*寫數(shù)據(jù)0xA0A0到此地址*/

*DestBuf=SrcWord;/*傳送字節(jié)到目的地址*/

Check_Toggle_Ready(DestBuf);/*等待TOGGLF位準備好*/

}

源代碼見網(wǎng)站www.dpj.com.cn。

3.5 Flash文件系統(tǒng)的工作流程

在使用Flash文件系統(tǒng)前,先將FlashROM設備加入設備表中(最開始假設Flash中沒有任何文件),讀入Flash文件表。下面簡述系統(tǒng)工作流程。

(1)加入FlashROM設備

add_device("FlashROM",_MSA,flash_open,flash_close,flash_read,flash_write,flash_lseek,
flash_unlink,flash_rename);

其中flash_open、flash_close、flash_read、flsh_write、flash_lseek、flash_unlink、flash_rename是最底層的

flash驅(qū)動函數(shù)名稱。針對不同的Flash,需要不同的驅(qū)動函數(shù)。

int flash_open(char *path,unsigned flags,int fno);

int flash_close(int fno);

int flash_read(int fno,char *buffer,unsigned count);

int flash_write(int fno,char *buffer,unsigned count);

(2)初始化文件系統(tǒng)

在使用Flash前,必須初始化。初始化臨時文件緩沖區(qū),將Flash的各種信息讀入到系統(tǒng)中,如Flash的大小,存在的文件的名稱、大小、建立日期等,這樣系統(tǒng)才能正確使用Flash.

Init_eFS();/*初始化文件系統(tǒng)函數(shù)*/

(3)執(zhí)行各種文件操作

如果要在Flash上打開一個文件,執(zhí)行fopen("FlashROM:路徑文件名",“打開模式”)就可以了。當打開文件時,先檢查文件表中是否存在該文件。如果沒有,則在Flash文件表中查找是否存在該文件。如果存在,則打開;如果沒有,則新建這樣一個文件,同時打開該文件。隨后就可以進行文件的讀寫、追加、屬性修改等操作。

該Flash文件系統(tǒng)的幾個技術關鍵點:

①利用RTS.LIB(TI附帶有源代碼RTS.SRC)的高級層文件操作功能。該庫已經(jīng)按照ANSI C標準處理了高層文件應用問題。我們可以如同在上位機上編程一樣使用各種文件操作函數(shù),不同的是將盤符改為FlashROM盤符。例如,將fopen("C:ead.txt","r")改為fopen("FlashROM:ead.txt","r")。用這種模式操作Flash,的繁瑣時序處理和扇區(qū)擦除等重復性問題,可以將精力集中到應用編程上來。

②用自的Low Level級代碼接管了RTS.LIB的低層處理。前述的Flash文件信息表是核心,只有通過該表才能知道Flash中究竟有什么,在哪里操作。當在API層操作文件時,高層函數(shù)將調(diào)用相應的底層處理屬數(shù),在Low Level判斷文件是否打開,是否可讀寫等屬性。同時為該文件分配一個內(nèi)緩沖區(qū),所有對該文件的操作先操作緩沖區(qū),即流操作。當緩沖區(qū)滿時,調(diào)用的操作先操作緩沖區(qū),即流操作。當緩沖區(qū)滿時,調(diào)用Device Level級函數(shù),將數(shù)據(jù)寫入Flash中。同樣,讀取的時候,是先讀取一個扇區(qū)內(nèi)容,處理完畢后再讀取下一扇區(qū)內(nèi)容。

操作鍵盤等其它外設相對Flash要簡單得多,不用設計文件信息表。執(zhí)行兩個步驟就可以使用。一是加入設備,調(diào)用add_device(……)函數(shù),填入設備名;二是編寫設備驅(qū)動函數(shù),將對應的函數(shù)名作為參數(shù)傳入add_device()中。在這里要說明的是,不同設備、同樣的操作名其實際含義是不同的。如對鍵盤打開一個字符,則意味著讀入一個字符,因此在實際中應用靈活處理。

結(jié)語

該Flash文件系統(tǒng)實現(xiàn)了基本的文件讀寫功能,但是還有些不足地方:文件共享問題沒有解決,在掉電的情況下可能導致文件丟失。由于我們研制這個Flash系統(tǒng)的目的在于方便編程、調(diào)試;同時在我們的應用領域(電力系統(tǒng)繼電保護)中,掉電的幾率非常低,存儲的文件主要是整定值、控制字(修改不多)和故障濾波記錄。這些數(shù)據(jù)即使丟失也不會造成災難性的后果,故該系統(tǒng)在整體上滿足我們的應用需求。



評論


相關推薦

技術專區(qū)

關閉