Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Знатоки GCC, подскажите в чем фокус
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Sirko
в 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
ReAl
Библиотека libm.a подключена? В примерах к scmRTOS она просто не нужна.
Если нет — где-то после LDFLAGS = добавить строку
Код
LDFLAGS += -lm


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

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

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

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

Кстати, это относится и к армам. И математика - посмотришь - аж страшно(если без CORDIC).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.