Атмег 0 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Здравствуйте, уважаемые, помогите советом! Начинаю работать с ARM, установил YAGARTO. Как только пытаюсь использовать функции типа sin, cos - линкер выдает undefined reference to `sin' в math.h они объявлены external: extern double cos _PARAMS((double)); extern double sin _PARAMS((double)); То есть в стандартной библиотеке не реализованы матфункции? Что я не понимаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Здравствуйте, уважаемые, помогите советом! Начинаю работать с ARM, установил YAGARTO. Как только пытаюсь использовать функции типа sin, cos - линкер выдает undefined reference to `sin' в math.h они объявлены external: extern double cos _PARAMS((double)); extern double sin _PARAMS((double)); То есть в стандартной библиотеке не реализованы матфункции? Что я не понимаю? добавте при линковке ключик -lm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба Надо указать линкеру, чтоб линковал математическую библиотеку. Ключ -lm. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 24 июля, 2009 Опубликовано 24 июля, 2009 (изменено) · Жалоба Гарантировать правильную работу floating point должен адеквтный стартап, но для того, чтобы перестал ругаться линкер отредактируйте в мэйкфайле строчку MCFLAGS = -mcpu=$(MCU) -lm Это заставит компилятор добавить к списку библиотечных файлов еще arm-elf\lib\libm.a ps: ой, уже натовечали... А вопрошавший может сказать про то, заработало ли без поддержки стартапа? Как я понял, при компиляции для freestanding environment приходится свой собственный стартап подсовывать (я, во всяком случае, поступил именно так). pps: успел сам проверить... коллосаль! у меня с моим стартапом заработало! Во всяком случае, функция sin (не в прерывании) работает... Правда, добавило 10 килобайт. Изменено 24 июля, 2009 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 24 июля, 2009 Опубликовано 24 июля, 2009 · Жалоба стартап то тут причем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 25 июля, 2009 Опубликовано 25 июля, 2009 (изменено) · Жалоба Скорее всего стартап в данном случае непричем... Просто во всех остальных компиляторах, что я встречал (и использовал для embedded) стартап участвовал в настройках FP калькулятора и/или режимов сопроцессора где он был (в x86). С тем как это в gcc для arm устроено я еще не успел разобраться. Изменено 25 июля, 2009 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 июля, 2009 Опубликовано 25 июля, 2009 · Жалоба Скорее всего стартап в данном случае непричем... Если для плавучки использовать коды операции из множества undefined instruction, то в стартапе надо прописАть адрес обработчика соотв. исключения. А более стартап никаким макаком... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeiCh 0 25 июля, 2009 Опубликовано 25 июля, 2009 · Жалоба добавте при линковке ключик -lmПричем ключик должен быть обязательно после, а не до объектных файлов, в которых используются библиотечные функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Атмег 0 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба Огромное спасибо! С ключом -lm все линкуется как надо. И, действительно, только когда ключ стоит после объектных файлов. (Если не сложно, объясните, почему так? Ведь если поменять порядок объектных файлов при линковке ничего не меняется?..) Остался, правда, еще один непонятный момент еще на этапе компиляции: main.c: In function 'main': main.c:550: warning: implicit declaration of function 'sin' main.c:550: warning: incompatible implicit declaration of built-in function 'sin' такая реакция на вызов функции, хотя я ее не определяю, просто вызываю, x=sin(y); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба такая реакция на вызов функции, хотя я ее не определяю, просто вызываю, x=sin(y); а math.h сверху подключен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
etoja 0 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба Используйте Rowley Crosstudio. Это оболочка + gcc. Оболочка формирует нужные ключи. 30-дневная версия здесь: http://www.rowley.co.uk/arm/ Ну и местные закрома, ясное дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Атмег 0 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба да, туплю, закомментирован был) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба И, действительно, только когда ключ стоит после объектных файлов. (Если не сложно, объясните, почему так? Ведь если поменять порядок объектных файлов при линковке ничего не меняется?..) потому что библиотека - это не объектный файл, а архив объектных файлов. И именно такой порядок описан в документации: -lnamespec --library=namespec ... The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again. ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Атмег 0 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба Понятно, спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Атмег 0 27 июля, 2009 Опубликовано 27 июля, 2009 · Жалоба Появился еще ряд вопросов) Увеличиваю частоту на выходе фапч с 200 до 240 МГц. Ожидаю, что время выполнения моего кода должно пропорционально сократиться. Однако сокращается оно не на 20, а на доли процента... Рассчитывается преобразование фурье, работа алгоритма с периферией никак не связана. На данный момент у меня на 200Мгц на вычисление sin тратится в среднем 50 мкс, то есть 10000 циклов... Не много ли это? От чего зависит скорость работы с fp помимо оптимизации самого кода, что бы почитать на эту тему? В документации на Newlib (http://sources.redhat.com/newlib/) ничего интересного не нашел =/ Главное, чтоб знать в каком направлении двигаться: может быть Newlib не самая лучшая библиотека для работы с fp или переход на другую ничего не даст? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться