1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

    <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
    <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
  2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
    現在位置:范文先生網>理工論文>電子通信論文>基于CC/CCS的Flash文件系統設計

    基于CC/CCS的Flash文件系統設計

    時間:2023-02-21 00:14:23 電子通信論文 我要投稿
    • 相關推薦

    基于CC/CCS的Flash文件系統設計

    摘要:在深入分析TI為開發DSP提供的RTS.LIB(RTS.SRC為源泉代碼)的基礎上,介紹對自定義的文件和設備的操作方法;設計一個簡易的Flash文件系統,極大地方便了應用編程。

        關鍵詞:DSP CC/CCS Flash 文件系統

    1 概述

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

    結合TI公司提供的DSP開發環境CC/CCS(CC針對3X系列,CCS針對5X和6X系列)和實際開發經驗,提供上述問題的解決方案,并成功應用到我們的產品中。

    2 CC/CCS文件操作機制

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

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

    3 Flash文件系統的實現

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

    3.1 Flash特點及其相應處理

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

    3.2 Flash文件系統的層次性

    與ANSI C標準相對應,我們將Flash文件系統

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

    3.3 Flash文件信息表的設計

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

    Flash的空間分配:

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

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

    ③每次文件系統初始化時,把Flash內0簇的內容讀取到內存中,保存在數組FAT16[]中。

    常量定義

    #define CLUSTER_BLOCK_SIZE 2048 //每一簇的字節數

    #define NUMBER_OF_CLUSTER_IN_FAT16 25

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

    #define NUMBER_OF_FILE_BUF 10

    //一共有幾個文件緩沖區

    #define MODE_OPEN_FILE_READ 0x01 //讀取(文件打開模式)

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

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

    文件結構體:

    typedef struct{

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

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

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

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

    unsigned int SizeOfFile;//文件的字節數,在第一簇有效

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

    }FlashFAT;

    文件句柄結構體:

    typedef struct{

    unsigned int Buffer[CLUSTER_BLOCK_SIZE];//文件緩沖區

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

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

    unsigned int filebufnum;//文件緩沖區中已被/寫的字節數

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

    unsigned int filesize;//文件的大小

    }FlashFILE;

    3.4 Device Level驅動函數

    SST39VF400A標準設備級驅動函數如下:

    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; /*寫數據0xAAAA到此地址*/

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

    *Temp=0x5555;/*寫數據0x5555到此地址*/

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

    *Temp=0xA0A0;/*寫數據0xA0A0到此地址*/

    *DestBuf=SrcWord;/*傳送字節到目的地址*/

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

    }

    源代碼見網站m.baimashangsha.com收集整理。

    3.5 Flash文件系統的工作流程

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

    (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驅動函數名稱。針對不同的Flash,需要不同的驅動函數。

    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)初始化文件系統

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

    Init_eFS();/*初始化文件系統函數*/

    (3)執行各種文件操作

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

    該Flash文件系統的幾個技術關鍵點:

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

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

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

    結語

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

    上滿足我們的應用需求。


    【基于CC/CCS的Flash文件系統設計】相關文章:

    車載MP3中Flash文件系統的設計與應用08-06

    嵌入式系統中的線性Flash文件系統設計08-06

    基于虛擬扇區的Flash存儲管理技術08-06

    uClinux下Nor Flash的JFFS2文件系統構建08-06

    適宜于嵌入式多媒體應用的Flash文件系統08-06

    基于標準的教學設計08-06

    DSP+FLASH引導裝載系統的設計與實現08-06

    基于LPC2104的VxWorksBSP設計08-06

    基于DSP平臺的USB接口設計08-06

    国产福利萌白酱精品tv一区_日韩亚洲中字无码一区二区三区_亚洲欧洲高清无码在线_全黄无码免费一级毛片
    1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

      <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
      <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
    2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
      亚洲欧美人另类成在线观看 | 五月丁香激情综合在线观看 | 亚洲图片另类在线日韩 | 中文字幕乱在线伦视频乱在线伦视频 | 欧洲性开放少妇zozo | 亚洲日韩在线视频一区二区 |