目录
报错现象
当在CubMax使能了长文件名后会发现出现了这么一大长串的报错,看到头都大了!!!需要直接解决问题的可以直接看目录最后一步(别忘了点赞加关注【llllll】)
问题根源分析(举例模式1)
1.BSS段溢出:
如果长文件名使能模式选择了模式1(Enable with static working buffer on the BSS),FATFS会定义 一个静态数组作为长文件名缓冲区。这个缓冲区的大小由FF_MAX_LFN定义(默认 255) 每个文件对象都会包含这样一个缓冲区。由于是静态分配,它会占用大量的BSS段空间,可能导致内存溢出,并且该模式会在BSS段声明一个固定大小的长文件名缓冲区,缓冲区大小由FF_MAX_LFN决定(默认255字节)
// 错误本质
// FATFS内部实现(ff.c):
#define _USE_LEN 1
#define _MAX_LEN 255 //(默认255)
#if FF_USE_LFN == 1 // Static buffer on BSS
WCHAR LfnBuf[FF_MAX_LFN + 1]; // 每个文件对象占用256*2=512字节
#endif
这边可以看到会针对每个文件对象生成一个 256 长度的数组
-
默认配置(_FS_LOCK=5 最大同时打开文件个数 = 5)将消耗:5×256×2=25605×256×2=2560字节!!!
-
STM32启动文件默认栈大小仅512字节!!!(查看启动文件
startup_*.s
中的Stack_Size
)内存直接爆炸!!!
解决方案
经过我的实践,如果想要配置长文件名模式且解决报错的方法如下:
1.先使用默认的短文件名模式
2.然后打开文件 “ffconf.h” 找到这两行,改成这样
3.在工程目录下(随便一个地方)创建一个文件,如“ff_Ifn.c”,并写入如上两个文件(因为直接修改宏,CubMax没有给我们生成这两个关键函数,需要我们补充),记住一定要引入“ff.h”(关键步骤!!!)
然后编译就没报错了,并且支持长文件名写入!!