C 中未定义的 ARM 处理器库问题

Undefined ARM processor library issue in C

使用 DAVE 4.4.2(基于 Eclipse 的IDE)为英飞凌微控制器构建 C 程序我收到此错误:

'Building target: mcu.elf' 
main.c:(.text.ERU0_3_IRQHandler+0x696): undefined reference to `arm_mat_init_f32'
'Invoking: ARM-GCC C Linker'
collect2.exe: error: ld returned 1 exit status

这是我的代码的简化概述。

#include <arm_math.h>
[other included libraries]

void my_function() {
  arm_matrix_instance_f32 M;
  float32_t zeros33[3][3] = {0};

  arm_mat_init_f32( &M, 3, 3, &zeros33);
}
[other defined functions]

int main(void) {
  my_function()
  [other stuff]
}

而在 header arm_math.h 中,我看到函数的定义据说是未定义的。

void arm_mat_init_f32(
arm_matrix_instance_f32 * S,
uint16_t nRows,
uint16_t nColumns,
float32_t * pData);

我怀疑问题可能在于使用了不正确的数据类型,或者在传递参数时错误地使用了指针。我试图删除矩阵变量前面的&,但没有成功。同样的思路,我也尝试过对矩阵数据的定义使用不同的数据类型:float32_tfloat.

查看各种警告和信息消息,我注意到 arm_mat_init_f32 声明旁边有一个说 Expected 'float32_t *' but argument is of type 'float32_t (*)[3][3]'。因此,我还尝试传递 "normal" 变量 float32_t zero = 0.0f 的地址,并且只传递 0.0f。由于未定义的函数,它们仍然导致构建失败。

最后的观察是,如果我 right-click 在我的代码中调用函数,并询问 "go to Declaration",就会在正确的文件中找到正确的函数。

可能是什么问题?

使用 DAVE 时,解决问题的方法是通过 Project/Add 新 APP 添加 APP。然后selectSystem/CMSIS_DSP,再按"Add"。该程序需要完全重建。

这样,DAVE 配置了所有必要的环境变量和链接,以便包含 arm_math 库。