Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ошибка компилятора mspgcc при использовании мат. ф-ий
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
_VoRoN_
Проблема состоит в следующем:
возникла необходимость использования функции возведения в степень pow из стандартной библиотеки math.h. Однако при сборке проекта (проект называется PowerMeter), компилятор ругается:

msp430-gcc -mmcu=msp430x1101 -o PowerMeter.elf main.o -lm -L./lib
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: region text is full (PowerMeter.elf section .text)
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: section .vectors [0000ffe0 -> 0000ffff] overlaps section .text [0000fc00 -> 00010471]
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: PowerMeter.elf: section .vectors lma 0xffe0 overlaps previous sections
main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:30: undefined reference to `pow'
make: *** [PowerMeter.elf] Error 1

функция используется в след. виде:

void preobraz (void)
{
Uc=pow(count,5);
}

Если у кого-нибудь было подобное, подскажите плиз.
diwil
Цитата(_VoRoN_ @ Nov 7 2006, 10:24) *
Проблема состоит в следующем:
возникла необходимость использования функции возведения в степень pow из стандартной библиотеки math.h. Однако при сборке проекта (проект называется PowerMeter), компилятор ругается:

msp430-gcc -mmcu=msp430x1101 -o PowerMeter.elf main.o -lm -L./lib
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: region text is full (PowerMeter.elf section .text)
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: section .vectors [0000ffe0 -> 0000ffff] overlaps section .text [0000fc00 -> 00010471]
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: PowerMeter.elf: section .vectors lma 0xffe0 overlaps previous sections
main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:30: undefined reference to `pow'
make: *** [PowerMeter.elf] Error 1

функция используется в след. виде:

void preobraz (void)
{
Uc=pow(count,5);
}

Если у кого-нибудь было подобное, подскажите плиз.


... не хватает места для функции...
дело в том, что все стандартные функции здесь реализованы "в лоб" - взяты из стандартной сановской библиотеки и просто скомпилированы. Они занимают очень много места и в 2к не влезают. Необходимо так же помнить, что сами по себе функции работы с плавающей точкой тоже занимают очень много места. Лучше их вообще не использовать на таких маленьких контроллерах. Если необходимость все-же есть, то можно использовать libfp (-lfp). В этом случае стандартная 754 библиотека подменяется такой же, но несколько оптимизированной и без проверки исключений и переполнений.

Что же касается кода, то умножить 5 раз число будет быстрее, чем возводить его в степень.
_VoRoN_
Цитата(diwil @ Nov 7 2006, 12:28) *
Цитата(_VoRoN_ @ Nov 7 2006, 10:24) *

Проблема состоит в следующем:
возникла необходимость использования функции возведения в степень pow из стандартной библиотеки math.h. Однако при сборке проекта (проект называется PowerMeter), компилятор ругается:

msp430-gcc -mmcu=msp430x1101 -o PowerMeter.elf main.o -lm -L./lib
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: region text is full (PowerMeter.elf section .text)
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: section .vectors [0000ffe0 -> 0000ffff] overlaps section .text [0000fc00 -> 00010471]
/cygdrive/i/mspgcc/bin/../lib/gcc-lib/msp430/3.2.3/../../../../msp430/bin/msp430-ld: PowerMeter.elf: section .vectors lma 0xffe0 overlaps previous sections
main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:30: undefined reference to `pow'
make: *** [PowerMeter.elf] Error 1

функция используется в след. виде:

void preobraz (void)
{
Uc=pow(count,5);
}

Если у кого-нибудь было подобное, подскажите плиз.


... не хватает места для функции...
дело в том, что все стандартные функции здесь реализованы "в лоб" - взяты из стандартной сановской библиотеки и просто скомпилированы. Они занимают очень много места и в 2к не влезают. Необходимо так же помнить, что сами по себе функции работы с плавающей точкой тоже занимают очень много места. Лучше их вообще не использовать на таких маленьких контроллерах. Если необходимость все-же есть, то можно использовать libfp (-lfp). В этом случае стандартная 754 библиотека подменяется такой же, но несколько оптимизированной и без проверки исключений и переполнений.

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


На самом деле выражение более сложноsmile.gif но, от его сложности кол-во ошибок не зависит.
Я попробывал, и вот что получается: компилятор ругается на все мат. ф-ии Си, например:

void preobraz (void)
{
Uc=sqrt(4);
}

сообщение компилятора:

msp430-gcc -mmcu=msp430x1101 -o PowerMeter.elf main.o -lm -L -lfp./lib
main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:32: undefined reference to `sqrt'
make: *** [PowerMeter.elf] Error 1

Может я что-нибудь, где-нибудь забыл прописать?
diwil
Цитата(_VoRoN_ @ Nov 7 2006, 12:40) *
msp430-gcc -mmcu=msp430x1101 -o PowerMeter.elf main.o -lm -L -lfp./lib
main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:32: undefined reference to `sqrt'
make: *** [PowerMeter.elf] Error 1

Может я что-нибудь, где-нибудь забыл прописать?


... нет, не забыл...
у меня нет сейчас под рукой исходников, но могу точно сказать, что для любой сложной функции не хватит места...
вот здесь
http://mspgcc.cvs.sourceforge.net/mspgcc/m...-libc/src/libm/
лежат исходники всех функций - они не маленькие и не влезут в 1к памяти...
более того, как я говорил, библиотека для работы с плавающей точкой сама по себе большая.
_VoRoN_
Попробывал поменять тип контроллера, взял 148-ой, у этого памяти должно хватать по любому. Теперь на все функции ругается одинаковоsmile.gif, но ругается неизменно:

main.o: In function `preobraz':
/cygdrive/i/я77777710я77777761я77777765я77777756я77777744я77777755я77777750я77777752я7777775
0/MSP430/PowerMeter/main.c:48: undefined reference to `pow'
make: *** [PowerMeter.elf] Error 1

это в ответ на:

void preobraz (void)
{
Uc=pow(count,5);
}

с 1101-ым писало по иному (см. первый пост).
jorikdima
undefined reference to значит не может найти соответствующую функцию. Инклуд не забыли???.
_VoRoN_
Цитата(jorikdima @ Nov 7 2006, 14:24) *
undefined reference to значит не может найти соответствующую функцию. Инклуд не забыли???.


в том то идело, что не забыл

все как положенно

#include <math.h>

может ему еще чего надо? или найти чего не может?...
diwil
Цитата(_VoRoN_ @ Nov 7 2006, 14:27) *
Цитата(jorikdima @ Nov 7 2006, 14:24) *

undefined reference to значит не может найти соответствующую функцию. Инклуд не забыли???.


в том то идело, что не забыл

все как положенно

#include <math.h>

может ему еще чего надо? или найти чего не может?...


.... хм....
или powf() или попробовать __ieee754_powf()
_VoRoN_
Цитата(diwil @ Nov 7 2006, 14:40) *
.... хм....
или powf() или попробовать __ieee754_powf()


С powf() на 148-ом собралось!!! Но вот на 1101-ом не хочет, видимо действительно памяти не хватаетsad.gif
вычислить необходимо довольно сложное выражение:

x = E*e^(-t/tau),

именно для возведения e в степень (-t/tau) и требуется данная ф-ия. Как обойти ее и сохранить требуемую точность (0,5%)...просто ума не приложу.
diwil
Цитата(_VoRoN_ @ Nov 7 2006, 15:07) *
x = E*e^(-t/tau),

именно для возведения e в степень (-t/tau) и требуется данная ф-ия. Как обойти ее и сохранить требуемую точность (0,5%)...просто ума не приложу.


в 1к в плавающей точке наверное сложно.
однако, наверное, можно:
1. положить тау равное 1
2. перейти к дробной арифметике
3. апроксимировать экспоненту, скажем, полиномом, если аргумент много больше единицы и раздожить ее в ряд, если аргумент около нуля

пол-процента точно можно нааппроксимировать smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.