⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 三星44b0平台开发的PDA系统
💻 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 + -