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

📄 osfile.c

📁 arm7 zlg lpc2219 bootloader
💻 C
📖 第 1 页 / 共 3 页
字号:
** 功能描述: 增加一个底层驱动程序
**
** 输 入: DiakCommand:驱动程序接口函数
**
** 输 出: NOT_RUN:没有执行
**        RETURN_OK:执行成功
** 全局变量: 
** 调用模块: OSQPost
**
** 作 者: 陈明计
** 日 期: 2003年12月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------



********************************************************************************************************/
        uint8 OSAddFileDriver(uint16  (* DiakCommand)(uint8 Cammand, void *Parameter), void *RsvdForLow)
{
    OSFileParameter Temp;
    uint8 err, ThisRt;

    Temp.P1.Pvp = (void *)DiakCommand;
    Temp.P2.Pvp = RsvdForLow;
    Together(OS_AddFileDriver, NOT_RUN, RETURN_OK);
}

/*********************************************************************************************************
** 函数名称: OSRemoveFileDriver
** 功能描述: 删除一个底层驱动程序
**
** 输 入: Drive:逻辑驱动器号
**
** 输 出: 无
**         
** 全局变量: 
** 调用模块: OSQPost
**
** 作 者: 陈明计
** 日 期: 2003年12月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSRemoveFileDriver(uint16  (* DiakCommand)(uint8 Cammand, void *Parameter))
{
    OSFileParameter Temp;
    uint8 err, ThisRt;

    Temp.P1.Pvp = (void *)DiakCommand;
    Together(OS_RemoveFileDriver, NOT_RUN, RETURN_OK);
}




/*********************************************************************************************************/




/*********************************************************************************************************
** 函数名称: OSAllCacheWriteBack
** 功能描述: 把所有已改变的扇区写回逻辑盘
**
** 输 入: 无
**
** 输 出: NOT_RUN:没有执行
**        RETURN_OK:执行成功
**         
** 全局变量: 
** 调用模块: OSQPost
**
** 作 者: 陈明计
** 日 期: 2003年12月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
       uint8 OSAllCacheWriteBack(void)
{
    OSFileParameter Temp;
    uint8 err, ThisRt;

    Together(OS_AllCacheWriteBack, NOT_RUN, RETURN_OK);
}

/*********************************************************************************************************
** 函数名称: OSGetDirClusIndex
** 功能描述: 获取指定目录的开始簇号
**
** 输 入: 目录字符串
**
** 输 出: 簇号:没有执行
**
**         
** 全局变量: 
** 调用模块: OSQPost
**
** 作 者: 陈明计
** 日 期: 2003年12月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
       uint32 OSGetDirClusIndex(char *Path)
{
    OSFileParameter Temp;
    uint32 ThisRt;
    uint8 err;
    
    Temp.P1.cp = Path;

    Together(OS_GetDirClusIndex, BAD_CLUS, Temp.P1.Puint32);
}


/*********************************************************************************************************/




/*********************************************************************************************************
** 函数名称: OSFileTask
** 功能描述: 文件系统服务任务
**
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 
** 调用模块: OSQPost
**
** 作 者: 陈明计
** 日 期: 2003年12月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年3月11日
**------------------------------------------------------------------------------------------------------



********************************************************************************************************/

        void OSFileTask(void *pdata)
{
    uint8 err;
    uint16 CacheIndex;
    unsigned int i, j;
    OSFileParameter *Command;
    uint32 *Save;
    Disk_Info *Info;
    
    extern Disk_Info DiskInfo[MAX_DRIVES]; 
    extern uint8 CurrentDrive;
    
    extern Disk_cache DiskCache[MAX_DISK_CACHES];
    pdata = pdata;
    
    for (i = 0; i < OS_LOWEST_PRIO; i++)
    {
        for (j = 0; j < MAX_DRIVES; j++)
        {
            PathSave[i][j] = 0;
        }
        DriveSave[i] = 0;
    }
    
    DiskInit();                                         /* 初始化磁盘管理模块 */
    FileInit();                                         /* 初始化文件系统 */
    FileCommad = OSQCreate(OSFileQ, FILE_Q_SIZE);       /* 初始化命令队列 */
    CacheIndex = 0;
    while (1)
    {
        Command = (OSFileParameter *)OSQPend(FileCommad, 1, &err);    /* 等待命令 */
        if (err == OS_TIMEOUT)
        {
            if ((DiskCache[CacheIndex].Flag & CACHE_WRITED) != 0)
            {
                CacheWriteBack2(CacheIndex);            /* 回写cache */
            }
            
            CacheIndex++;
            if (CacheIndex >= MAX_DISK_CACHES)
            {
                CacheIndex = 0;
            }
            continue;
        }

        if (err == OS_NO_ERR)
        {
            Save = Command->PathSave;
            CurrentDrive = *(Command->DriveSave);
            Info = DiskInfo;
            i = MAX_DRIVES;
            do
            {
                Info->PathClusIndex = *Save++;
                Info++;
            } while( --i != 0);
            /* 实际执行各种操作  */
            switch(Command->Command)
            {
                case OS_RemoveFile:             /* 删除文件 */
                    Command->P1.Puint8 = RemoveFile(Command->P1.cp);
                    break;
                case OS_FileOpen:               /* 打开文件 */
                    Command->P1.Handle = FileOpen(Command->P1.cp, Command->P2.cp);
                    break;
                case OS_FileClose:              /* 关闭文件 */
                    Command->P1.Puint8 = FileClose(Command->P1.Handle);
                    break;
                case OS_FileGetCh:              /* 从文件中读一个字节数据 */
                    Command->P1.Puint8 = FileGetCh(Command->P1.ucp, Command->P2.Handle);
                    break;
                case OS_FileRead:               /* 从文件中读数据 */
                    Command->P1.Puint32 = FileRead(Command->P1.Pvp, Command->P2.Puint32, Command->P3.Handle);
                    break;
                case OS_FilePutCh:              /* 写一个直接数据到文件 */
                    Command->P1.Puint8 = FilePutCh(Command->P1.Puint8, Command->P2.Handle);
                    break;
                case OS_FileWrite:              /* 写数据到文件 */
                    Command->P1.Puint32 = FileWrite(Command->P1.Pvp, Command->P2.Puint32, Command->P3.Handle);
                    break;
                case OS_FileCloseAll:           /* 关闭所有文件 */
                    FileCloseAll();
                    break;
                case OS_FileEof:                /* 判断文件是否结束 */
                    Command->P1.Puint8 = FileEof(Command->P1.Handle);
                    break;
                case OS_FileSeek:               /* 调整文件指针 */
                    Command->P1.Puint8 = FileSeek(Command->P1.Handle, Command->P2.Puint32, Command->P3.Puint8);
                    break;
                case OS_MakeDir:                /* 建立目录 */
                    Command->P1.Puint8 = MakeDir(Command->P1.cp);
                    break;
                case OS_RemoveDir:              /* 删除空目录 */
                    Command->P1.Puint8 = RemoveDir(Command->P1.cp);
                    break;
                case OS_ChangeDir:              /* 改变当前目录 */
                    Command->P1.Puint8 = ChangeDir(Command->P1.cp);
                    break;
                case OS_GetDrive:               /* 获取逻辑盘内部表示法 */
                    Command->P1.Puint8 = GetDrive(Command->P1.cp);
                    break;
                case OS_ChangeDrive:            /* 改变当前逻辑盘 */
                    Command->P1.Puint8 = ChangeDrive(Command->P1.cp);
                    break;
                case OS_mount:                  /* 加载卷 */
                    Command->P1.Puint8 = mount(Command->P1.cp);
                    break;
                case OS_umount:                 /* 卸载卷 */
                    Command->P1.Puint8 = umount(Command->P1.cp);
                    break;
                case OS_GetFDTInfo:             /* 获取指定fdt信息 */
                    Command->P1.Puint8 = GetFDTInfo(Command->P1.Pvp, Command->P2.Puint8, Command->P3.Puint32, Command->P4.Puint32);
                    break;
                case OS_AddFileDriver:          /* 增加底层驱动 */
                    AddFileDriver((uint16  (*)(uint8 Cammand, void *Parameter))Command->P1.Pvp, Command->P2.Pvp);
                    break;
                case OS_RemoveFileDriver:       /* 删除底层驱动 */
                    RemoveFileDriver((uint16  (*)(uint8 Cammand, void *Parameter))Command->P1.Pvp);
                    break;
                case OS_AllCacheWriteBack:      /* 同步cache与逻辑盘 */
                    AllCacheWriteBack();
                    break;
                case OS_GetDirClusIndex:
                    Command->P1.Puint32 = GetDirClusIndex(Command->P1.cp);
                    break;
                default:
                    Command->P1.Puint8 = BAD_COMMAND;
                    break;
            }
            Save = Command->PathSave;
            Info = DiskInfo;
            i = MAX_DRIVES;
            do
            {
                *Save++ = Info->PathClusIndex;
                Info++;
            } while (--i != 0);
            *(Command->DriveSave) = CurrentDrive;
            OSMboxPost(Command->Rt, (void *)1);             /* 返回操作结果 */
            continue;
        }
    }
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -