解决CubMax长文件名报错技巧,CubMax使用FATFS长文件名出现Error: L6406E: No space in execution regions with .ANY selector

目录

报错现象

问题根源分析(举例模式1)

解决方案


报错现象

        当在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”(关键步骤!!!)

然后编译就没报错了,并且支持长文件名写入!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值