Библиотека с плавающей точкой для встроенного приложения - PullRequest
3 голосов
/ 02 февраля 2010

Я разрабатываю программу для Cortex-M3. У него нет сопроцессора с плавающей запятой. Стандартная библиотека C может эмулировать операции с плавающей точкой, но я не использую ее из-за ее размера.

Существует ли какая-нибудь хорошая и бесплатная библиотека c, которая может эмулировать арифметику с плавающей запятой, предназначенную для процессоров ARM? В настоящее время, когда я использую операторы с плавающей запятой, у меня возникают такие ошибки связи:

undefined reference to `__adddf3'
undefined reference to `__subdf3'
undefined reference to `__divdf3'
undefined reference to `__extendsfdf2'
undefined reference to `__muldf3'

Так что, вероятно, такая библиотека должна их реализовывать.

Ответы [ 8 ]

5 голосов
/ 02 февраля 2010

Не лучше ли вам (с точки зрения производительности и размера) использовать фиксированную точку? Для простой арифметики это тривиально реализовать либо напрямую, либо с помощью интерфейса функции. Если бы вы могли использовать C ++, использование перегрузки операторов могло бы сделать использование фиксированного почти бесшовным (без накладных расходов во время выполнения по сравнению с интерфейсом функций C).

Если у вас есть более сложные требования (триг, корни и т. Д.), Хорошая библиотека с фиксированной точкой представлена ​​в этой статье доктора Добба .

3 голосов
/ 02 февраля 2010

Если вы хотите выполнить свою арифметику с использованием встроенных операторов, то вам нужно предоставить библиотечные процедуры, которые ожидает компилятор, так что в итоге вы получите что-то такое же большое, как библиотека, которая пришлас компилятором.

Скорее всего, у вас есть исходный код подпрограмм плавающей поддержки компилятора, поэтому, если вы хотите посмотреть на них, чтобы увидеть, можете ли вы их улучшить, это, вероятно, ваш лучший шанс.Если вы не думаете, что это сработает по какой-либо причине, вам следует поговорить со своим поставщиком компилятора о требованиях, которые компилятор ожидает от плавающих подпрограмм поддержки, и о наилучшем способе замены библиотеки поставщика.

Если выЕсли вы хотите обойти требования компилятора, вам, вероятно, следует избегать использования встроенных операторов и выполнять арифметику с использованием явных вызовов функций.У меня нет опыта работы со сторонними библиотеками с плавающей запятой, поэтому, к сожалению, я не могу указать вам на возможные хорошие альтернативы.

1 голос
/ 25 февраля 2010

Возможно, newlib было бы здесь полезно? Может быть трудно настроить цепочку инструментов, но я добился успеха в снижении использования встроенной флэш-памяти по сравнению с gcc и его стандартной библиотекой.

1 голос
/ 02 февраля 2010

Они должны быть определены в библиотеке поддержки времени выполнения для вашего компилятора.Эти имена похожи на функции с плавающей точкой из libgcc (библиотека поддержки gcc), которая довольно мала.Вы должны иметь возможность использовать эти функции, устанавливая соответствующие флаги ссылок.

0 голосов
/ 07 марта 2019

Все приведенные ниже сообщения представляют некоторую арифметическую операцию: неопределенная ссылка на __adddf3' undefined reference to __ subdf3 'неопределенная ссылка на __divdf3' undefined reference to __ extendsfdf2' неопределенная ссылка на `__muldf3 '

Так что компиляция выдаст ошибку компоновки, если выделает некоторую артаматическую операцию в двух разных типах данных.Например: Float x;float y;

y = x * 0.45;

Так что, если вы скомпилируете этот код во время связывания, вы получите нижеприведенное сообщение с неопределенной ссылкой на `__muldf3 '

Чтобы решить эту проблемуявно укажите «0,45» для плавания y = x * 0,45F;

В большинстве случаев ошибка связывания этого типа возникает при использовании компилятора c ++ для компиляции файла c.

0 голосов
/ 03 февраля 2010

Если вы используете gcc, попробуйте скомпилировать с флагом -static-libgcc и проверить окончательный размер двоичного файла Я не знаю, будет ли компоновщик оптимизировать неиспользуемые вызовы, но я думаю будет.

0 голосов
/ 03 февраля 2010

gcc имеет все эти функции, есть gcc build voodoo (multilib, thumb, thumb2 и soft float), который можно использовать для автоматического отображения.Несколько лет назад я сдался и просто взял файлы из исходников gcc, обрезал их до чистого источника и просто встроил в мои проекты.Несколько лет назад, глядя на коммерческий компилятор или два, затем смотрели на newlib и gcc, по крайней мере, в то время, когда все они использовали почти одну и ту же математическую библиотеку.Я хочу сказать, что это было от Солнца.

0 голосов
/ 02 февраля 2010

Любой статический компоновщик, достойный его соли, удалит неиспользуемые вызовы.Это особенно верно для встроенных компиляторов.

...