改写一个程序,不知道怎么改的,改着改着,
结果原来的程序就不好使了。出现如下错误:
*** 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段定义了,不会出现堆栈溢出问题,不过这样就不是线程安全的了。