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

📄 _fs_fopen.c

📁 keil arm flash fs 最新版 在Keil arm下使用
💻 C
字号:
/*----------------------------------------------------------------------------
 *      R T L  -  F l a s h   F i l e   S y s t e m
 *----------------------------------------------------------------------------
 *      Name:    _FS_FOPEN.C 
 *      Purpose: Low level File Open Function
 *      Rev.:    V3.22
 *----------------------------------------------------------------------------
 *      This code is part of the RealView Run-Time Library.
 *      Copyright (c) 2004-2008 KEIL - An ARM Company. All rights reserved.
 *---------------------------------------------------------------------------*/

#include <stdio.h>
#include <rt_sys.h>
#include <rt_misc.h>
#include "File_Config.h"

/*--------------------------- __fopen ---------------------------------------*/

int __fopen (const char *fname, int openmode) {
   /* Low level file open function. */
   U32 i,fid;
   int handle;
   IOB *fcb;

   /* Find unused _iob[] structure. */
   if ((handle = fs_find_iob ()) == EOF) {
      /* Cannot find any unused _iob[] structure */
      return (-1);
   }

   fcb = &_iob[handle];
   fcb->drive = fs_get_drive (fname);
   if (fcb->drive != DRV_NONE) {
      /* Skip drive letter 'X:' */
      fname += 2;
   }
   else {
      fcb->drive = _DEF_DRIVE;
   }

   if (openmode & OPEN_PLUS) {
      /* File mode "rw" is currently not supported. */
      goto err;
   }
   fcb->flags = (openmode & (OPEN_W | OPEN_A)) ? _IOWRT : _IOREAD;
   if (openmode & OPEN_A) {
      fcb->flags |= _IOAPPEND;
   }

   if (fcb->drive == DRV_MCARD) {
      /* Open a file on Flash Memory Card. */
      fid = (fat_find_file (fname, fcb) == __TRUE) ? 0 : 1;
   }
   else {
      /* Open a file on Embedded Flash/RAM device. */
      if (fs_set_params (fcb) == __FALSE) {
         goto err;
      }
      fcb->_fidx = 0;
      fid = fs_Find_File (fname, fcb);
   }
   if (fid == 0) {
      /* File with a given 'fname' has been found */
      for (i = 0; i < _NFILE; i++) {
         if (i == handle) {
            continue;
         }
         if (_iob[i].flags & (_IOREAD|_IOWRT)) {
            if ((_iob[i].fileID == fcb->fileID) &&
                (_iob[i]._currDatClus  == fcb->_currDatClus))   {
               /* This file is already opened. */
               if ((_iob[i].flags & _IOWRT) || (fcb->flags & _IOWRT)) {
                  /* Only multiple fopen for read is allowed. */
                  goto err;
               }
            }
         }
      }
      if (fcb->flags & _IOAPPEND) {
         /* Append mode, done here, block appended by _setfpos(). */
         fcb->fsize  = __getfsize (fcb, __TRUE);
         return (handle);
      }

      if (fcb->drive == DRV_MCARD) {
         /* Open a file on Flash Memory Card. */
         if (fcb->flags & _IOWRT) {
            fat_delete (fname, fcb);
            goto mcard;
         }
      }
      else {
         /* Open a file on embedded Flash/RAM Device. */
         if (fcb->flags & _IOWRT) {
            _fdelete (fcb);
            goto fdev;
         }
         /* Open also 0-size file for reading. */
         fcb->_ftop = fcb->_fbot;
      }
      return (handle);
   }
   /* File not found */
   if (fcb->flags & _IOREAD) {
err:  fcb->flags = 0;
      return (-1);
   }

   if (fcb->drive == DRV_MCARD) {
mcard:if (fat_create (fname, fcb) == __FALSE) {
         goto err;
      }
   }
   else {
      /* The max. 'fid' found in previous 'fs_Find_File' is here. */
      fcb->fileID = fs_get_freeID (fid, fcb);
fdev: if (_fcreate (fname, fcb) != 0) {
         goto err;
      }
   }
   return (handle);
}

/*----------------------------------------------------------------------------
 * end of file
 *---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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