|
|
  |
ошибка компилятора mspgcc при использовании мат. ф-ий |
|
|
|
Nov 7 2006, 09:28
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(_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 раз число будет быстрее, чем возводить его в степень.
|
|
|
|
|
Nov 7 2006, 09:40
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 3-07-06
Из: Россия, Краснодар
Пользователь №: 18 530

|
Цитата(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 раз число будет быстрее, чем возводить его в степень. На самом деле выражение более сложно  но, от его сложности кол-во ошибок не зависит. Я попробывал, и вот что получается: компилятор ругается на все мат. ф-ии Си, например: 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 Может я что-нибудь, где-нибудь забыл прописать?
|
|
|
|
|
Nov 7 2006, 10:28
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(_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к памяти... более того, как я говорил, библиотека для работы с плавающей точкой сама по себе большая.
|
|
|
|
|
Nov 7 2006, 11:20
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 3-07-06
Из: Россия, Краснодар
Пользователь №: 18 530

|
Попробывал поменять тип контроллера, взял 148-ой, у этого памяти должно хватать по любому. Теперь на все функции ругается одинаково  , но ругается неизменно: 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-ым писало по иному (см. первый пост).
Сообщение отредактировал _VoRoN_ - Nov 7 2006, 11:21
|
|
|
|
|
Nov 7 2006, 11:27
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 3-07-06
Из: Россия, Краснодар
Пользователь №: 18 530

|
Цитата(jorikdima @ Nov 7 2006, 14:24)  undefined reference to значит не может найти соответствующую функцию. Инклуд не забыли???. в том то идело, что не забыл все как положенно #include <math.h> может ему еще чего надо? или найти чего не может?...
|
|
|
|
|
Nov 7 2006, 11:40
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(_VoRoN_ @ Nov 7 2006, 14:27)  Цитата(jorikdima @ Nov 7 2006, 14:24)  undefined reference to значит не может найти соответствующую функцию. Инклуд не забыли???.
в том то идело, что не забыл все как положенно #include <math.h> может ему еще чего надо? или найти чего не может?... .... хм.... или powf() или попробовать __ieee754_powf()
|
|
|
|
|
Nov 7 2006, 12:07
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 3-07-06
Из: Россия, Краснодар
Пользователь №: 18 530

|
Цитата(diwil @ Nov 7 2006, 14:40)  .... хм.... или powf() или попробовать __ieee754_powf() С powf() на 148-ом собралось!!! Но вот на 1101-ом не хочет, видимо действительно памяти не хватает  вычислить необходимо довольно сложное выражение: x = E*e^(-t/tau), именно для возведения e в степень (-t/tau) и требуется данная ф-ия. Как обойти ее и сохранить требуемую точность (0,5%)...просто ума не приложу.
|
|
|
|
|
Nov 7 2006, 12:28
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

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