这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » dosFS+TFFS安全掉电补丁

共4条 1/1 1 跳转至

dosFS+TFFS安全掉电补丁

菜鸟
2008-01-02 09:47:34     打赏

在vxWorks下,经常会遇到突然掉电后,文件系统被破坏,文件不能使用的情况。前几天我做了一个reboot的hook,使用rebootHookAdd增加到reboot函数中后,可以在系统复位前中止正在做写操作的任务,然后关闭文件和文件系统,同步cache,做到安全掉电。代码如下:

#include "vxWorks.h"
#include "private/dosFsVerP.h"
#include "private/dosFsLibP.h"
#include "private/iosLibP.h"
#include "taskLib.h"
#include "intLib.h"

#define DOSFS_REBOOT_HOOK_DEBUG     1
#if DOSFS_REBOOT_HOOK_DEBUG
char *g_pszDbgDosfsHookBuf = 0x6000;
#endif

extern int dosFsDrvNum;
extern int maxDrivers;
extern int maxFiles;
extern DRV_ENTRY *drvTable;

void usrDosfsShutdown()
{
    int iLoop, fdNum, iCount = 0, iStatus = 0;
    DEV_HDR *pDev = NULL;
    DOS_VOLUME_DESC_ID pVolDesc;
    DOS_FILE_DESC_ID pFd = pVolDesc->pFdList;
   
#if DOSFS_REBOOT_HOOK_DEBUG
    int  iCloseFlag = 0;
    char szTmpBuf[1024];
    int  curTick = tickGet();
   
    *(unsigned long *)g_pszDbgDosfsHookBuf = 0;
#endif

    if ((drvTable != NULL)
      &&(dosFsDrvNum != ERROR)&&(dosFsDrvNum < maxDrivers)
      &&(drvTable[dosFsDrvNum].de_inuse == TRUE))
    {
        for (iLoop = 0; iLoop < maxDrivers; iLoop++)
        {
            pDev = iosNextDevGet(pDev);
            if (pDev == NULL)
            {
                break;
            }

            /* All used dosfs function group is dosfs vol */
            if (pDev->drvNum == dosFsDrvNum)
            {
                pVolDesc = (DOS_VOLUME_DESC_ID)pDev;
#if DOSFS_REBOOT_HOOK_DEBUG
                sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                        "Start check volume %s, can open max %d files, have used %d fds.\r\n",
                        pDev->name, pVolDesc->maxFiles, pVolDesc->nBusyFd);
#endif
                iCount = 0;
                for (pFd = pVolDesc->pFdList;
                     pFd < pVolDesc->pFdList + pVolDesc->maxFiles; pFd++)
                {
                    if (pFd->busy == TRUE)
                    {
#if DOSFS_REBOOT_HOOK_DEBUG
                        iCloseFlag = 0;
#endif

                        /* Force dosfs make a mistake, the operating will exit. */
                        pFd->fatHdl.errCode = TRUE;
                        for (fdNum = 0; fdNum < maxFiles; fdNum++)
                        {
                            if ((DOS_FILE_DESC_ID)iosFdValue(fdNum) == pFd)
                            {
#if DOSFS_REBOOT_HOOK_DEBUG
                                strcpy(szTmpBuf, fdTable[STD_MAP(fdNum)].name);
#endif
                                if (close(fdNum) == OK)
                                {
#if DOSFS_REBOOT_HOOK_DEBUG
                                    sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                                            "  Closed %s success(fd==%d).\r\n",
                                            szTmpBuf, fdNum);
#endif
                                    iCount++;
                                    iCloseFlag = TRUE;
                                }
                                else
                                {
#if DOSFS_REBOOT_HOOK_DEBUG
                                    sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                                            "  Close %s failed(fd==%d).\r\n",
                                            szTmpBuf, fdNum);
#endif
                                }
                            }
                        }
#if DOSFS_REBOOT_HOOK_DEBUG
                        if (iCloseFlag == 0)
                        {
                            sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                                    "  Find a file openned, but can't find its fd.");
                        }
#endif
                    }
                }
                iStatus = dosFsVolUnmount(pVolDesc);
#if DOSFS_REBOOT_HOOK_DEBUG
                sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                        "Check volume %s over, closed %d files, unmount volume %s.\r\n",
                        pDev->name,iCount,((iStatus==OK)?"success":"failed"));
#endif
            }
        }
    }
    else
    {
#if DOSFS_REBOOT_HOOK_DEBUG
        sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
                "Can't find dosfs volume!\r\n");
#endif
    }
#if DOSFS_REBOOT_HOOK_DEBUG
    sprintf(g_pszDbgDosfsHookBuf + strlen(g_pszDbgDosfsHookBuf),
            "Check all dosfs volume, cost %d ticks.!\r\n", tickGet() - curTick);
#endif
}




关键词: dosFS+TFFS     安全     掉电     补丁     DOSFS    

菜鸟
2008-01-02 17:50:13     打赏
2楼

当然不是掉电之后运行,是在准备掉电之前,在reboot函数里面增加的一个钩子。使用这个钩子以后可以避免由于掉电时正在做文件写操作突然掉电引起的文件系统异常。这些异常经常是无法恢复的。


菜鸟
2008-01-04 15:40:36     打赏
3楼
楼上正解,我正在想办法让冷启动也能用,初步想法是让硬件做一个电平预警,当发生低电平中断的时候,一般距离cpu不能工作会有1秒左右的时间,在这段时间内,让文件系统写完一个扇区或一个簇正常退出。还在考虑中。

菜鸟
2008-01-15 21:16:23     打赏
4楼

你说的带掉电崩溃的文件系统名字是什么?


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]