неопределенная ссылка на "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) ...