论坛» 嵌入式开发» MCU

dosFS+TFFS安全掉电补丁

菜鸟
2008-01-02 09:47 1楼

在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
}

菜鸟
2008-01-02 14:16 2楼
顶!!!!!
菜鸟
2008-01-02 16:55 3楼
莫名其妙。掉电啊!你还执行啥?
菜鸟
2008-01-02 17:50 4楼

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

菜鸟
2008-01-03 11:49 5楼

加在reboot函数中,只能实现热启动
冷启动是没办法的啊

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

意外重启时连掉电中断也收不到,要想万无一失,应该使用带掉电崩溃保护的文件系统。有钱就买一个,不到30W,没钱就移植Yaffs好了。

菜鸟
2008-01-15 21:16 8楼

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

菜鸟
2008-01-21 10:08 9楼

Reliance。可能还有别的,是第三方开发的。你的Vxworks代理商肯定知道,别告送我你的Vxworks也是DB的,如果还来的及,尽早换Linux吧。Reliance可参见http://www.coordinate.com.cn/。我们没买。

菜鸟
2008-01-21 15:03 10楼
锐极 LINUX 驱动培训班定于 08 1 26 29 号开班课程内容: 驱动试验班课程内容课程背景 开放的 Linux 受到广泛的欢迎,得到越来越多公司的支持,但是阻碍 Linux 在各个领域广泛应用的主要因素就是内核/驱动高端人才极度缺乏,Linux源代码中85%是设备驱动,嵌入式系统中驱动程序更为重要,几乎每一个嵌入式系统都是从驱动程序员手中调试出来的。然而面对巨大的市场需求,国内很难找到一家专门系统培训Linux驱动工程师的培训机构,因为培训难度大,对老师的经验和知识面要求高,大部分培训机构的课程仅仅对Linux 浅尝即止,难以达到培养 Linux 高水平人才的目的。
嵌入式linux系统实验班是锐极嵌入式培训中心的金牌课程,本课程融合了讲师多年的项目开发经验,这些经验无疑是学员短期内提升驱动开发水平最有效的捷径。 课程目标 熟练掌握Linux系统下设备驱动程序的开发技术,能够独立在Linux操作系统上开发各种驱动程序,如网卡、声卡、各类协议的驱动开发等。同时对Linux内核能够有较为深入的了解,掌握分析整个内核代码的方法。 培养对象 Linux系统驱动开发工程师、Linux中高级程序设计师以及内核开发人员。希望深入了解嵌入式Linux系统开发的学员。 入学要求 学员学习本课程应具备下列基础知识:
◆熟练使用Linux操作系统;
◆了解Linux内核结构;
◆熟悉C语言编程;
◆具备一定的硬件知识,如各种接口电路。 教材 《《锐极培训中心--嵌入式Linux驱动开发培训讲义》 《ARM&Linux嵌入式系统开发详解》 实验器材RJARM9-EDU 上海锐极培训中心 联系人:李老师 Tel: +86 (21) 52666785 Email-train@ruijitek.com +86 (21) 52667625 www.ruijitek.com Fax: +86 (21) 52666785 www.rjpeixun.com上课地点:华东师范大学科技园 地址:上海市普陀区枣阳路108号1001室
共11条 1/2 1 2 跳转至

回复

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