неопределенная ссылка на "aeabi ddiv" и friends-building без stdlib, но с-mfloat-abi=жесткий

Я пытаюсь построить проект для 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'

почему это? Если я правильно понимаю, он не должен полагаться на библиотечные функции, но использовать для этого инструкции Arms native FPU.

2 ответов


ваше ядро поддерживает инструкции с плавающей запятой с одной точностью, однако ваш код работает с плавающей запятой с двойной точностью.

вы можете заметить, что все отсутствующие вещи __aeabi имеют " d " (как в double).

Если в вашем коде есть литералы с плавающей запятой, по стандарту C они считаются двойными. Вы можете заставить их в диапазон с одной точностью, добавив f или F в конце литерала.

2.13.3 плавающей литералы: тип плавающего литерала является двойным, если явно не указано суффикс. Суффиксы f и F указывают float...


хорошо известно, что в C литералы с плавающей запятой (например, 1.23) имеют тип double. Как следствие, любой расчет, который включает их, способствует удвоению.

чтобы решить эту проблему, добавьте "f" в конец всех литералов, т. е.

if (x < 2.5) ...

to

if (x < 2.5f) ...