📄 smallfilesystem.c
字号:
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
/******************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: SmallFileSystem.c
**创 建 人: 万健
**最后修改日期: 2003年8月26日
**描 述: 在uC/COS 内核上的文件系统
**版本信息 :1.0
*******************************************************************************/
#pragma large
#include "\app\includes.h"
#include <string.h>
#if OS_FILE_SYSTEM_EN
stru_FAT16 xdata FAT16[NUMBER_OF_CLUSTER_IN_FAT16+1]; //内存中的文件分配表,此表要和FLASH中的0簇保持同步更新
OS_MEM *FILE_Ptr; //临时文件缓冲区的内存指针
INT8U FileTmPBuf[NUMBER_OF_FILE_BUF][sizeof(FILE)]; //临时文件缓冲区的内存空间
//说明: 以下两个函数是存储器的驱动程序,可以根据具体的存储器编程
/*********************************************************
function: 写flash
input: SBuf[], 待写数据
NumberOfCluster 目标地址的簇号
output: 写成功,返回True ; 否则返回False
description: 把数据写入flash中的指定簇中。只能一簇一簇地写
auther: 万健
**********************************************************/
extern INT8U Write_Flash(void *SBuf,INT16U NumberOfCluster) reentrant;
/*********************************************************
function: 读flash
input: TBuf[], 保存数据
NumberOfCluster 目标地址的簇号
output: 返回实际读取的字节数量
description: 从flash的指定地址中读取指定簇的数据。只能一簇一簇地读
auther: 万健
**********************************************************/
extern INT16U Read_Flash(void *TBuf,INT16U NumberOfCluster)reentrant ;
/**********************************************************************************
function: 初始化文件系统
input :filename 文件名
OpenMode 打开模式
output : 操作成功 返回 True
操作失败 返回 False
desciption: 初始化文件系统
auther: 万健
***********************************************************************************/
INT8U initOSFile()
{
INT8U err;
FILE_Ptr = OSMemCreate(FileTmPBuf,NUMBER_OF_FILE_BUF,sizeof(FILE),&err); //初始化临时文件缓冲区
if(FILE_Ptr == NULL)
return False;
if( Read_Flash( FAT16,0) != CLUSTER_BLOCK_SIZE) //读取文件分配表
return False;
return True;
}
/**********************************************************************************
function: 格式化文件系统
input : 无
output : 操作成功 返回 True
操作失败 返回 False
desciption: 格式化文件系统
auther: 万健
***********************************************************************************/
INT8U formatOSFile(void)
{
memset(FAT16,0,sizeof(FAT16));//把内存中的文件分配表全部清0
if( Write_Flash( FAT16, 0) == 0) //把内存中的文件分配表写进FLASH的0簇。
return False;
return True;
}
/**********************************************************************************
function: 新建文件
input :filename 文件名
fileExName 文件扩展名
output : 操作成功 返回 True
操作失败 返回 False
description: 新建文件
auther: 万健
***********************************************************************************/
INT8U NewOSFile(char fileName[],char fileExName[])
{
INT16U i;
for(i = 1; i < NUMBER_OF_CLUSTER_IN_FAT16; i++) //i从1开始,0簇是留给分配表的
{ //在文件分配表中查找有没有同名的文件
if(memcmp(fileName, FAT16[i].FileName, 8) == 0) //比较文件名
if(memcmp(fileExName,FAT16[i].FileExName,3)==0)//比较扩展名
return False;
}
for(i = 1; i < NUMBER_OF_CLUSTER_IN_FAT16; i++) //i从1开始,0簇是留给分配表的
{
if(FAT16[i].status == 0) //查找文件分配表,找空白簇
break;
}
if(i == NUMBER_OF_CLUSTER_IN_FAT16 )
return False; //分配表已满,没有空白簇
FAT16[i].IsLock = 0; //文件没打开
FAT16[i].status = 1; //这是本文件的第一簇
memcpy( FAT16[i].FileName, fileName, 8); //文件名拷贝
memcpy( FAT16[i].FileExName, fileExName,3); //拷贝扩展名
FAT16[i].SizeOfFile = 0; //文件字节数为0
FAT16[i].NextCluster = 0xff; //是本文件的最后一簇
if( Write_Flash( FAT16, 0) == False) //把内存中的文件分配表写进FLASH的0簇。
return False;
else return True;
}
/**********************************************************************************
function: 删除文件
input :filename 文件名
fileExName 文件扩展名
output : 操作成功 返回 True
操作失败 返回 False
description: 删除文件
auther: 万健
***********************************************************************************/
INT8U DelOSFile(char fileName[],char fileExName[])
{
INT16U i, nextCluster;
for(i = 1; i < NUMBER_OF_CLUSTER_IN_FAT16; i++) //i从1开始,0簇是留给分配表的
{ //在文件分配表中查找同名的文件
if(FAT16[i].status == 1) //只查找文件的第一簇
if(FAT16[i].IsLock == 0) //只查找未打开的文件; 打开的文件不允许删除
if(memcmp(fileName, FAT16[i].FileName, 8) == 0)//比较文件名
if(memcmp(fileExName,FAT16[i].FileExName,3)==0)//比较扩展名
{
break;
}
}
if(i == NUMBER_OF_CLUSTER_IN_FAT16)
return False; //没找到,返回。
nextCluster = FAT16[i].NextCluster; //取得下一簇的号码
memset(&FAT16[i], 0, sizeof(stru_FAT16)); //分配表中的本记录清0
while(1)
{
if(nextCluster == 0xff) break; //判断是否是最后一簇
if(nextCluster == 0) break; //0簇是分配给分配表的,不能占用
if(nextCluster >= NUMBER_OF_CLUSTER_IN_FAT16) break; //判断下一簇的簇号是否超界
nextCluster = FAT16[nextCluster].NextCluster; //取得下一簇的号码
memset(&FAT16[nextCluster], 0, sizeof(stru_FAT16)); //分配表中的本记录清0
}
return True;
}
/**********************************************************************************
function: 打开文件
input :filename 文件名
fileExName 文件扩展名
OpenMode 打开模式 01读取 02写入
output : FILE * 文件句柄
description: 打开文件
auther: 万健
***********************************************************************************/
FILE* OpenOSFile(char filename[],char fileExName[],INT32U OpenMode)
{
INT8U i,err;
FILE *theFile;
//找到指定的文件名
//定位首簇的位置 i
for(i = 1; i < NUMBER_OF_CLUSTER_IN_FAT16; i++)//i从1开始,0簇是留给分配表的
{
if(FAT16[i].status == 1) //只查找文件的第一簇
if(FAT16[i].IsLock == 0) //只查找未打开的文件; 打开的文件不允许再打开
if(memcmp(filename, FAT16[i].FileName, 8) == 0)//比较文件名
if(memcmp(fileExName,FAT16[i].FileExName,3)==0)//比较扩展名
{
break;
}
}
if(i == NUMBER_OF_CLUSTER_IN_FAT16)
return NULL; //没找到,返回。
//分配缓冲区
theFile = OSMemGet(FILE_Ptr, &err);
if(err != OS_NO_ERR)
return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -