logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Dlaczego kod w Eclipse z avr-gcc jest większy niż z makefile WinAVR?

quniq 02 Cze 2012 18:18 1587 6
  • #1 10959781
    quniq
    Poziom 21  
    Witam.
    Z dniem dzisiejszym przesiadłem się na eclipsa. Programuję (a raczej staram się :D) pod linuxem. Nie mogę dojść, dlaczego kod z eclipsa zajmuje 2 razy tyle miejsca, co kod skompilowany za pomocą makefile wygenerowanego przez winavr (jeszcze pod windowsem, działa też na linuxie).
    Oczywiście optymalizacja i tu i tu jest ustawiona na rozmiar (-Os). Co z tym fantem zrobić?
    Mój kod obecnie ma 2.5kB (kompilacja w terminalu), a po kompilacji eclipsem ma prawie 5.5kB. Po wyłączeniu optymalizacji rozmiar ten wynosi 6.5kB. Skąd taka różnica?
    Wiem, że to będzie wróżenie z fusów, ale sam sobie z tym nie potrafię poradzić, nie znam na tyle eclipsa, ani kompilatora (podejrzewam, że tu jest pies pogrzebany).
    Pozdrawiam.
  • #2 10959917
    gaskoin
    Poziom 38  
    -Os to nie jedyna flaga optymalizacyjna. Jest co najmniej kilkadziesiąt, zajrzyj do make i sprawdź jakie flagi jeszcze były poustawiane.

    Kod jest taki sam? Nic nie zmieniłeś ?
  • #3 10959989
    quniq
    Poziom 21  
    Kod jest zaimportowany z plików, które kompilowałem w terminalu.
    Jesteś w stanie powiedzieć w którym miejscu makefile mam szukać tych flag, jak się nazywają? Generalnie jest to prawie domyślny makefile, jeżeli to Ci w czymś pomoże...
    Dzięki za odzew :)


    EDIT: porównałem flagi wywoływane w czasie kompilacji w terminalu i w eclipse i faktycznie, są różnice, ale po uzupełnieniu flag w eclipsie rozmiar kodu i tak się nie zmienia.

    Kompilacja w eclipse;
    Cytat:

    avr-gcc -Wall -Os -fpack-struct -fshort-enums -I. -gdwarf-2 -Wstrict-prototypes -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.d" -c -o "main.o" "../main.c"


    i kompilacja z makefile

    Cytat:
    avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.
  • #4 10960118
    tymon_x
    Poziom 30  
    quniq napisał:
    Generalnie jest to prawie domyślny makefile, jeżeli to Ci w czymś pomoże...

    Pewnie nie usuwasz nieużywanych funkcji albo tzw. dead code, które linker i tak je wrzuca do ostatecznego pliku.
    Flagi: -fdata-sections -ffunction-sections i później usuwasz je --gc-sections. Możliwe, że dodajesz też informacje o debugowaniu, flaga -g. Możliwości jest sporo. Porównaj Sobie makefile, to nie są jakieś tajemne ukryte pliki :P
  • #5 10960393
    quniq
    Poziom 21  
    Ok, mam.
    Z jakiegoś powodu obsługa obliczeń na liczbach float w eclipse i biblioteka math.h zajmuje aż 3kB, podczas gdy kompilacja z makefile zabiera tyko 200B. Tylko dlaczego?
  • #6 10960447
    gaskoin
    Poziom 38  
    Tak myślałem :) Stąd było pytanie czy coś zmieniałeś. Pokaż kod to się wszystko okaże. Generalnie biblioteka programowa dla floata tyle zajmuje i jakkolwiek go nie użyjesz w programie to się zawsze o tyle rozrośnie. Wyjątkiem są procesory z FPU, ale AVR chyba takowych nie mają. Makefile widocznie masz zły skoro się nie rozrasta wraz z użyciem floata.
  • #7 10960549
    quniq
    Poziom 21  
    Rozrósł się, ale o te 200B. Nie wiem, czy zły, czy nie, ale generalnie program działał... I to mnie zastanawia :D
    Nie mam już kodu z floatem, ale generalnie było to przeliczanie z ADC na napięcie (0-25V) z użyciem funkcji floor.
    Po zmianie, program z eclipse zajmuje 1.5kB, a w terminalu 2.5kB, więc jest cycuś glancuś.
    Dziwne tylko, że te floaty kompilowane w terminalu zajęły tak mało...
REKLAMA