STM32下调试FATFS错误记录:*** error 65: access violation at 0x1FFFFEEC : no 'write' permission

改写一个程序,不知道怎么改的,改着改着,

结果原来的程序就不好使了。出现如下错误:

*** error 65: access violation at 0x1FFFFEEC : no 'write' permission

开始上网搜索错误提示,有的解决方法是在debug模式修改debug菜单下的memory map,加入这个0x1FFF0000,0x1FFFFEEC区域。

可是我后来一想,这个肯定不是问题原因。

经过一番Ctrl+z回溯,发现是在main函数中新定义了

FILINFO fileinfo[100]; 

之后,程序就不好使了。

查看FILINFO结构体,发现:

typedef struct {
    FSIZE_t    fsize;            /* File size */
    WORD    fdate;            /* Modified date */
    WORD    ftime;            /* Modified time */
    BYTE    fattrib;        /* File attribute */
#if _USE_LFN != 0
    TCHAR    altname[13];            /* Altenative file name */
    TCHAR    fname[_MAX_LFN + 1];    /* Primary file name */
#else
    TCHAR    fname[13];        /* File name */
#endif
} FILINFO;

如果使用USE_LFN的话,每个结构体变量会占用大量RAM空间,

再继续追溯_USE_LFN

在ff.h中定义:

#define    _USE_LFN    2
#define    _MAX_LFN    128
/* The _USE_LFN switches the support of long file name (LFN).
/
/   0: Disable support of LFN. _MAX_LFN has no effect.
/   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
/   2: Enable LFN with dynamic working buffer on the STACK.
/   3: Enable LFN with dynamic working buffer on the HEAP.

目前是2,也就是说在函数堆栈里定义,而在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。

如果FILINFO使用了 _USE_LFN ,每个FILINFO结构体约超过128字节,之前定义的

FILINFO fileinfo[100]; 

最少占用了128*100字节,导致堆栈溢出。使函数执行时调用参数出错!

问题找到了,改吧!

项目中长文件名还是要用的,

#define    _MAX_LFN    32

项目中FATFS上的文件也存不了多少,

FILINFO fileinfo[20]; 

这样约使用了32*20字节,不会超过1024字节的堆栈大小。

还有一种改正方法:

在ff.h中把:#define    _USE_LFN    2

改为

在ff.h中定义:

#define    _USE_LFN    1

这样FILINFO就在BSS段定义了,不会出现堆栈溢出问题,不过这样就不是线程安全的了。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值