LINUX.ORG.RU

MSP430 и математика

 , , ,


0

1

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

$ msp430-elf-gcc -Os -mmcu=msp430f5529 -Xlinker -Map=firmware.map -lm -o firmware.elf sensors.c uart.c main.c i2c.c
/tmp/cccKoQwX.o: In function `sensors_poll':
sensors.c:(.text+0x306): undefined reference to `atan2'
collect2: error: ld returned 1 exit status

Как можно заметить, я не забыл указать опцию -lm компилятору. Также в исходнике присутствует #include <math.h> (а в math.h, которая идёт в комплекте к mspgcc есть определение atan2). Компилятор используется из этого пакета: https://aur.archlinux.org/packages/mspgcc-ti/ (у меня ArchLinux). Подобная ошибка возникает и при использовании других функций. Например, sqrt.

На сайте TI есть некая математическая библиотека для семейства MSP430x5xx и MSP430x5xx (то что мне нужно, потому что у меня ланчпад с MSP430F5529), но ссылка для скачивания ведёт на Code Composer Studio. Вероятно, эта математическая библиотека поставляется вместе с пропреритарным компилятором для MSP430, а я не хочу его использовать, потому что мне мало 16КБ кода бесплатной версии, а на платную нет денег. Да и не нужно же.

Итак, знатоки MSP430 (сама архитектура мне очень понравилась по сравнению с AVR, но при этом она проще для изучения, чем ARM, потому что не такая монструозная), что вы делаете, если вам нужна математика? Есть какие-то дополнительные опции компиляции? Или у вас есть на примете какая-нибудь сторонняя библиотека для математики, которую можно включить в свой проект?

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Всякие функции типа snprintf и т. д. работают нормально, проблема только с математикой.

Ну а libm на месте вообще?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok
$ ls /opt/ti/mspgcc/msp430-elf/lib/libm*                                                                                                   
/opt/ti/mspgcc/msp430-elf/lib/libm.a
KivApple ★★★★★
() автор топика

По-моему, это те грабли, на которые я наступал :)

Попробуй сделать -lm последним аргументом в строке.

unanimous ★★★★★
()

На сайте TI есть некая математическая библиотека

Это не то. Это библиотеки для использования встроенных таблиц функций из ПЗУ процессора. Вроде как должно ускорять работу, но да, только для CCS и формата ELF, а мне, например, COFF нужен...

Не, libm там должна быть стандартной совершенно. Может, её собрать сначала надо? Не знаю, как там в mspgcc.

мало 16КБ кода бесплатной версии

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

alegz ★★★★
()
Ответ на: комментарий от unanimous

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

KivApple ★★★★★
() автор топика

мне кажется, просто неправильно прописаны пути к библиотеке.

aiqu6Ait ★★★★
()
Ответ на: комментарий от KivApple

Это фича. Линкер однопроходный, что сделано для его упрощения, снижения затрат памяти и времени линковки. Цена: о порядке должен подумать тот, кто вызывает линкер. (Для большего понимания см. это и этот комментарий.)

xaizek ★★★★★
()
Ответ на: комментарий от KivApple

С чего ты взял, что это баг? Ты используешь функцию из внешней по отношению к libc библиотеки, естественно ты должен указать линкёру, что нужно приликовать библиотеку.

сама архитектура мне очень понравилась по сравнению с AVR, но при этом она проще для изучения, чем ARM, потому что не такая монструозная

Потому что влияние PDP-11 :)

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

Почему баг? Потому что я таки указал, что мне нужна libm. Но ему важно, чтобы она была в конце списка аргументов GCC, хотя под полноценные ОС таких проблем вроде нет.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Тебе выше написали, что линкер однопроходный. Так что эта фича GCC. Сам напарывался было дело.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от KivApple

GCC там патченный, а порядок аргументов у тебя вовсе неправильный. Никогда не видел, чтобы опции линкёра и либу пихали в самое начало строки, перед *.с-файлами. А вообще правильнее будет оформить всё в простенький Makefile и забыть о головной боли с порядком аргументов.

EXL ★★★★★
()
Ответ на: комментарий от KivApple

Это не баг, это фича

The correct order for a link command line is

$(CC) $(CFLAGS) $(LDFLAGS) $(SOURCES) $(LIBS)

$(LIBS) в данном случае - это как раз опции -lfoo

Весь алгоритм поиска символом при линковке в GCC работает именно так, все уже привыкли. И багрепортов на этот счёт я не видал

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.