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

 
 
> Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы...
sonycman
сообщение Nov 22 2008, 19:39
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Сейчас пытаюсь подогнать ИАРовский проект на меге88 под ВинАВР 4.3.2.
Чувствую, помучаться придётся немало smile3046.gif

Пока не могу разобраться, как красиво прочитать/записать 16-ти битный таймер, обеспечив атомарность операции.
Аналога иаровского __monitor не нашёл.
Существуют ли подобные макросы? Или надо писать самому?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sonycman
сообщение Nov 24 2008, 11:05
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Портировал я свою программу с IARа на GCC.
Оптимизация максимальная по скорости у первого, и Os с ключами -mcall-prologues -fno-threadsafe-statics -ffunction-sections --gc-sections --relax у второго.
В результате код IARа - 6 090 bytes of CODE memory + 493 bytes of DATA memory.
Код GCC - Program: 7462 bytes + Data: 363 bytes.

Код иара компактнее почти на 1,5 килобайта. Правда, некоторые функции "тюнингованы" специальными ключами (типа __z_x и т.д.) для оптимальной генерации.
Добавление некоторых аттрибутов для GCC в аналогичных целях, к сожалению, не дало абсолютно никакого результата...

На первый взгляд, скомпилированный GCC код весьма красив и аккуратен, за исключением излишней любви к LDS и STS, например:
исходный текст:
Код
    case    USART_SEND_DATA_EX:
        length    =    4 + 4 + 4 + 20;
        *pb++    =    length + 1;
        *pb++    =    command;
        *pb++    =    temperature.cpu;
        *pb++    =    temperature.gpu;
        *pb++    =    temperature.amb;
        *pb++    =    temperature.hdd;
        *pb++   =   fan_speed[0];
        *pb++   =   fan_speed[1];
        *pb++   =   fan_speed[2];
        *pb++   =   fan_speed[3];
        *pb++    =    cpuFan.GetCurrentSpeed();
        *pb++    =    rearFan.GetCurrentSpeed();
        *pb++    =    sideFan.GetCurrentSpeed();
        *pb++    =    frontFan.GetCurrentSpeed();
    *pb++    =    cpuFan.RPMval[RPM_MIN];
    *pb++    =    cpuFan.RPMval[RPM_MED];
    *pb++    =    cpuFan.RPMval[RPM_MAX];
    *pb++    =    cpuFan.minTEMPval;
    *pb++    =    cpuFan.maxTEMPval;
    *pb++    =    rearFan.RPMval[RPM_MIN];
    *pb++    =    rearFan.RPMval[RPM_MED];
    *pb++    =    rearFan.RPMval[RPM_MAX];
    *pb++    =    rearFan.minTEMPval;
    *pb++    =    rearFan.maxTEMPval;
    *pb++    =    sideFan.RPMval[RPM_MIN];
    *pb++    =    sideFan.RPMval[RPM_MED];
    *pb++    =    sideFan.RPMval[RPM_MAX];
    *pb++    =    sideFan.minTEMPval;
    *pb++    =    sideFan.maxTEMPval;
    *pb++    =    frontFan.RPMval[RPM_MIN];
    *pb++    =    frontFan.RPMval[RPM_MED];
    *pb++    =    frontFan.RPMval[RPM_MAX];
    *pb++    =    frontFan.minTEMPval;
    *pb++    =    frontFan.maxTEMPval;
    break;

результат IARа:
Код
    105              case    USART_SEND_DATA_EX:
    106                  length    =    4 + 4 + 4 + 20;
   \                     ??usartSendCommand_4:
   \   000000C4   E280               LDI     R24, 32
    107                  *pb++    =    length + 1;
   \   000000C6   E201               LDI     R16, 33
   \   000000C8   930D               ST      X+, R16
    108                  *pb++    =    command;
   \   000000CA   934D               ST      X+, R20
    109                  *pb++    =    temperature.cpu;
   \   000000CC   9100....           LDS     R16, temperature
   \   000000D0   930D               ST      X+, R16
    110                  *pb++    =    temperature.gpu;
   \   000000D2   9100....           LDS     R16, (temperature + 1)
   \   000000D6   930D               ST      X+, R16
    111                  *pb++    =    temperature.amb;        
   \   000000D8   9100....           LDS     R16, (temperature + 2)
   \   000000DC   930D               ST      X+, R16
    112                  *pb++    =    temperature.hdd;        
   \   000000DE   9100....           LDS     R16, (temperature + 3)
   \   000000E2   930D               ST      X+, R16
    113                  *pb++   =   fan_speed[0];
   \   000000E4   9100....           LDS     R16, fan_speed
   \   000000E8   930D               ST      X+, R16
    114                  *pb++   =   fan_speed[1];
   \   000000EA   9100....           LDS     R16, (fan_speed + 1)
   \   000000EE   930D               ST      X+, R16
    115                  *pb++   =   fan_speed[2];
   \   000000F0   9100....           LDS     R16, (fan_speed + 2)
   \   000000F4   930D               ST      X+, R16
    116                  *pb++   =   fan_speed[3];
   \   000000F6   9100....           LDS     R16, (fan_speed + 3)
   \   000000FA   930D               ST      X+, R16
    117                  *pb++    =    cpuFan.GetCurrentSpeed();
   \   000000FC   ....               LDI     R16, LOW(cpuFan)
   \   000000FE   ....               LDI     R17, (cpuFan) >> 8
   \   00000100   ....               RCALL   ??GetCurrentSpeed
   \   00000102   930D               ST      X+, R16
    118                  *pb++    =    rearFan.GetCurrentSpeed();
   \   00000104   ....               LDI     R16, LOW(rearFan)
   \   00000106   ....               LDI     R17, (rearFan) >> 8
   \   00000108   ....               RCALL   ??GetCurrentSpeed
   \   0000010A   930D               ST      X+, R16
    119                  *pb++    =    sideFan.GetCurrentSpeed();
   \   0000010C   ....               LDI     R16, LOW(sideFan)
   \   0000010E   ....               LDI     R17, (sideFan) >> 8
   \   00000110   ....               RCALL   ??GetCurrentSpeed
   \   00000112   930D               ST      X+, R16
    120                  *pb++    =    frontFan.GetCurrentSpeed();
   \   00000114   ....               LDI     R16, LOW(frontFan)
   \   00000116   ....               LDI     R17, (frontFan) >> 8
   \   00000118   ....               RCALL   ??GetCurrentSpeed
   \   0000011A   930D               ST      X+, R16
    121                  *pb++    =    cpuFan.RPMval[RPM_MIN];
   \   0000011C   9100....           LDS     R16, (cpuFan + 5)
   \   00000120   930D               ST      X+, R16
    122                  *pb++    =    cpuFan.RPMval[RPM_MED];
   \   00000122   9100....           LDS     R16, (cpuFan + 6)
   \   00000126   930D               ST      X+, R16
    123                  *pb++    =    cpuFan.RPMval[RPM_MAX];
   \   00000128   9100....           LDS     R16, (cpuFan + 7)
   \   0000012C   930D               ST      X+, R16
    124                  *pb++    =    cpuFan.minTEMPval;
   \   0000012E   9100....           LDS     R16, (cpuFan + 8)
   \   00000132   930D               ST      X+, R16
    125                  *pb++    =    cpuFan.maxTEMPval;
   \   00000134   9100....           LDS     R16, (cpuFan + 9)
   \   00000138   930D               ST      X+, R16
    126                  *pb++    =    rearFan.RPMval[RPM_MIN];
   \   0000013A   9100....           LDS     R16, (rearFan + 5)
   \   0000013E   930D               ST      X+, R16
    127                  *pb++    =    rearFan.RPMval[RPM_MED];
   \   00000140   9100....           LDS     R16, (rearFan + 6)
   \   00000144   930D               ST      X+, R16
    128                  *pb++    =    rearFan.RPMval[RPM_MAX];
   \   00000146   9100....           LDS     R16, (rearFan + 7)
   \   0000014A   930D               ST      X+, R16
    129                  *pb++    =    rearFan.minTEMPval;
   \   0000014C   9100....           LDS     R16, (rearFan + 8)
   \   00000150   930D               ST      X+, R16
    130                  *pb++    =    rearFan.maxTEMPval;
   \   00000152   9100....           LDS     R16, (rearFan + 9)
   \   00000156   930D               ST      X+, R16
    131                  *pb++    =    sideFan.RPMval[RPM_MIN];
   \   00000158   9100....           LDS     R16, (sideFan + 5)
   \   0000015C   930D               ST      X+, R16
    132                  *pb++    =    sideFan.RPMval[RPM_MED];
   \   0000015E   9100....           LDS     R16, (sideFan + 6)
   \   00000162   930D               ST      X+, R16
    133                  *pb++    =    sideFan.RPMval[RPM_MAX];
   \   00000164   9100....           LDS     R16, (sideFan + 7)
   \   00000168   930D               ST      X+, R16
    134                  *pb++    =    sideFan.minTEMPval;
   \   0000016A   9100....           LDS     R16, (sideFan + 8)
   \   0000016E   930D               ST      X+, R16
    135                  *pb++    =    sideFan.maxTEMPval;
   \   00000170   9100....           LDS     R16, (sideFan + 9)
   \   00000174   930D               ST      X+, R16
    136                  *pb++    =    frontFan.RPMval[RPM_MIN];
   \   00000176   9100....           LDS     R16, (frontFan + 5)
   \   0000017A   930D               ST      X+, R16
    137                  *pb++    =    frontFan.RPMval[RPM_MED];
   \   0000017C   9100....           LDS     R16, (frontFan + 6)
   \   00000180   930D               ST      X+, R16
    138                  *pb++    =    frontFan.RPMval[RPM_MAX];
   \   00000182   9100....           LDS     R16, (frontFan + 7)
   \   00000186   930D               ST      X+, R16
    139                  *pb++    =    frontFan.minTEMPval;
   \   00000188   9100....           LDS     R16, (frontFan + 8)
   \   0000018C   930D               ST      X+, R16
    140                  *pb++    =    frontFan.maxTEMPval;
   \   0000018E   9100....           LDS     R16, (frontFan + 9)
   \   00000192   CF96               RJMP    ??usartSendCommand_12
    141                  break;

вполне прилично.
А вот у GCC:
Код
    case    USART_SEND_DATA_EX:
        length    =    4 + 4 + 4 + 20;
        *pb++    =    length + 1;
    153c:    81 e2           ldi    r24, 0x21; 33
    153e:    80 93 ed 01     sts    0x01ED, r24
        *pb++    =    command;
    1542:    90 93 ee 01     sts    0x01EE, r25
        *pb++    =    temperature.cpu;
    1546:    80 91 34 01     lds    r24, 0x0134
    154a:    80 93 ef 01     sts    0x01EF, r24
        *pb++    =    temperature.gpu;
    154e:    80 91 35 01     lds    r24, 0x0135
    1552:    80 93 f0 01     sts    0x01F0, r24
        *pb++    =    temperature.amb;
    1556:    80 91 36 01     lds    r24, 0x0136
    155a:    80 93 f1 01     sts    0x01F1, r24
        *pb++    =    temperature.hdd;
    155e:    80 91 37 01     lds    r24, 0x0137
    1562:    80 93 f2 01     sts    0x01F2, r24
        *pb++   =   fan_speed[0];
    1566:    80 91 6f 01     lds    r24, 0x016F
    156a:    80 93 f3 01     sts    0x01F3, r24
        *pb++   =   fan_speed[1];
    156e:    80 91 70 01     lds    r24, 0x0170
    1572:    80 93 f4 01     sts    0x01F4, r24
        *pb++   =   fan_speed[2];
    1576:    80 91 71 01     lds    r24, 0x0171
    157a:    80 93 f5 01     sts    0x01F5, r24
        *pb++   =   fan_speed[3];
    157e:    80 91 72 01     lds    r24, 0x0172
    1582:    80 93 f6 01     sts    0x01F6, r24
        *pb++    =    cpuFan.GetCurrentSpeed();
    1586:    87 e3           ldi    r24, 0x37; 55
    1588:    92 e0           ldi    r25, 0x02; 2
    158a:    4c d7           rcall    .+3736   ; 0x2424 <__data_load_end+0x6fe>
    158c:    80 93 f7 01     sts    0x01F7, r24
        *pb++    =    rearFan.GetCurrentSpeed();
    1590:    81 e4           ldi    r24, 0x41; 65
    1592:    92 e0           ldi    r25, 0x02; 2
    1594:    47 d7           rcall    .+3726   ; 0x2424 <__data_load_end+0x6fe>
    1596:    80 93 f8 01     sts    0x01F8, r24
        *pb++    =    sideFan.GetCurrentSpeed();
    159a:    8b e4           ldi    r24, 0x4B; 75
    159c:    92 e0           ldi    r25, 0x02; 2
    159e:    42 d7           rcall    .+3716   ; 0x2424 <__data_load_end+0x6fe>
    15a0:    80 93 f9 01     sts    0x01F9, r24
        *pb++    =    frontFan.GetCurrentSpeed();
    15a4:    85 e5           ldi    r24, 0x55; 85
    15a6:    92 e0           ldi    r25, 0x02; 2
    15a8:    3d d7           rcall    .+3706   ; 0x2424 <__data_load_end+0x6fe>
    15aa:    80 93 fa 01     sts    0x01FA, r24
        *pb++    =    cpuFan.RPMval[RPM_MIN];
    15ae:    80 91 3c 02     lds    r24, 0x023C
    15b2:    80 93 fb 01     sts    0x01FB, r24
        *pb++    =    cpuFan.RPMval[RPM_MED];
    15b6:    80 91 3d 02     lds    r24, 0x023D
    15ba:    80 93 fc 01     sts    0x01FC, r24
        *pb++    =    cpuFan.RPMval[RPM_MAX];
    15be:    80 91 3e 02     lds    r24, 0x023E
    15c2:    80 93 fd 01     sts    0x01FD, r24
        *pb++    =    cpuFan.minTEMPval;
    15c6:    80 91 3f 02     lds    r24, 0x023F
    15ca:    80 93 fe 01     sts    0x01FE, r24
        *pb++    =    cpuFan.maxTEMPval;
    15ce:    80 91 40 02     lds    r24, 0x0240
    15d2:    80 93 ff 01     sts    0x01FF, r24
        *pb++    =    rearFan.RPMval[RPM_MIN];
    15d6:    80 91 46 02     lds    r24, 0x0246
    15da:    80 93 00 02     sts    0x0200, r24
        *pb++    =    rearFan.RPMval[RPM_MED];
    15de:    80 91 47 02     lds    r24, 0x0247
    15e2:    80 93 01 02     sts    0x0201, r24
        *pb++    =    rearFan.RPMval[RPM_MAX];
    15e6:    80 91 48 02     lds    r24, 0x0248
    15ea:    80 93 02 02     sts    0x0202, r24
        *pb++    =    rearFan.minTEMPval;
    15ee:    80 91 49 02     lds    r24, 0x0249
    15f2:    80 93 03 02     sts    0x0203, r24
        *pb++    =    rearFan.maxTEMPval;
    15f6:    80 91 4a 02     lds    r24, 0x024A
    15fa:    80 93 04 02     sts    0x0204, r24
        *pb++    =    sideFan.RPMval[RPM_MIN];
    15fe:    80 91 50 02     lds    r24, 0x0250
    1602:    80 93 05 02     sts    0x0205, r24
        *pb++    =    sideFan.RPMval[RPM_MED];
    1606:    80 91 51 02     lds    r24, 0x0251
    160a:    80 93 06 02     sts    0x0206, r24
        *pb++    =    sideFan.RPMval[RPM_MAX];
    160e:    80 91 52 02     lds    r24, 0x0252
    1612:    80 93 07 02     sts    0x0207, r24
        *pb++    =    sideFan.minTEMPval;
    1616:    80 91 53 02     lds    r24, 0x0253
    161a:    80 93 08 02     sts    0x0208, r24
        *pb++    =    sideFan.maxTEMPval;
    161e:    80 91 54 02     lds    r24, 0x0254
    1622:    80 93 09 02     sts    0x0209, r24
        *pb++    =    frontFan.RPMval[RPM_MIN];
    1626:    80 91 5a 02     lds    r24, 0x025A
    162a:    80 93 0a 02     sts    0x020A, r24
        *pb++    =    frontFan.RPMval[RPM_MED];
    162e:    80 91 5b 02     lds    r24, 0x025B
    1632:    80 93 0b 02     sts    0x020B, r24
        *pb++    =    frontFan.RPMval[RPM_MAX];
    1636:    80 91 5c 02     lds    r24, 0x025C
    163a:    80 93 0c 02     sts    0x020C, r24
        *pb++    =    frontFan.minTEMPval;
    163e:    80 91 5d 02     lds    r24, 0x025D
    1642:    80 93 0d 02     sts    0x020D, r24
        *pb++    =    frontFan.maxTEMPval;
    1646:    80 91 5e 02     lds    r24, 0x025E
    164a:    80 93 0e 02     sts    0x020E, r24
    164e:    10 e2           ldi    r17, 0x20; 32
    1650:    cf e0           ldi    r28, 0x0F; 15
    1652:    d2 e0           ldi    r29, 0x02; 2
    1654:    08 c0           rjmp    .+16     ; 0x1666 <_Z16usartSendCommandhPKvh+0x24e>
        break;

жаль, не догадался компилер использовать указатель 05.gif
А зря. Итог - внушительный, в два раза больший, размер функции.

Также в коде есть одна немаленькая inline функция, которая используется всего один раз (и то, понятно, инлайнится в тело вызывающей функции), но непонятно, почему остаётся её вторая копия?

За короткое время знакомства с GCC понравилось: удобная реализация атомарности через макросы ATOMIC_BLOCK(), удобная обёртка для обработчиков прерываний вида ISR(vector_name){}.

Что не понравилось: гиморрой с обработкой данных, расположенных во флеш - для их чтения необходимо использовать специальный макрос pgm_read_...(). В ИАРе достаточно объявить указатель типа __flash и можно работать с ним совершенно обычным образом smile.gif
Также не очень удобно каждый раз пользоваться PSTR() для обозначения in-line строк вида: printText(PSTR("some")).
ИАР тут опять на высоте со своим __flash, так как подобная функция в нём декларируется как printText(char const __flash __flash * pointer), и вызов делается просто: printText("that`s cool") smile.gif
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 24 2008, 11:35
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(sonycman @ Nov 24 2008, 14:05) *
Также в коде есть одна немаленькая inline функция, которая используется всего один раз (и то, понятно, инлайнится в тело вызывающей функции), но непонятно, почему остаётся её вторая копия?


Добавте при обьявлении этой функции static.

Анатолий.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 24 2008, 11:57
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(aesok @ Nov 24 2008, 15:35) *
Добавте при обьявлении этой функции static.

Анатолий.

У меня она так и объявлена:
Код
static inline void    ReadButtons(void) __attribute__ ((always_inline));

static inline void    ReadButtons(void)
{}


Результата нет - всё равно две копии sad.gif
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 24 2008, 19:07
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(sonycman @ Nov 24 2008, 14:57) *
У меня она так и объявлена:
Код
static inline void    ReadButtons(void) __attribute__ ((always_inline));

static inline void    ReadButtons(void)
{}


Результата нет - всё равно две копии sad.gif


Почитайте про static inline функции здесь:
http://www.greenend.org.uk/rjk/2003/03/inline.html

С ними есть какието тонкости, у меня сейчас нет времени вникать.

Анатолий.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 24 2008, 19:26
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ARV @ Nov 24 2008, 20:40) *
смутил ключик --gc-sections я всегда использую -Wl,-gc-sections возможно, это одно и то же, но на всякий случай обращу ваше внимание...

Попробовал и с -gc-sections. Вроде без разницы.
Полный текст командной строки линкера:
Код
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref --gc-sections --relax -mmcu=atmega88


Цитата(aesok @ Nov 24 2008, 23:07) *
Почитайте про static inline функции здесь:
http://www.greenend.org.uk/rjk/2003/03/inline.html

С ними есть какието тонкости, у меня сейчас нет времени вникать.

Анатолий.

Спасибо, ознакомлюсь. smile.gif

ЗЫ: Хм, написано, что инлайн функция не должна иметь статических переменных или обращаться к таковым... а у меня внутри есть статическая переменная.
Может, дело в этом?
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 24 2008, 20:00
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(sonycman @ Nov 24 2008, 22:26) *
Попробовал и с -gc-sections. Вроде без разницы.
Полный текст командной строки линкера:
Код
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref --gc-sections --relax -mmcu=atmega88
если уж вы передаете разные параметры компоновщику, то указывайте тогда их все через запятую
Код
avr-g++ -Wl,-Map,FanController.map,--cref,-gc-sections --relax -mmcu=atmega88

и снова: почему у вас 2 минуса перед gc-sections? разве 2 или 1 - это все равно? и, при всем при том, где -ffunction-sections? они же в паре должны быть. я так понимаю:
Код
avr-g++ -ffunction-sections -Wl,-gc-sections,-Map,FanController.map,--cref --relax -mmcu=atmega88


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 24 2008, 20:23
Сообщение #8


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(ARV @ Nov 25 2008, 00:00) *
Код
avr-g++ -ffunction-sections -Wl,-gc-sections,-Map,FanController.map,--cref --relax -mmcu=atmega88

Дело в том, что я компилирую через Эклипс Ганимед.
И там доп. опции куда хочешь не добавить - только в специально отведённую для этого строку.

Есть там вот что:
Код
Expert settings.
Command line pattern:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

Может, это и есть очерёдность ввода параметров?

Вот что у меня теперь:
Код
Building target: FanController.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections -gc-sections --relax -mmcu=atmega88 -o"FanController.elf"  ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o  
Finished building target: FanController.elf
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2008, 21:14
Сообщение #9


Гуру
******

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



Цитата(sonycman @ Nov 24 2008, 22:23) *
Вот что у меня теперь:
Код
Building target: FanController.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections -gc-sections --relax -mmcu=atmega88 -o"FanController.elf"  ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o  
Finished building target: FanController.elf
Добавьте -Wl, перед -gc-sections. Странно, что для линковки вызывается avr-g++ а не avr-gcc или avr-ld


--------------------
На любой вопрос даю любой ответ
"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
sonycman
сообщение Nov 24 2008, 23:36
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Сергей Борщ @ Nov 25 2008, 01:14) *
Добавьте -Wl, перед -gc-sections. Странно, что для линковки вызывается avr-g++ а не avr-gcc или avr-ld

Так выдаёт ошибку:
Код
Building target: FanController.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf"  ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o  
avr-g++.exe: Wl,-gc-sections: No such file or directory
make: *** [FanController.elf] Error 1

А что вообще означают опции Wl и -gc-sections? rolleyes.gif
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 25 2008, 07:39
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045



Цитата(sonycman @ Nov 25 2008, 01:36) *
Так выдаёт ошибку:
Код
Building target: FanController.elf
Invoking: AVR C++ Linker
avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf"  ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o  
avr-g++.exe: Wl,-gc-sections: No such file or directory
make: *** [FanController.elf] Error 1

А что вообще означают опции Wl и -gc-sections? rolleyes.gif

Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику.
А ошибка в том, что вы забыли "-" перед Wl,-gc-sections
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Перенос кода из под ИАРа на WinAVR   Nov 22 2008, 19:39
- - demiurg_spb   Поможет WinAVR\avr\include\util...   Nov 22 2008, 20:04
|- - sonycman   Цитата(demiurg_spb @ Nov 23 2008, 00:04) ...   Nov 22 2008, 21:17
|- - ReAl   Цитата(sonycman @ Nov 22 2008, 23:17) Раз...   Nov 23 2008, 18:03
|- - sonycman   Цитата(ARV @ Nov 23 2008, 21:23) как прав...   Nov 23 2008, 19:09
||- - ReAl   Цитата(sonycman @ Nov 23 2008, 21:09) то ...   Nov 23 2008, 21:37
||- - Сергей Борщ   Цитата(sonycman @ Nov 23 2008, 21:09) то ...   Nov 23 2008, 21:45
|- - Petka   Цитата(ReAl @ Nov 23 2008, 21:03) У gcc е...   Nov 23 2008, 20:38
|- - sonycman   Цитата(Petka @ Nov 24 2008, 00:38) В прин...   Nov 23 2008, 21:37
||- - ReAl   Цитата(sonycman @ Nov 23 2008, 23:37) А е...   Nov 23 2008, 21:51
|- - ReAl   Цитата(Petka @ Nov 23 2008, 22:38) В прин...   Nov 23 2008, 21:43
|- - Petka   Цитата(ReAl @ Nov 24 2008, 00:43) Это НЕ ...   Nov 24 2008, 07:35
- - MrYuran   Насколько я помню, у WinAVR имеется отличная докум...   Nov 23 2008, 08:24
|- - sonycman   Цитата(MrYuran @ Nov 23 2008, 12:24) Наск...   Nov 23 2008, 14:33
|- - sonycman   Цитата(MrYuran @ Nov 23 2008, 12:24) Наск...   Nov 23 2008, 17:09
|- - ARV   Цитата(sonycman @ Nov 23 2008, 20:09) А м...   Nov 23 2008, 17:23
|- - alx2   Цитата(sonycman @ Nov 23 2008, 22:09) А м...   Nov 23 2008, 21:54
|- - demiurg_spb   Цитата(sonycman @ Nov 24 2008, 14:05) и в...   Nov 24 2008, 11:56
|- - alx2   Привет, sonycman! Цитата(sonycman @ Nov 2...   Nov 25 2008, 21:58
|- - Rst7   Цитата(alx2 @ Nov 25 2008, 23:58) И зря. ...   Nov 26 2008, 12:46
- - sonycman   Интересно, почему при делении на два не всегда исп...   Nov 24 2008, 14:15
|- - MrYuran   Цитата(sonycman @ Nov 24 2008, 17:15) Инт...   Nov 24 2008, 14:22
|- - sonycman   Цитата(MrYuran @ Nov 24 2008, 18:22) Я об...   Nov 24 2008, 14:46
|- - demiurg_spb   Цитата(sonycman @ Nov 24 2008, 17:46) Ещё...   Nov 24 2008, 15:58
|- - sonycman   Цитата(demiurg_spb @ Nov 24 2008, 19:58) ...   Nov 24 2008, 16:05
- - ARV   смутил ключик --gc-sections я всегда использую -Wl...   Nov 24 2008, 16:40
- - ARV   -ff-sections заставляет компилятор размещать код к...   Nov 25 2008, 05:56
|- - sonycman   Цитата(gotty @ Nov 25 2008, 11:39) Для то...   Nov 25 2008, 09:41
|- - ARV   Цитата(sonycman @ Nov 25 2008, 12:41) Над...   Nov 25 2008, 09:52
|- - gotty   Цитата(sonycman @ Nov 25 2008, 11:41) Лин...   Nov 25 2008, 10:01
|- - sonycman   Цитата(ARV @ Nov 25 2008, 13:52) практика...   Nov 25 2008, 10:42
|- - ARV   Цитата(sonycman @ Nov 25 2008, 13:42) Пон...   Nov 26 2008, 07:22
|- - aesok   Цитата(ARV @ Nov 26 2008, 10:22) на сколь...   Nov 26 2008, 09:39
|- - ARV   Цитата(aesok @ Nov 26 2008, 12:39) На как...   Nov 26 2008, 09:50
- - sonycman   Цитата(alx2 @ Nov 26 2008, 01:58) Привет,...   Nov 26 2008, 10:17
|- - alx2   Цитата(sonycman @ Nov 26 2008, 15:17) Сей...   Nov 26 2008, 20:20
|- - Rst7   Цитата(alx2 @ Nov 26 2008, 22:20) -2, -3 ...   Nov 26 2008, 20:45
|- - alx2   Цитата(Rst7 @ Nov 27 2008, 01:45) Если уж...   Nov 26 2008, 21:35
||- - Rst7   Цитата(alx2 @ Nov 26 2008, 23:35) оно дае...   Nov 26 2008, 21:56
|- - sonycman   Цитата(Rst7 @ Nov 27 2008, 00:45) Однако,...   Nov 26 2008, 22:02
|- - aesok   Цитата(sonycman @ Nov 27 2008, 01:02) Но ...   Nov 27 2008, 04:14
||- - alx2   Цитата(aesok @ Nov 27 2008, 09:14) The co...   Nov 27 2008, 11:50
|- - Rst7   Цитата(sonycman @ Nov 27 2008, 00:02) А д...   Nov 27 2008, 07:56
||- - gotty   Цитата(Rst7 @ Nov 27 2008, 09:56) Аналоги...   Nov 27 2008, 08:51
|||- - Rst7   Цитата(gotty @ Nov 27 2008, 10:51) Это на...   Nov 27 2008, 09:08
||||- - gotty   Цитата(Rst7 @ Nov 27 2008, 11:08) Ссылку....   Nov 27 2008, 09:24
|||- - sonycman   Цитата(gotty @ Nov 27 2008, 12:51) Это на...   Nov 27 2008, 09:28
|||- - zltigo   Цитата(sonycman @ Nov 27 2008, 12:28) Но ...   Nov 27 2008, 09:45
|||- - sonycman   Цитата(zltigo @ Nov 27 2008, 13:45) Следо...   Nov 27 2008, 10:04
|||- - Сергей Борщ   Цитата(sonycman @ Nov 27 2008, 12:04) Пон...   Nov 27 2008, 11:35
||- - aesok   Цитата(Rst7 @ Nov 27 2008, 10:56) вычисля...   Nov 27 2008, 16:52
||- - Rst7   Цитата(aesok @ Nov 27 2008, 18:52) Расмот...   Nov 27 2008, 17:08
|- - alx2   Цитата(sonycman @ Nov 27 2008, 03:02) Код...   Nov 27 2008, 11:29
|- - sonycman   Цитата(alx2 @ Nov 27 2008, 15:29) Как ты ...   Nov 27 2008, 13:35
- - sonycman   2aesok Если у меня в программе операнд имеет тип c...   Nov 27 2008, 17:03
|- - aesok   Цитата(sonycman @ Nov 27 2008, 20:03) 2ae...   Nov 27 2008, 17:18
|- - sonycman   Цитата(aesok @ Nov 27 2008, 21:18) Я вам ...   Nov 27 2008, 18:22
|- - aesok   ЦитатаЭтот пример не имеет ничего общего с моим пр...   Nov 27 2008, 19:49
|- - sonycman   Цитата(aesok @ Nov 27 2008, 23:49) Это Ва...   Nov 27 2008, 21:52
|- - aesok   Цитата(sonycman @ Nov 28 2008, 00:52) Нет...   Nov 27 2008, 22:22
||- - sonycman   Цитата(aesok @ Nov 28 2008, 02:22) Я попы...   Nov 27 2008, 22:46
||- - aesok   Цитата(sonycman @ Nov 28 2008, 01:46) Хм....   Nov 27 2008, 23:20
||- - sonycman   Цитата(aesok @ Nov 28 2008, 03:20) Потому...   Nov 28 2008, 00:34
|- - alx2   Цитата(sonycman @ Nov 28 2008, 02:52) Код...   Nov 29 2008, 11:51
|- - sonycman   Цитата(alx2 @ Nov 29 2008, 15:51) Поэтому...   Nov 29 2008, 21:02
|- - aesok   Цитата(sonycman @ Nov 30 2008, 00:02) Я п...   Nov 29 2008, 22:00
||- - sonycman   Цитата(aesok @ Nov 30 2008, 02:00) Не заб...   Nov 29 2008, 22:24
|||- - alx2   Цитата(sonycman @ Nov 30 2008, 03:24) А в...   Nov 30 2008, 14:40
||- - Rst7   Цитата(aesok @ Nov 30 2008, 00:00) меня н...   Nov 29 2008, 22:24
||- - aesok   Цитата(Rst7 @ Nov 30 2008, 01:24) Простит...   Nov 29 2008, 22:36
|- - alx2   Цитата(sonycman @ Nov 30 2008, 02:02) Зач...   Nov 30 2008, 13:41
|- - sonycman   Цитата(Rst7 @ Nov 30 2008, 17:46) Жесть. ...   Nov 30 2008, 14:19
- - Сергей Борщ   Цитата(sonycman @ Nov 28 2008, 02:34) То ...   Nov 28 2008, 01:08
- - Rst7   ЦитатаВо-вторых, я подозреваю, что вероятность вых...   Nov 29 2008, 12:53
|- - AHTOXA   Цитата(Rst7 @ Nov 29 2008, 17:53) А значи...   Nov 29 2008, 19:31
||- - Rst7   Цитата(AHTOXA @ Nov 29 2008, 21:31) Но ве...   Nov 29 2008, 21:43
||- - sonycman   Цитата(Rst7 @ Nov 30 2008, 01:43) С друго...   Nov 29 2008, 21:56
|||- - Rst7   Цитата(sonycman @ Nov 29 2008, 23:56) Там...   Nov 29 2008, 22:53
||||- - sonycman   Цитата(Rst7 @ Nov 30 2008, 02:53) Дык где...   Nov 29 2008, 23:14
|||||- - alx2   Цитата(sonycman @ Nov 30 2008, 04:14) В И...   Nov 30 2008, 14:21
|||||- - sonycman   Цитата(alx2 @ Nov 30 2008, 18:21) Можно в...   Nov 30 2008, 14:34
||||- - aesok   Цитата(Rst7 @ Nov 30 2008, 01:53) Вынужде...   Nov 29 2008, 23:31
|||- - alx2   Цитата(sonycman @ Nov 30 2008, 02:56) Име...   Nov 30 2008, 13:57
||- - AHTOXA   Цитата(Rst7 @ Nov 30 2008, 02:43) Плохо В...   Nov 29 2008, 23:23
|- - alx2   Привет, Rst7! Цитата(Rst7 @ Nov 29 2008, ...   Nov 30 2008, 13:13
- - sonycman   Неважнецки получается у GCC работа со структурой в...   Nov 30 2008, 10:23
- - Rst7   Хоть я и откланялся, но господину sonycman'у о...   Nov 30 2008, 11:09
|- - sonycman   Цитата(Rst7 @ Nov 30 2008, 15:09) 218 byt...   Nov 30 2008, 11:57
- - sonycman   RST7 Не получается у меня научить гнуса правильно ...   Nov 30 2008, 13:22
- - Rst7   Цитатаи результат компиляции первой строчки: Жест...   Nov 30 2008, 13:46
2 страниц V   1 2 >


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

 


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


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