我正在尝试为Cortex-M4F构建一个项目。芯片有一个FPU,所以我建立了-mfpu=fpv4-sp-d16 -mfloat-abi=hard
并且我没有使用任何库来节省空间,所以我-nostdlib -fno-builtin
。
现在我想使用浮点运算,但是这样做时会出现链接器错误:
led1642gw_gain.c:(.text.led_calculateGain+0xc): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0x24): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x36): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0x48): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0x54): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x9e): undefined reference to `__aeabi_f2d'
led1642gw_gain.c:(.text.led_calculateGain+0xb6): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xc8): undefined reference to `__aeabi_dsub'
led1642gw_gain.c:(.text.led_calculateGain+0xda): undefined reference to `__aeabi_ddiv'
led1642gw_gain.c:(.text.led_calculateGain+0xe6): undefined reference to `__aeabi_d2f'
led1642gw_gain.c:(.text.led_calculateGain+0x10c): undefined reference to `__aeabi_f2d'
为什么?如果我理解正确,它不应该依赖库函数,而是使用ARM本机FPU指令。
答案 0 :(得分:6)
您的内核支持单精度浮点指令,但您的代码使用双精度浮点。
你可以注意到所有丢失的__aeabi东西都有一个'd'(如双倍)。
如果您的代码中有浮点文字,则按C标准,它们被视为双精度。您可以通过在文字末尾添加f
或F
来强制它们达到单精度范围。
2.13.3浮动文字:除非明确指定,否则浮动文字的类型为double 后缀。后缀f和F指定float ...
答案 1 :(得分:1)
众所周知,在C中,浮点文字(例如1.23)具有double类型。因此,任何涉及它们的计算都会提升到两倍。
要解决此问题,请添加' f'到所有文字的末尾,即
if (x < 2.5) ...
到
if (x < 2.5f) ...