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

[ATtiny 2313] problem z wielkoscia kodu wynikowego

stoowa 17 Lip 2009 16:20 1058 4
  • #1 6790159
    stoowa
    Poziom 14  
    Witam!
    uuzywam AVR studio i w swoim programie mam petle

    
    for(i=0;i<a;i++)
    {
    czekaj();
    }
    


    niestey wielkosc kodu wynikowego zajmuje ponad 100% dostepnego miejsca w ATtiny2313... doczytalem ze moze miec to cos wspolnego z optymalizacja kodu ale niestety nie poradzilem sobie z tym problemem...

    zmieniajac kod na
    
    for(i=0;i<200;i++)
    {
    czekaj();
    }
    

    wszystko zajmuje tylko jakies 10% dostepnej pamieci...
    problem w tym ze chcialbym uzywac zmiennej do wyznaczania ile razy ma sie wykonac petla...
    podobny efekt mialem jak uzywalem funkcji delay_ms(a) ( ze zmienna) lub delay_ms(200) (ze stala wartoscia)
    ktos moze podpowiedziec jak sobie z tym poradzic... ?!
  • #2 6790191
    mariuz
    Poziom 31  
    może zmień typ zmiennej a... Nie mam avr studio, ale zmień na coś, co zajmuje jeden bajt (coś w stylu single )
  • #3 6790234
    stoowa
    Poziom 14  
    zmienilem z double na int i pomoglo.. ale tylko przy petli... pzy funkcji delay dalej to samo...
  • #4 6790266
    mirekk36
    Poziom 42  
    matko bosko - ludzie do tej prostej pętelki deklarujesz zmienną i jak double, single albo int czy jeszcze jakieś inne cholerstwo???? to się nie dziw, że kod ci puchnie - toż to zgroza

    poczytaj sobie może najpierw o typach

    to zobaczysz , że taką zmienną w tej pętli która ma działać od 0 do 200 - najlepiej zadeklarować jako zwykły uint8_t - jeśli ma być więcej iteracji niż 255 to uint16_t

    a ty wplatasz jakieś typy zmiennoprzecinkowe może itp - to kompilator pomimo najlepszej optymalizacji musi dorzucić sobie biblioteki do obsługi takich liczb a to niestety waży!

    ... natomiast funckję _delay_ms() najlepiej wywoływać ze stałą określającą czas opóźnienia w ms a nie wkładać tam znowu zmienną - bo to znowu ci spowoduje puchnięcie kodu na maxa

    jeśli chcesz zrobić własną pętelkę opóźniającą opratą o powyższą funkcję to:

    void czekaj(uint16_t ms)
    {
       while (ms--) _delay_ms(1);
    }


    i po kłopocie
  • #5 6791093
    stoowa
    Poziom 14  
    thx.. faktycznie troche przerost formy nad trescia wyszedl.. ;]
REKLAMA