Fatfs文件系统崩溃问题

用cortex m3+Freertos+fatfs+lwip做项目,在功能少的时候没出现这个问题,后来不断增加功能,出现一个非常严重的问题,

那就是整个文件系统崩溃了,里面的文件全部被破坏。


出现问题肯定要解决的,只是因为功能多了,再加上第一次使用操作系统,给解决问题带来了很大的困难。花了两个星期,在很多

地方增加串口打印输出,最后得到的结论是多线程共同操作文件,造成底层的操作不完整,举个例子来说,本来一个低优先级的任

务在读内容,要发1个字节,才发送4位,还有4位没发送,却被一个高优先级的任务给抢去了,它又发送一个字节,这些就全乱了

出现任何问题都有可能。


好了,问题根源找到了,接下来就是解决问题。


在网上找资料,发现fatfs提供了多线程共享机制,只需修改一个文件,和两个宏定义即可完成。


先说修改的文件,这个文件默认名为syscall.c,默认写了几个平台的实现代码,修改时只需根据自己使用的操作系统实现即可,

拿一个函数的修改举例:

int ff_cre_syncobj (	/* 1:Function succeeded, 0:Could not create due to any error */
	BYTE vol,			/* Corresponding logical drive being processed */
	_SYNC_t* sobj		/* Pointer to return the created sync object */
)
{
	int ret;


// 	*sobj = CreateMutex(NULL, FALSE, NULL);		/* Win32 */
// 	ret = (int)(*sobj != INVALID_HANDLE_VALUE);

//	*sobj = SyncObjects[vol];		/* uITRON (give a static created semaphore) */
//	ret = 1;

//	*sobj = OSMutexCreate(0, &err);	/* uC/OS-II */
//	ret = (int)(err == OS_NO_ERR);

	*sobj = xSemaphoreCreateMutex();	/* FreeRTOS */
	ret = (int)(*sobj != NULL);

	return ret;
}

因为我使用的是Freertos系统,所以将前三个实现方式注释掉(删掉也行),因为它们是其他操作系统的实现方式。其他函数

也用类似方式实现。要注意的是别忘了增加对应头文件。


文件的修改方式就是这样的,但这样还不能用,还要修改两个宏定义,这两个宏在文件名为ffconfig.h的文件当中,默认分别是

#define _FS_REENTRANT<span style="white-space:pre">	</span>0
#define	_SYNC_t			int


第一个宏表示是否允许文件重入,这里要设置为允许,所以将0改为1。第二个宏表示的是信号的类型名,因为Freertos的信号类型

名是xSemaphoreHandle,所以要将int修改为xSemaphoreHandle,那么最后结果就是:


#define _FS_REENTRANT<span>	</span>1
#define<span style="white-space:pre">	</span>_SYNC_t<span style="white-space:pre">			</span>xSemaphoreHandle

依然别忘记了增加对应头文件。


这样修改程序后就没出现文件崩溃问题了。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
FATFS文件系统是一种在FAT文件系统基础上进行了封装和简化的文件系统FATFS文件系统的原理是通过使用FAT表来索引和定位磁盘中的文件数据。FAT表是一种链式结构,类似于一本书的目录,用于记录文件的存储位置和状态。FAT文件系统将目录也抽象为文件,以简化对数据的管理。 在FATFS文件系统中,用户无需了解FATFS的内部结构和复杂的FAT协议,只需要调用提供的应用接口函数(如f_open,f_read,f_write和f_close等),就可以像在PC上读写文件一样简单地进行操作。FATFS文件系统将文件的存储组织为簇链式数据结构,文件被分成一系列的数据簇进行存储。 FAT文件系统的目录结构是一颗从根到叶的有向树,根目录是整个目录结构的入口。跟目录的位置在格式化时就已经确定,通常紧随FAT表之后,大小为32个扇区。根据根目录的位置,FAT文件系统可以寻址其他文件和文件夹。 FAT文件系统将目录(文件夹)当作一个特殊的文件来处理,在FAT16中,根目录的组织形式和普通的目录并没有不同,而在FAT32中,根目录也被当作文件处理。目录文件实际上是一个存放其他文件和文件夹入口参数的数据表,其占用空间的大小并不等同于其下所有数据的大小,但也不为0。目录文件以32个字节为单位进行簇的分配,每个字节偏移定义一个文件或文件夹的属性,形成一个简单的二维表。 总的来说,FATFS文件系统通过使用FAT表和目录文件来管理文件的索引和定位,为用户提供了简单而方便的文件操作接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值