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

📄 tfsclean3.c

📁 完整的Bell实验室的嵌入式文件系统TFS
💻 C
字号:
/* tfsclean3.c: * *  --- NOT READY YET --- * *  This version of defragmentation is power-hit safe and requires *  that there be double the amount of flash as is needed for use by *  TFS.  The basic idea is similar to tfsclean2.c... *  Copy all of the good files over to the "other" flash bank, then have *  TFS use the "other" bank as the storage area. *  The idea is that the defrag is simply a copy of the good stuff to *  the alternate flash block.  This requires that after the *  good stuff is copied, the now-dirty flash block must be erased in *  the background prior to the next tfsclean() call.  The fact that *  there is no sector erase is what makes this faster. * *  If both of these flash banks are in the same flash device, then *  having a background erase in progress means that it must be an *  interruptible erase (device specific).  This is necessary because *  while the background erase is in progress there may be a need to *  interact with the flash and most devices don't let you do both at the *  same time. *   *  Note that this "background-erase" is what makes this method the *  fastest defrag method.  It does require that the erase operation be *  interruptible, and it requires that the application will provide the *  hooks to do this... * *  General notice: *  This code is part of a boot-monitor package developed as a generic base *  platform for embedded system designs.  As such, it is likely to be *  distributed to various projects beyond the control of the original *  author.  Please notify the author of any enhancements made or bugs found *  so that all may benefit from the changes.  In addition, notification back *  to the author will allow the new user to pick up changes that may have *  been made by other users after this version of the code was distributed. * *  Note1: the majority of this code was edited with 4-space tabs. *  Note2: as more and more contributions are accepted, the term "author" *         is becoming a mis-representation of credit. * *  Original author:    Ed Sutter *  Email:              esutter@lucent.com *  Phone:              908-582-2351 */#include "config.h"#include "cpu.h"#include "stddefs.h"#include "genlib.h"#include "tfs.h"#include "tfsprivate.h"#include "flash.h"#include "monflags.h"#if INCLUDE_TFSinttfsfixup(int verbose, int dontquery){    return(TFSERR_NOTAVAILABLE);}#if DEFRAG_TEST_ENABLEDintdumpDhdr(DEFRAGHDR *dhp){    return(TFSERR_NOTAVAILABLE);}intdumpDhdrTbl(DEFRAGHDR *dhp, int ftot){    return(TFSERR_NOTAVAILABLE);}#endif/* _tfsclean(): *  This is an alternative to the complicated defragmentation above. *  It simply scans through the file list and copies all valid files *  to RAM; then flash is erased and the RAM is copied back to flash. *  <<< WARNING >>> *  THIS FUNCTION SHOULD NOT BE INTERRUPTED AND IT WILL BLOW AWAY *  ANY APPLICATION CURRENTLY IN CLIENT RAM SPACE. */int_tfsclean(TDEV *tdp, int notused, int verbose){    TFILE   *tfp;    uchar   *tbuf;    ulong   appramstart;    int     dtot, nfadd, len, err, chkstat;    if (TfsCleanEnable < 0)        return(TFSERR_CLEANOFF);    appramstart = getAppRamStart();    /* Determine how many "dead" files exist. */    dtot = 0;    tfp = (TFILE *)tdp->start;    while(validtfshdr(tfp)) {        if (!TFS_FILEEXISTS(tfp))            dtot++;        tfp = nextfp(tfp,tdp);    }    if (dtot == 0)        return(TFS_OKAY);    printf("Reconstructing device %s with %d dead file%s removed...\n",        tdp->prefix, dtot,dtot>1 ? "s":"");    tbuf = (char *)appramstart;    tfp = (TFILE *)(tdp->start);    nfadd = tdp->start;    while(validtfshdr(tfp)) {        if (TFS_FILEEXISTS(tfp)) {            len = TFS_SIZE(tfp) + sizeof(struct tfshdr);            if (len % TFS_FSIZEMOD)                len += TFS_FSIZEMOD - (len % TFS_FSIZEMOD);            nfadd += len;            err = tfsmemcpy(tbuf,(uchar *)tfp,len,0,0);            if (err != TFS_OKAY)                return(err);                        ((struct tfshdr *)tbuf)->next = (struct tfshdr *)nfadd;            tbuf += len;        }        tfp = nextfp(tfp,tdp);    }    /* Erase the flash device: */    err = _tfsinit(tdp);    if (err != TFS_OKAY)        return(err);    /* Copy data placed in RAM back to flash: */    err = AppFlashWrite((ulong *)(tdp->start),(ulong *)appramstart,        (tbuf-(uchar*)appramstart));    if (err < 0)        return(TFSERR_FLASHFAILURE);    /* All defragmentation is done, so verify sanity of files... */    chkstat = tfscheck(tdp,verbose);    return(chkstat);}#endif

⌨️ 快捷键说明

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