1

我有一个用 Atmel Studio 编写的代码,用于从 SD 卡读取/写入数据。我在这里使用 FatFs。我的问题是当我在 FatFs 中使用某些函数(f_chdir、f_getcwd ...)时,代码无法编译。某些功能可以正常工作(f_puts、f_open、f_mount、f_mkdir...)。所有这些函数都位于同一个头文件 (ff.h, ff.c)

错误说“对 -function- 的未定义引用,ld 返回 1 个退出状态”。当我转到错误时,它会显示代码的结尾,而它应该显示错误的位置。

我无法理解我的代码的问题。任何帮助表示赞赏。

4

6 回答 6

4

刚刚在使用 SAM4S Xplained Pro(Atmel 7,ASF 3.20)的项目中使用 SD 卡遇到了这个问题。

确保你拥有所有的 asf 项目(fatfs、sd_mmc、内存访问控制,然后是其他基础知识,例如 pmc、gpio,也许还有更多)。由于某种原因,我的 asf 不包括 sd_mmc_mem.c 和 sd_mmc_mem.h,所以我必须自己包括这些。还要记住在主循环顶部执行 sd_mmc_init() 。至于配置...

如果您仔细查看 ffconf.h,它所做的第一件事就是包含 conf_fatfs.h,它(等待它!)与 ffconf.h 逐行完全相同。首先,所有变量都在那里定义(并由#ifndef FFCONF 而不是CONF_FATFS 保护),也就是它重要的地方。

进入 conf_fatfs.h 并将 _USE_STRFUNC 更改为 1 或 2 等等。

另请注意,在您使用它的地方,您必须#include ff.h,前面有 ffconf.h 或 conf_access.h

如果您不知道自己在寻找什么,ASF 就是一个真正的蛇坑。

享受。

于 2017-06-02T21:24:53.413 回答
1

默认情况下,内存控制访问接口在 ASF 向导中被禁用。要启用内存控制访问,请按照以下步骤操作。

  1. 打开 ASF 向导 (Alt + W)。

  2. 如下启用内存控制访问。

ASF SD sd_mmc_mem.h 内存访问启用

  1. 最后,单击“应用”选项进行更改。

这会添加sd_mmc_mem.h /.c 文件

于 2019-07-17T11:54:17.337 回答
0

ffconf.h在您喜欢的编辑器中打开并设置_FS_RPATH2. 来自ffconf.h

#define _FS_RPATH       0
/* This option configures relative path feature.
/
/   0: Disable relative path feature and remove related functions.
/   1: Enable relative path feature. f_chdir() and f_chdrive() are available.
/   2: f_getcwd() function is available in addition to 1.
/
/  Note that directory items read via f_readdir() are affected by this option. */

fatfs 库的哪些功能包含在您的构建中是可配置的,因此您不必为不使用的功能丢失宝贵的 ROM 空间(以及几个字节的 RAM)。

对于 0.8a 之前的 FatFS 库版本,_FS_RPATH仅支持值01; f_getcwd在这些版本中不可用。

此外,在 0.8 之前的版本中,C++ 代码必须将其头文件显式包含为 C 头文件以避免名称混淆:

extern "C" {
#include "ff.h"
}

从 0.8 版开始,它在内部执行此操作。如果您仍在使用旧版本,您可以在此处找到新版本——您留下的评论让我相信可能是这种情况。

于 2015-02-23T09:47:39.750 回答
0

在文件ffconf.h中,将 #define _USE_FIND设置为 1。

/* 此选项切换过滤目录读取函数,f_findfirst() 和 /f_findnext()。(0:Disable, 1:Enable 2:Enable with altname[] too) */

我需要使用 f_findfirst() 和 f_findnext() 函数,但我遇到了未定义的引用错误。现在这解决了我的问题。

于 2021-05-20T18:38:49.627 回答
0

驱动器/目录处理函数位于 #if _FS_RPATH >= 1 (或类似的预处理器) 下。

于 2021-06-08T22:00:08.523 回答
0

检查ffconf.h中的_FS_MINIMZE是否为0以使所有功能都可用。在我从 elm-chan 下载的版本中,默认设置为 3 并导致编译器错误:未定义的引用。

于 2015-12-21T18:17:39.243 回答