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

  • Post author:
  • Post category:其他


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

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

*** 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段定义了,不会出现堆栈溢出问题,不过这样就不是线程安全的了。



版权声明:本文为backup88原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。