用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

基于CC/CCS的Flash文件系统设计

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:25:39
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位准备好*/

}

源代码见网站www.dpj.com.cn。

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判断文件是否打开,

上一页  [1] [2] [3]  下一页

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:23,359.38000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号