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	0
#define	_SYNC_t			int


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

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


#define _FS_REENTRANT	1
#define	_SYNC_t			xSemaphoreHandle

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


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

你可能感兴趣的:(stm32)