Код
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;
};
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;
}
}
}
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...
======== 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 = .....
ошибка пропадает.
Где логика?

Makefile взят из примера операционки scmRTOS