📄 file.c
字号:
/*
*********************************************************************************************************************
* 东软培训中心教学项目:基于ARM和uc/os-II的PDA系统
*
* (c) Copyright 2005, 东软培训中心
* All Rights Reserved
*
* 模块名称:文件操作模块
* 文件名:FILE.C
* 作者:朱成果
* 时间:2005年9月20日
* 版本:V0.01
**********************************************************************************************************************
*/
#include "driven.h"
#include "uhal.h"
FILECNT flashfile;
RECLIST numturm[100];
unsigned char DATABUFF[0x4200];
unsigned char DIRBUFF[528];
int cluster,file_length;
int term_length;
extern void Flash_Reset(void);//flash reset
extern unsigned char Erase_Cluster(unsigned int cluster);
extern void ReadPage(unsigned int block,unsigned int page,unsigned char *pPage);
extern int WritePage(unsigned int block,unsigned int page,U8 *pPage);
/*
**********************************************************************************************************************
* GRTDIRNAME
*
* 作者:朱成果
*
* 时间:2005年10月19日
*
* 描述:从电子硬盘中找到PHONENUM.TXT文件所在的Block。
*
* 参数:无。
*
* 返回值:TRUE:找到文件;FALSE:没有找到;文件长度在外部变量file_length,文件簇号在外部变量cluster。
***********************************************************************************************************************
*/
int GetDirName(void)
{
int i,j;
U8 filename[] = {'P','H','O','N','E','N','U','M','T','X','T'};
U8* pdirname;
BOOL find;
ReadPage(1,5,DIRBUFF);
find = FALSE;
for (j=0;j<16;j++)
{
pdirname = DIRBUFF + j*32;
for (i=0;i<11;i++)
{
if(filename[i] == *pdirname)
pdirname +=1;
else
{
find = FALSE;
break;
}
}
if(i==11)
{
pdirname += 0x0f;
cluster = *(pdirname+1)*256 + *pdirname;
i = *(pdirname+2) + *(pdirname+3)*(1<<8)+ *(pdirname+4)*(1<<16)+ *(pdirname+5)*(1<<24);
find=TRUE;
break;
}
}
flashfile.fileblock = cluster;
flashfile.filesize = i;
return(find);
}
/*
**********************************************************************************************************************
* READFILE
*
* 作者:朱成果
*
* 时间:2005年10月19日
*
* 描述:按缺省文件名PHONENUM.TXT到电子硬盘打开文件,把文件所在Block(16K)全部读到全局缓冲区DATABUFF。
*
* 参数:无。
*
* 返回值:TRUE:找到文件;FALSE:没有找到;文件长度在外部变量file_length,文件簇号在外部变量cluster。
***********************************************************************************************************************
*/
int ReadFile(void)
{
unsigned int i,j;
U8* p;
Flash_Reset();
i=GetDirName();
if (i==FALSE)
{
return(FALSE);
}
j=cluster*2-1;
p=DATABUFF;
for (i=0;i<32;i++)
{
ReadPage(j,i,p);
p += 528;
}
return(TRUE);
}
/*
**********************************************************************************************************************
* WRITEFILE
*
* 作者:朱成果
*
* 时间:2005年10月19日
*
* 描述:把DATABUFF中的数据写到PHONENUM.TXT所在的Block。
*
* 参数:无,要求在调用此函数前把要写入的字节数赋值给全局变量file_length。
*
* 返回值:TRUE:找到文件,文件簇号在外部变量cluster;FALSE:没有找到。
***********************************************************************************************************************
*/
int WriteFile(void)
{
int a;
unsigned int i,j;
unsigned char k;
U8 filename[] = {'P','H','O','N','E','N','U','M','T','X','T'};
U8* pdirname;
U8* p;
Flash_Reset();
i=GetDirName();
if (i==FALSE) //if there is the filename
{
return(i);
}
j=1;
p=flashfile.Buffer; //buffer the control block
for (i=0;i<32;i++)
{
ReadPage(j,i,p);
p += 528;
}
for (j=0;j<16;j++) //find the phonenum.txt only in one cluster
{
pdirname = &flashfile.Buffer[0xa50] + j*32;
for (i=0;i<11;i++)
{
if(filename[i] == *pdirname)
pdirname +=1;
else
break;
}
if(i==11)
{ //put the file length in directory term
pdirname += 0x11;
*pdirname = (U8)file_length&0xff;
*(pdirname+1) = (U8)(file_length>>8)&0xff;
*(pdirname+2) = (U8)(file_length>>16)&0xff;
*(pdirname+3) = (U8)(file_length>>24)&0xff;
break;
}
}
j=1;
k = Erase_Cluster(1); //erase the control block
p=flashfile.Buffer;
for (i=0;i<32;i++) //write back the control block
{
a = WritePage(j,i,p);
p += 528;
}
j=cluster*2-1; //write the file date
k = Erase_Cluster(j);
p=DATABUFF;
for (i=0;i<32;i++)
{
a = WritePage(j,i,p);
p += 528;
}
return(TRUE);
}
//end the file.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -