eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › avr-gcc wielkość kodu
Ilość wypowiedzi w tym wątku: 8

  • 1. Data: 2009-09-11 10:30:41
    Temat: avr-gcc wielkość kodu
    Od: "pawel" <p...@p...onet.pl>

    Witam.

    Mam dwie zmienne lokalne typu
    unsigned int a,b;
    i dwa wskaźniki typu
    char *wsk1,*wsk2;

    Zmienne te wykorzystuję w jednej funkcji.
    Chcąc wykorzystać je globalnie w innych funkcjach przeniosłem je do
    globalnych.
    Dlaczego po samym przeniesieniu ich rozmiar kodu urósł aż o 44 bajty?

    Dzięki za pomoc
    Paweł




  • 2. Data: 2009-09-11 13:19:25
    Temat: Re: avr-gcc wielkość kodu
    Od: Łukasz Góralczyk <l...@g...com>

    On Fri, 11 Sep 2009 12:30:41 +0200, pawel wrote:
    [ciach o zm. lok.]
    > Zmienne te wykorzystuje w jednej funkcji. Chc?c wykorzystaae je globalnie
    > w innych funkcjach przenios?em je do globalnych.
    > Dlaczego po samym przeniesieniu ich rozmiar kodu urós? a? o 44 bajty?

    Domyślam się że dorzucany jest kod do inicjacji zmiennych globalnych,
    zmienne lokalne nie muszą być inicjowane. Tutaj więcej: http://
    www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_var
    init .

    P.S.
    Ustaw czytnik tak aby wysyłał w jakim kodowaniu masz posty.

    --
    Łukasz.


  • 3. Data: 2009-09-11 14:10:20
    Temat: Re: avr-gcc wielkość kodu
    Od: Zbych <a...@o...pl>

    Łukasz Góralczyk pisze:

    > On Fri, 11 Sep 2009 12:30:41 +0200, pawel wrote:
    >> Dlaczego po samym przeniesieniu ich rozmiar kodu urósł aż o 44 bajty?

    Skoro masz swój program przed nosem, to czemu nie porównasz plików
    wynikowych (*.lst, albo *.lss) z obydwu wersji (przy pomocy np. beyond
    compare), tylko liczysz na to, że na grupie jest wróżka?

    > Domyślam się że dorzucany jest kod do inicjacji zmiennych globalnych,

    Kod inicjalizacyjny jest niezależnie od tego czy jest co inicjalizować,
    czy nie. A przynajmniej gcc nie potrafi tego kodu usuwać.


  • 4. Data: 2009-09-11 14:11:15
    Temat: Re: avr-gcc wielkość kodu
    Od: Grzegorz Kurczyk <g...@c...slupsk.pl>

    Użytkownik pawel napisał:
    > Witam.
    >
    > Mam dwie zmienne lokalne typu
    > unsigned int a,b;
    > i dwa wskaźniki typu
    > char *wsk1,*wsk2;
    >
    > Zmienne te wykorzystuję w jednej funkcji.
    > Chcąc wykorzystać je globalnie w innych funkcjach przeniosłem je do
    > globalnych.
    > Dlaczego po samym przeniesieniu ich rozmiar kodu urósł aż o 44 bajty?
    >

    Operacje na zmiennych lokalnych wykonywane są w miarę możliwości
    bezpośrednio na rejestrach. Są to rozkazy dwu-bajtowe (jedno słowo).
    Przeniesienie zmiennych do globalnych wymusza odwoływanie się do nich za
    pośrednictwem czterobajtowych rozkazów LD i ST. Przykładowo
    inkrementacja zmiennej lokalnej typu char przechowywanej w rejestrze to
    jeden rozkaz np:
    INC R16
    zajmujący dwa bajty.
    Dla zmiennej globalnej zapamiętanej w pamięci RAM będzie to już
    sekwencja trzech rozkazów np:
    LD R16, [zmienna] // 4 bajty
    INC R16 // 2 bajty
    ST [zmienna], R16 // 4 bajty
    czyli z dwóch bajtów zrobiło się dziesięć.

    Dla zmiennych typu int i wskaźników sprawa wygląda odpowiednio gorzej.
    Kompilator stara się to możliwie optymalizować wykonując co się da na
    rejestrach i dopiero na koniec zapamiętuje wynik w pamięci RAM pod
    adresem zmiennej.


    Pozdrawiam
    Grzegorz


  • 5. Data: 2009-09-11 14:27:15
    Temat: Re: avr-gcc wielkość kodu
    Od: Łukasz Góralczyk <l...@g...com>

    On Fri, 11 Sep 2009 16:10:20 +0200, Zbych wrote:
    [ciach]
    >> Domyślam się że dorzucany jest kod do inicjacji zmiennych globalnych,
    >
    > Kod inicjalizacyjny jest niezależnie od tego czy jest co inicjalizować,
    > czy nie. A przynajmniej gcc nie potrafi tego kodu usuwać.

    Masz rację, teraz sprawdziłem dokładniej i różnica wynika z tego że
    zmienne globalne musi przechowywać z pamięci (odczyt zapis).

    --
    Łukasz.


  • 6. Data: 2009-09-11 14:58:16
    Temat: Re: avr-gcc wielkość kodu
    Od: Norbert Jaros <n...@g...com>

    On 11 Wrz, 16:11, Grzegorz Kurczyk
    <g...@c...slupsk.pl> wrote:
    > Użytkownik pawel napisał:
    >
    > > Witam.
    >
    > > Mam dwie zmienne lokalne typu
    > > unsigned int a,b;
    > > i dwa wskaźniki typu
    > > char *wsk1,*wsk2;
    >
    > > Zmienne te wykorzystuję w jednej funkcji.
    > > Chcąc wykorzystać je globalnie w innych funkcjach przeniosłem je do
    > > globalnych.
    > > Dlaczego po samym przeniesieniu ich rozmiar kodu urósł aż o 44 bajty?
    >
    > Operacje na zmiennych lokalnych wykonywane są w miarę możliwości
    > bezpośrednio na rejestrach. Są to rozkazy dwu-bajtowe (jedno słowo).
    > Przeniesienie zmiennych do globalnych wymusza odwoływanie się do nich za
    > pośrednictwem czterobajtowych rozkazów LD i ST. Przykładowo
    > inkrementacja zmiennej lokalnej typu char przechowywanej w rejestrze to
    > jeden rozkaz np:
    > INC     R16
    > zajmujący dwa bajty.
    > Dla zmiennej globalnej zapamiętanej w pamięci RAM będzie to już
    > sekwencja trzech rozkazów np:
    > LD      R16, [zmienna] // 4 bajty
    > INC     R16             // 2 bajty
    > ST      [zmienna], R16  // 4 bajty
    > czyli z dwóch bajtów zrobiło się dziesięć.
    >
    > Dla zmiennych typu int i wskaźników sprawa wygląda odpowiednio gorzej.
    > Kompilator stara się to możliwie optymalizować wykonując co się da na
    > rejestrach i dopiero na koniec zapamiętuje wynik w pamięci RAM pod
    > adresem zmiennej.
    >
    > Pozdrawiam
    > Grzegorz

    .... jest jeszcze gorzej , bo jeżeli chcesz użyć LD to najpierw trzeba
    adres zmiennej załadować do X,Y lub Z
    a jeżeli użyjesz LDS to zajmujesz 2 słowa ale sądząc po tych " // 4
    bajty " to chyba o LDS koledze wlasnie chodzilo.... :)

    Pozdrawiam
    Norbert


  • 7. Data: 2009-09-15 09:11:03
    Temat: Re: avr-gcc wielkość kodu
    Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>

    Użytkownik Norbert Jaros napisał:
    >
    > .... jest jeszcze gorzej , bo jeżeli chcesz użyć LD to najpierw trzeba
    > adres zmiennej załadować do X,Y lub Z
    > a jeżeli użyjesz LDS to zajmujesz 2 słowa ale sądząc po tych " // 4
    > bajty " to chyba o LDS koledze wlasnie chodzilo.... :)

    Oczywiście ma Kolega rację. Chodziło mi o LDS i STS. Adresowanie
    pośrednie z offsetem kompilator używa do adresowania pól w zmiennych
    strukturalnych o ile jest to opłacalne (kilka odwołań pod rząd). Przy
    pojedynczym odwołaniu skompiluje do LDS/STS.

    Pozdrawiam
    Grzegorz


  • 8. Data: 2009-09-16 19:47:15
    Temat: Re: avr-gcc wielkość kodu
    Od: Adam Dybkowski <a...@4...pl>

    Grzegorz Kurczyk pisze:

    >> .... jest jeszcze gorzej , bo jeżeli chcesz użyć LD to najpierw trzeba
    >> adres zmiennej załadować do X,Y lub Z
    >> a jeżeli użyjesz LDS to zajmujesz 2 słowa ale sądząc po tych " // 4
    >> bajty " to chyba o LDS koledze wlasnie chodzilo.... :)
    >
    > Oczywiście ma Kolega rację. Chodziło mi o LDS i STS. Adresowanie
    > pośrednie z offsetem kompilator używa do adresowania pól w zmiennych
    > strukturalnych o ile jest to opłacalne (kilka odwołań pod rząd). Przy
    > pojedynczym odwołaniu skompiluje do LDS/STS.

    Warto przy tym pamiętać, że instrukcje LDS i STS mają podany bezwzględny
    adresu w drugim słowie rozkazu. Dlatego też są używane przez kompilatory
    do pobrań i zapisów zmiennych globalnych, których adresy określane są na
    etapie konsolidacji (linkowania). Ale jeżeli zmienna leży na stosie lub
    jest alokowana dynamicznie, LDS i STS do niczego się nie przydadzą.

    --
    Adam Dybkowski
    http://dybkowski.net/

    Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: