Перейти к содержанию
    

Здравствуйте, уважаемые, помогите советом!

 

Начинаю работать с ARM, установил YAGARTO.

Как только пытаюсь использовать функции типа sin, cos - линкер выдает undefined reference to `sin'

в math.h они объявлены external:

 

extern double cos _PARAMS((double));

extern double sin _PARAMS((double));

 

То есть в стандартной библиотеке не реализованы матфункции? Что я не понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, уважаемые, помогите советом!

 

Начинаю работать с ARM, установил YAGARTO.

Как только пытаюсь использовать функции типа sin, cos - линкер выдает undefined reference to `sin'

в math.h они объявлены external:

 

extern double cos _PARAMS((double));

extern double sin _PARAMS((double));

 

То есть в стандартной библиотеке не реализованы матфункции? Что я не понимаю?

 

добавте при линковке ключик -lm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гарантировать правильную работу floating point должен адеквтный стартап, но для того, чтобы перестал ругаться линкер отредактируйте в мэйкфайле строчку

 

MCFLAGS = -mcpu=$(MCU) -lm

 

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

arm-elf\lib\libm.a

 

 

ps: ой, уже натовечали... А вопрошавший может сказать про то, заработало ли без поддержки стартапа?

Как я понял, при компиляции для freestanding environment приходится свой собственный стартап подсовывать (я, во всяком случае, поступил именно так).

 

pps: успел сам проверить... коллосаль! у меня с моим стартапом заработало! Во всяком случае, функция sin (не в прерывании) работает... Правда, добавило 10 килобайт.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего стартап в данном случае непричем... Просто во всех остальных компиляторах, что я встречал (и использовал для embedded) стартап участвовал в настройках FP калькулятора и/или режимов сопроцессора где он был (в x86).

С тем как это в gcc для arm устроено я еще не успел разобраться.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего стартап в данном случае непричем... 

Если для плавучки использовать коды операции из множества undefined instruction, то в стартапе надо прописАть адрес обработчика соотв. исключения. А более стартап никаким макаком... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Огромное спасибо!

С ключом -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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

такая реакция на вызов функции, хотя я ее не определяю, просто вызываю, x=sin(y);

а math.h сверху подключен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используйте Rowley Crosstudio. Это оболочка + gcc.

Оболочка формирует нужные ключи.

 

30-дневная версия здесь: http://www.rowley.co.uk/arm/

Ну и местные закрома, ясное дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И, действительно, только когда ключ стоит после объектных файлов. (Если не сложно, объясните, почему так? Ведь если поменять порядок объектных файлов при линковке ничего не меняется?..)
потому что библиотека - это не объектный файл, а архив объектных файлов. И именно такой порядок описан в документации:

-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.

...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появился еще ряд вопросов)

 

Увеличиваю частоту на выходе фапч с 200 до 240 МГц. Ожидаю, что время выполнения моего кода должно пропорционально сократиться. Однако сокращается оно не на 20, а на доли процента... Рассчитывается преобразование фурье, работа алгоритма с периферией никак не связана.

 

На данный момент у меня на 200Мгц на вычисление sin тратится в среднем 50 мкс, то есть 10000 циклов... Не много ли это? От чего зависит скорость работы с fp помимо оптимизации самого кода, что бы почитать на эту тему? В документации на Newlib (http://sources.redhat.com/newlib/) ничего интересного не нашел =/

 

Главное, чтоб знать в каком направлении двигаться: может быть Newlib не самая лучшая библиотека для работы с fp или переход на другую ничего не даст?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...