f_open()使用错误记录
一、现象
调用函数 f_open()
后,程序崩溃,调试后发现,单片机产生硬件中断,即软件跳入如下部分:
1 | void HardFault_Handler(void) |
二、错误代码
代码错误处如下,就是简单的使用 f_read()
函数打开一个文件,并将这个文件的前 32 个字节打印出来。
1 | void show_file(uint8_t idx) |
三、解决方法
看了网上的资料,在使用该函数时出现了硬件中断,一般都是单片机内存访问出现了错误。
也就是说在 f_read(&fil,(const TCHAR *)File_path,FA_READ)
的参数中,无法找到 fil
的地址。将 FIL fil;
从函数外拿出,定义为全局变量,即可解决。
这是因为函数内的变量是定义在栈里面的,而 FIL
是 fatfs 中对文件定义的结构体变量,这个变量的内容如下:
1 | /* File object structure (FIL) */ |
可见在最前面有一个共用体,用作读写数据的缓冲,这个其中 _MAX_SS
定义为4096。整个结构体的大小,可使用 sizeof(fil)
查看,肯定多余4096。可是一般栈都不会有这么大,所以这个问题是由于栈溢出造成的。在函数内部一般不设置大数组,但是保不齐结构体内部有数组。
原文链接:本人CSDN博客
- 标题: f_open()使用错误记录
- 作者: The Redefine Team
- 创建于 : 2017-03-10 18:48:23
- 更新于 : 2020-02-19 21:33:02
- 链接: https://redefine.ohevan.com/2017/03/10/f_open()使用错误记录/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论