Да, у вас нет FPU, поэтому необходимо выполнять вычисления с плавающей запятой в целочисленной математике. Однако для этого есть два механизма, один из которых в 11 раз быстрее другого.
Цель GCC arm-linux-gnu обычно включает в себя инструкции с плавающей запятой в коде для первого FPU ARM, "FPA", который теперь настолько редок, что его вообще не существует. Это вызывает недопустимые ловушки инструкций, которые затем перехватываются и эмулируются в ядре. Это очень медленно из-за переключения контекста.
-msoft-float вместо этого вставляет вызовы библиотечных функций (в libgcc.a). Это позволяет избежать переключения в пространство ядра и в 11 раз быстрее, чем эмулируемые инструкции FPA.
Вы не говорите, какую модель с плавающей запятой вы используете - возможно, вы уже строите всю область пользователя с помощью -msoft-float - но, возможно, стоит проверить, что ваши объектные файлы не содержат инструкций FPA. Вы можете проверить с помощью:
objdump -d file | grep 'f' | less
где
file
- любой объектный файл, исполняемый файл или библиотека, которые выводит ваш компилятор. Все инструкции FPA начинаются с
f
, а другие инструкции ARM - нет. Это настоящие символы пробела и табуляции, и вам может потребоваться сказать
<control-V><tab>
, чтобы получить символ табуляции за вашей оболочкой.
Если он использует inspa FPA, вам нужно скомпилировать весь пользовательский мир, используя -msoft-float.
Наиболее подробное прочтение по этим вопросам - http://wiki.debian.org/ArmEabiPort, которое в первую очередь касается третьей альтернативы: использования компилятора arm-linux-gnueabi
, более нового альтернативного ABI, доступного начиная с gcc-4.1.1, и который имеет разные характеристики. См. Документ для получения более подробной информации.