Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Różnice wielkości pliku po kompilacji AVR-GCC.

dziechu 06 Cze 2010 21:21 5187 47
  • #31
    gaskoin
    Poziom 38  
    nie ma też co na chama oszczędzać miejsca, jak biblioteki są potężne, na które potrzeba osobnego dysku 8TB a używasz jednej funkcji, to od biedy, można zawsze wywalić to co nie potrzebne ;)

    Też jestem zwolennikiem wymyślania koła od nowa, bo lubie wiedzieć jak coś działa, ale faktycznie czasu na to zaczyna brakować i zaczynam układać wszystko z klocków
  • #32
    dziechu
    Poziom 27  
    gaskoin, zauważ że piszę o programach w C na kontrolery AVR:) Nie ma więc mowy o 8TB, a najwyżej 32kB, co zasadniczo zmienia podejście i warto walczyć o każde 100 bajtów:) Kontroler ma 32kB a mój początek programu ma już 5kB. To jest początek programu w porównaniu z całym programem napisanym w asemblerze, który zajął mi 4kB. Nigdy w życiu nie pisałbym programów w C, gdyby biblioteki AVR asm były tak dostępne jak C. Ponieważ jednak chcę swoje urządzenia nieco unowocześnić i zastąpić cz/b wyswietlacze graficzne 128x64 wyświetlaczem kolorowym TFT 320x240, jak zobaczyłem opis sterowania, ilość rozkazów itd. to sie przeraziłem. Nie tym że nie dam rady, ale ilością do zrobienia. Np. w C udało mi się zrobić komunikację z czujnikiem RGB firmy Hamamatsu w 10 min, po prostu dlatego że jest mniej pisania i liczenia. Np. banalne kwestie odstępów czasowych - w asm muszę obliczyć ile cykli przy danym zegarze żeby otrzymać opóźnienie 5 mikrosekund, a w C dołączając standardową bibliotekę wpisuję _delay_us(5); i już mam. Po prostu wszyscy wspierają C a asm olewają :)
    No i jeszcze jedna ważna kwestia - ostatnio są spore problemy z zakupem niektórych ATMEGA, szczególnie 8 ale też 16,32... Mając program w C, dość niewielką pracą mogę go dostosować i przekompilować na np. PIC, a w asemblerze trzeba po prostu wszystko od zera.
  • #33
    gaskoin
    Poziom 38  
    dziechu napisał:
    gaskoin, zauważ że piszę o programach w C na kontrolery AVR:) Nie ma więc mowy o 8TB, a najwyżej 32kB


    wiem, no przeciez to taki zart był wyolbrzymiający sytuacje :), btw - da sie przeciez przy pomocy AVR obsluzyc dysk twardy :)

    dziechu napisał:

    Nigdy w życiu nie pisałbym programów w C, gdyby biblioteki AVR asm były tak dostępne jak C. (...)Po prostu wszyscy wspierają C a asm olewają :)


    Bo assembler jest trudny i mało kto potrafi w nim pisać, poza tym biblioteki w C są uniwersalne, a kod assemblera już niestety nie. Jak sam zauważyłeś przeniesienie tego na PIC nie jest jakims wielkim problemem w C, a w assemblerze wszystko od nowa. Druga sprawa - teraz przy niskiej cenie można dostać naprawde wiele, więc powoli producenci przestają się przejmować tym, że braknie pamięci, szybkości, czy czegośtam jeszcze

    dziechu napisał:

    No i jeszcze jedna ważna kwestia - ostatnio są spore problemy z zakupem niektórych ATMEGA, szczególnie 8 ale też 16,32.


    jest o tym osobny wątek, tu na forum, wyjaśniający dlaczego
  • #35
    utak3r
    Poziom 25  
    gaskoin napisał:
    GCC sam w sobie jest tylko głupim kompilatorem, i nie wydaje mi się żeby sprawdzał czy coś użyłeś czy nie tylko bierze jak leci


    "Głupi kompilator" w ogóle nic nie dołącza, tylko kompiluje źródła do postaci plików binarnych. Dopiero linker (po "polskawemu" konsolidator...) jest tym programem, który decyduje, jak Twoje binarki i ewentualne biblioteki połączyć ze sobą w całość. Większość implementacji linkerów ma tak, że z danej binarki dołącza tylko te funkcje, które zostały faktycznie użyte (wprost, lub poprzez zależności).

    Ja natomiast polecam sprawdzić w ustawieniach jeszcze jedno: co z symbolami debuggera? Zazwyczaj domyślnie są one dołączane do programu, co wydatnie zwiększa jego objętość.
  • #36
    gaskoin
    Poziom 38  
    utak3r napisał:
    Większość implementacji linkerów ma tak, że z danej binarki dołącza tylko te funkcje, które zostały faktycznie użyte (wprost, lub poprzez zależności).


    Ten z AVR Studio najwyrazniej nie ma :)
  • #37
    PO.
    Poziom 20  
    dziechu napisał:
    Mam biblioteki na np. wyświetlacze graficzne, bardzo bogate, mają funkcje czcionek różnej wielkości, rysowania linii, okręgów, prostokątów, wrzucania bitmap... Dołączam taką bibliotekę, a jeżeli nie wszystkie funkcje wykorzystuję, to albo muszę je w danym projekcie wyciąć, albo zastosować sposoby jak wyżej. W asmblerze też zawsze pisałem sam procedury, mam wszystkie własne, obsługi różnych wyswietlaczy graficznych, alfanumerycznych, eepromow zewnetrznych itd.. Ale już mi się nie chce. Jak widzę opis obsługi wyświtlaczy kolorowych TFT z 1000 różnych rozkazów, to wolę gotowe biblioteki niż siedzieć całymi dniami i je tworzyć.



    A o to niedawno pytałem :) https://www.elektroda.pl/rtvforum/topic1651223.html

    Swoją drogą, ja mam dużą bibliotekę podzieloną na warstwy, osobno sprzęt, osobno kilka programowych. Przy zmianie wyświetlacza albo podłączenia nie muszę nawet funkcji w głównym programie zmieniać ani nic bo jest jednolicie i zamiennie napisane.
    I to jest racja w c, napiszesz raz i masz spokój :E . Potem tylko dopisujesz po kawałku.
  • #38
    dziechu
    Poziom 27  
    No ten z AVR Studio nie ma. Kiedy nieużywane funkcje wytne, to kod się zmniejsza, czyli są dołączane pomimo że nie używane. No ale po tej dyskusji mam znacznie poszerzony obraz całości, w razie czego nie będę już szukał tak 'na ślepo'. Internet z fachowcami w środku to suuuuuper sprawa:)

    Dodano po 43 [minuty]:

    Dzięki PO, co prawda jeszcze nie mam pojęcia o linkerach itp.. gdzie 'wsadzić' -Wl,--gc-sections, ale używam static gdzie trzeba. No i nie wiem czy to mała inteligencja AVR Studio czy moja, bo jeżeli wpiszę:

    static int tlad = 200;

    to jest ok, a jak napiszę:

    static int tlad = 200;
    static int tladf = tlad/20;

    to mi pisze że tladf nie jest stałą. ??? No przecież jest, zależną od tlad, ale tak jak tlad jest obliczana tylko raz przy kompilacji i wstawiana do kodu.
  • #39
    utak3r
    Poziom 25  
    Stała to jest const, a nie static. Poza tym spojrzyj na konstrukcję typu:

    Code:

    #define MAX_BUFOR  32
    ........................
    char bufor[MAX_BUFOR+2];
  • #40
    tmf
    Moderator Mikrokontrolery Projektowanie
    gaskoin - AVR Studio nie ma linkera, wykorzystuje linkera z pakietu WinAVR. A jak się przypatrzysz jak działa linker to zauważysz, że nie ma on możliwości wyrzucenia funkcji z danej jednostki kompilacji, bo nie może zmieniać kodu w plikach obj - od tego jest kompilator. Linker może tylko relokować kod, uzupełniać adresy itd, albo wywalić całego obj jeśli nie jest wykorzystywany. Więc, żeby niepotrzebne funkcje wyleciały musi to zrobić kompilator. A ten z kolei, mając dostęp tylko do danych jednostek kompilacji (plików źródłowych) też może to zrobić wyłącznie w przypadku funkcji lokalnych, co do których istnieje pewność, że nie są wykorzystywane w innych jednostkach kompilacji - a o tym trzeba kompilatorowi powiedzieć, używając słów kluczowych takich jak static. Inną możliwością jest umieszczenie jednej funkcji w jednej jednostce kompilacji tak jak to jest np. w przypadku biblioteki AVR-libc. A trzecią możliwością jest kompilowanie wszystkiego na raz (z jednego wywołania gcc) i zastosowanie odpowiednich flag optymalizacji.

    dziechu - AVR Studio to tylko IDE + Symulator, przy kompilacji całkowicie polega na WinAVR, czyli gcc. Nie ma więc sensu mówić, że czegoś nie ma. Jeśli nie wyrzuca nieużywanych funkcji to z powodów j.w., czyli znowu kłania się nauka od podstaw. A co do książek to polecam biblię C, jest też chyba do ściągnięcia jako free download.
  • #41
    dziechu
    Poziom 27  
    Dzięki, poszukam. Mam na razie 'Język ANSI C' Kernighana. Widać że jest tu kilka problemów oddzielnych - pisanie programu to jeden, poustawianie bibliotek, kompilatorów, linkerów, tworzenie plików Makefile itd... to drugi i w sumie dla mnie trudniejszy. Chyba na razie będę starał się mieć program i wymagane funkcje z bibliotek w jednym pliku, bo w tydzień raczej tego nie połapię:)
  • #42
    utak3r
    Poziom 25  
    Zamiast Kernighana, poszukaj manuala do gcc :) na przykład na jakichś stronach linuksowych znajdziesz dobre manuale.
  • #43
    dziechu
    Poziom 27  
    Mam jeszcze jedno pytanie, czy taka konstrukcja jest ok?

    int a = float b;

    Czy a przejmie całkowitą część b?

    Chodzi mo i coś takiego:

    int a;
    float b;

    b = log10(a) * 100;
    a = b;

    W tym momencie powinienem mieć w a część całkowitą z dwoma cyframi po przecinku z log10(a), czy tak? Jeszcze nie łapię jak robi sie działania na liczbach różnego typu.

    Bo jak robię od razu:

    a = log10(a) * 100;

    to nie jest ok, log10 musi mieć float.
  • Pomocny post
    #44
    tmf
    Moderator Mikrokontrolery Projektowanie
    Tak, zadziała. log musi mieć float, ale możesz od razu zrobić rzutowanie typów:
    a=(int)(log10(a)*100);
    Weź tylko pod uwagę, że takie rzutowanie po prostu obetnie ci część po przecinku, jeśli jesteś zainteresowany zaokrągleniem w górę lub w dół to daj:
    a=(int)(log10(a)*100+0,5);
  • #45
    dziechu
    Poziom 27  
    Wielkie dzięki tmf:)

    a=(int)(log10(a)*100); - to znaczy nie muszę deklarować żadnej zmiennej float? tylko int a; ?

    To znaczy nie rozumiem co mi obetnie, wszystko po przecinku z log10(a) czy wszystko po przecinku z log10(a) * 100 (to *100 jest właśnie dla przeniesienie dwóch cyfr przed przecinek zanim zamieniam na int).
  • #46
    tmf
    Moderator Mikrokontrolery Projektowanie
    Nie musisz deklarować floata, ale w sensie szybkości czy wielkości programu to nic nie zmieni. Kompilator i tam musi stworzyć tymczasową zmienną o typie float, tyle, że zrobi to sam, bez twojego udziału.
    Przy tym zapisie, który ci podałem obetnie wszystko po przecinku z wyniku (log10(a)*100), czyli to o co ci chodzi.