реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Знатоки GCC, подскажите в чем фокус
Sirko
сообщение Nov 28 2010, 22:24
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



в h-файле определение класса
Код
class LCD_HD44780{
public:
    typedef struct {
        u08    amountCell                :4;    //    Задает требуемое кол-во знакомест на дисплее
        u08    amountOfSignsAfterPoint    :3;    //    Задает кол-во знаков после запятой, необходимое для отображения
        bool    alignRight                :1;    //    Если true, значит выравнивание по правому краю
    }ModePrintDigit;
public:
    LCD_HD44780(OS::TMutex* pMutex) : mutex(pMutex){cursorMode = BIN8(01101100);}

    *    
    *    
    *

    void printDigitToPosition(u08 x, u08 y, float digit, ModePrintDigit mode);

    *    
    *    
    *

private:
    void setAddress(u08 address);
    void sendCommand(u08 command);
    OS::TMutex* mutex;
    u08 cursorMode;
    ModePrintDigit modePrintDigit;

};


в cpp-файле реализация метода
Код
void LCD_HD44780::
printDigitToPosition(u08 x, u08 y, float digit, ModePrintDigit mode){
//    mode.amountOfSignsAfterPoint = 2;
    bool signNegative;
    float factor = pow(10, mode.amountOfSignsAfterPoint);
    u16 _digit;
    if(digit < 0){
        signNegative =  true;
        _digit = ((-1.0F) * digit * factor) + 0.5F;
    }else{
        signNegative =  false;
        _digit = (digit * factor) + 0.5F;
    }

    if(mode.alignRight){
        while(mode.amountCell--){
            if(!_digit)
                break;
            _digit /= 10;
        }
    }
}


При компиляции выскакивает во такая вот зараза:
Цитата
Build started 29.11.2010 at 00:12:47
======== Beginning of project SMHProjectAVRGCC processing
avr-gcc.exe (WinAVR 20100110) 4.3.3
Copyright © 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

==== Link to SMHProjectAVRGCC.elf
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr51\libc.a(floatsisf.o): In function `__floatunsisf':
(.text.avr-libc.fplib+0x0): multiple definition of `__floatunsisf'
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr51\libgcc.a(_usi_to_sf.o):c:\avrdev\gcc\build-avr\avr\avr51\libgcc/../../.././gcc/fp-bit.c:1391: first defined here
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr51\libc.a(log.o): In function `log':
(.text.avr-libc.fplib+0x46): relocation truncated to fit: R_AVR_13_PCREL against symbol `__addsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr51\libgcc.a(_addsub_sf.o)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr51\libc.a(log.o): In function `log':
(.text.avr-libc.fplib+0x4e): relocation truncated to fit: R_AVR_13_PCREL against symbol `__addsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr51\libgcc.a(_addsub_sf.o)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr51\libc.a(pow.o): In function `pow':
(.text.avr-libc.fplib+0x94): relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr51\libgcc.a(_mul_sf.o)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr51\libc.a(modf.o): In function `modff':
(.text.avr-libc.fplib+0x3e): relocation truncated to fit: R_AVR_13_PCREL against symbol `__subsf3' defined in .text section in c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr51\libgcc.a(_addsub_sf.o)
make: *** [exe/SMHProjectAVRGCC.elf] Error 1
Build failed with 1 errors and 0 warnings...

Если раскоментировать строку
// mode.amountOfSignsAfterPoint = 2;
ошибка пропадает.

Если закоментировать строку
if(!_digit)
ошибка пропадает.

Если убрать строки
_digit = .....
ошибка пропадает.

Где логика? laughing.gif

Makefile взят из примера операционки scmRTOS
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 28 2010, 22:44
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Библиотека libm.a подключена? В примерах к scmRTOS она просто не нужна.
Если нет — где-то после LDFLAGS = добавить строку
Код
LDFLAGS += -lm


p.s. что-то я не то написал, сначала не заметил про PCREL
засыпаю, ну его, может кто другой подскажет правильно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Sirko
сообщение Nov 29 2010, 03:04
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 245
Регистрация: 15-08-07
Пользователь №: 29 795



ReAl Вы волшебник.
Огромное спасибо.

p.s. не хочется отвлекать ненужными вопросами, но ужасно интересео, где на родном языке прознать про магию такого уровня?

p.p.s. Непонятно, как вообще закоментирование строки, в которой присваивается константа, может влиять на собираемость проекта? Прямо шаманство сплошное. wacko.gif

Еще раз большое спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2010, 08:42
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Sirko @ Nov 29 2010, 05:04) *
p.s. не хочется отвлекать ненужными вопросами, но ужасно интересео, где на родном языке прознать про магию такого уровня?
Тут на форуме есть один из разработчиков avr-libc и он писал, что libm - специально оптимизированные под avr функции для работы с плавающей точкой на асме. Если она не указана - линкуются "обычные" универсальные из комплекта компилятора, написанные на C. Видимо их тестированию не уделялось внимания - да и зачем, если есть лучшая реализация в libm
QUOTE (Sirko @ Nov 29 2010, 05:04) *
Непонятно, как вообще закоментирование строки, в которой присваивается константа, может влиять на собираемость проекта?
Без этой строки значение этой переменной равно 0, вероятно компилятор смог просчитать результаты выражений и обращения к библиотечным функциям не понадобились.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 29 2010, 08:55
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Сергей Борщ @ Nov 29 2010, 12:42) *
Если она не указана - линкуются "обычные" универсальные из комплекта компилятора, написанные на C.

Кстати, это относится и к армам. И математика - посмотришь - аж страшно(если без CORDIC).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016