快捷搜索: 王者荣耀 脱发

使用Arduino Due调用FFT库函数时编译器报错

最近在用Arduino Due开发板调用库函数进行FFT运算,我选择的IDE为Arduino 1.8.9,安装的软件包为Arduino SAM boards(32-bits ARM Cortex-M3)by Arduino 版本1.6.12,但编译器始终不通过,错误如下:

Arduino:1.8.9 (Windows 10), 开发板:"Arduino Due (Programming Port)"

构建选项已变更,全部重新构建
In file included from F:ArduinoEITEIT.ino:3:0:

C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12system/CMSIS/CMSIS/Include/arm_math.h:283:0: warning: "PI" redefined [enabled by default]

 #define PI     3.14159265358979f

 ^

In file included from C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12coresarduino/Arduino.h:44:0,

                 from sketchEIT.ino.cpp:1:

C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12coresarduino/wiring_constants.h:36:0: note: this is the location of the previous definition

 #define PI 3.1415926535897932384626433832795

 ^

sketchEIT.ino.cpp.o: In function `Impedance_Readout(double):

F:ArduinoEIT/EIT.ino:288: undefined reference to `arm_fill_f32

F:ArduinoEIT/EIT.ino:301: undefined reference to `arm_cfft_radix4_init_f32

F:ArduinoEIT/EIT.ino:303: undefined reference to `arm_cfft_radix4_f32

F:ArduinoEIT/EIT.ino:304: undefined reference to `arm_copy_f32

F:ArduinoEIT/EIT.ino:305: undefined reference to `arm_cmplx_mag_f32

collect2.exe: error: ld returned 1 exit status

exit status 1
为开发板 Arduino Due (Programming Port) 编译时出错。

在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。

编译器主要给出两个错误:

  1. PI重定义了。
  2. 库函数没法调用。

解决方法如下:

针对错误1,我把

C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12coresarduino

路径下的wiring_constants.h文件的第36行:

#define PI 3.1415926535897932384626433832795

注释掉。

针对错误2,我参考了 这个链接对应的帖子,具体修改如下:

  1. 把目录: C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12systemCMSISCMSISLibGCC 下的libarm_cortexM3l_math.a文件复制到了目录: C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12variantsarduino_due_x 下
  2. 打开目录: C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12 下的platform.txt文档,把第81行: recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={build.mcu} -mthumb {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group {compiler.combine.flags} {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.path}/{archive_file}" -Wl,--end-group -lm -lgcc 修改为:
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" -mcpu={build.mcu} -mthumb {compiler.c.elf.flags} "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map,{build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/{build.project_name}.elf" "-L{build.path}" -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--entry=Reset_Handler -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -Wl,--start-group {compiler.combine.flags} {object_files} "{build.variant.path}/{build.variant_system_lib}" "{build.variant.path}/libarm_cortexM3l_math.a" "{build.path}/{archive_file}" -Wl,--end-group -lm -lgcc

在原来那行代码接近末尾的位置加上了"{build.variant.path}/libarm_cortexM3l_math.a"的编译选项。 解决了以上两个编译错误,代码就编译成功了,可以调用FFT函数库了~对了,要调用FFT对应的库函数,别忘了加上宏定义:

#define ARM_MATH_CM3
#include "arm_math.h"
经验分享 程序员 微信小程序 职场和发展