使用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) 编译时出错。 在文件 -> 首选项开启 “编译过程中显示详细输出”选项 这份报告会包含更多信息。
编译器主要给出两个错误:
- PI重定义了。
- 库函数没法调用。
解决方法如下:
针对错误1,我把
C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12coresarduino
路径下的wiring_constants.h文件的第36行:
#define PI 3.1415926535897932384626433832795
注释掉。
针对错误2,我参考了 这个链接对应的帖子,具体修改如下:
- 把目录: C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12systemCMSISCMSISLibGCC 下的libarm_cortexM3l_math.a文件复制到了目录: C:UsersLenovoAppDataLocalArduino15packagesarduinohardwaresam1.6.12variantsarduino_due_x 下
- 打开目录: 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"