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

📄 smallfilesystem.c

📁 可移到ucos上的文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
/******************************************************************************
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: 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 + -