-
1. Data: 2009-03-14 17:54:07
Temat: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
Witam.
Dlaczego funkcje deklarowane w eeprom.h są always inline?
Czy muszą takie być ze względu na ich konstrukcję?
Akurat potrzebuję takich funkcji non-inline ze względu na braki pamięci
programu
czy mogę poprostu przepisać ten plik i nie deklarować ich jako always
inline?
Dzięki za pomoc.
Pozdrawiam
Paweł
-
2. Data: 2009-03-14 18:30:17
Temat: Re: avr-gcc eeprom inline
Od: Zbych <a...@o...pl>
pawel pisze:
> Witam.
> Dlaczego funkcje deklarowane w eeprom.h są always inline?
> Czy muszą takie być ze względu na ich konstrukcję?
To wynika z tego, że rejestry sterujące eepromem są pod różnymi adresami
w różnych uC a biblioteka jest jedna dla wszystkich. Dzięki
inline'owaniu adresy mogą być ustalone na etapie kompilacji projektu a
nie biblioteki.
> Akurat potrzebuję takich funkcji non-inline ze względu na braki pamięci
> programu
> czy mogę poprostu przepisać ten plik i nie deklarować ich jako always
> inline?
Samo usunięcie inline nic nie da (kompilator będzie narzekał na
zdublowane definicje). Najlepiej w jednym pliku swojego projektu zrób
własne funkcje zapisu/odczytu eepromu i umieść w nich odwołania do
funkcji bibliotecznych.
-
3. Data: 2009-03-14 19:00:13
Temat: Re: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
> Samo usunięcie inline nic nie da (kompilator będzie narzekał na zdublowane
> definicje). Najlepiej w jednym pliku swojego projektu zrób własne funkcje
> zapisu/odczytu eepromu i umieść w nich odwołania do funkcji
> bibliotecznych.
Chodzi ci o coś takiego?
uint8_t eeprommy_read_byte (const uint8_t *addr){
return eeprom_read_byte(addr);
}
Mam sporo wywołań bibliotecznych funkcji.
Czy to napewno zmniejszy mi rozmiaru kodu?
Czy wywołanie powyższej funkcji nie spowoduje mimo wszystko wstawienia za
każdym razem
funkcji eeprom_read_byte jako inline?
Pozdrawiam
Paweł
-
4. Data: 2009-03-14 19:24:29
Temat: Re: avr-gcc eeprom inline
Od: Zbych <a...@o...pl>
pawel pisze:
> Mam sporo wywołań bibliotecznych funkcji.
> Czy to napewno zmniejszy mi rozmiaru kodu?
Jeśli eeprommy_read_byte wyląduje w pliku *.c a nie w nagłówkowym to
rozmiar powinien zmaleć.
> Czy wywołanie powyższej funkcji nie spowoduje mimo wszystko wstawienia za
> każdym razem
> funkcji eeprom_read_byte jako inline?
Uważasz, że kompilator robi kopię normalnej funkcji przy każdym wywołaniu?
-
5. Data: 2009-03-14 19:52:19
Temat: Re: avr-gcc eeprom inline
Od: "T.M.F." <t...@n...mp.pl>
Zbych pisze:
> pawel pisze:
>
>> Mam sporo wywołań bibliotecznych funkcji.
>> Czy to napewno zmniejszy mi rozmiaru kodu?
>
> Jeśli eeprommy_read_byte wyląduje w pliku *.c a nie w nagłówkowym to
> rozmiar powinien zmaleć.
>
>> Czy wywołanie powyższej funkcji nie spowoduje mimo wszystko wstawienia
>> za każdym razem
>> funkcji eeprom_read_byte jako inline?
>
> Uważasz, że kompilator robi kopię normalnej funkcji przy każdym wywołaniu?
>
Czasami tak.
Pytanie kontrolne - jakiej wersji avr-gcc uzywasz? Najnowsza ma
regression bug i ma tendencje do bardzo ostrego inlinowania funkcji co
zwieksza objetosc. Rozwiazaniem jest proba kompilacji jakas wczesniejsza
wersja lub ew. sprobowanie najnowszej wersji RC, czy czym nie wiem czy
ten blad poprawiono.
Inna sprawa, ze funkcje zapisu do EEPROM sa na tyle krotkie, ze koszt
ich wywolania i przekazania parametrow moze byc wyzszy niz kazdorazowe
osadzanie calej funkcji.
Ile ci brakuje bajtow?
-
6. Data: 2009-03-14 20:05:18
Temat: Re: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
> Ile ci brakuje bajtow?
Stosunkowo sporo, atmega32
Program: 32830 bytes (100.2% Full)
Maksymalnie 32768.
Wyremowanie jednej linijki
for(i = 0; i < MAX_DS18X20; i++)
{
//blablabla
eeprom_write_byte(&ds18x20_ee[i].restout, k);
//blablabla
}
gdzie ds18x20_ee to struktura, restout to jej pole
zmniejsza kod wynikowy do:
Program: 32744 bytes (99.9% Full)
Paweł
-
7. Data: 2009-03-14 20:10:18
Temat: Re: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
> gdzie ds18x20_ee to struktura
Pmyłka miało być tablica struktur
Paweł
-
8. Data: 2009-03-14 20:14:21
Temat: Re: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
A jeszcze cikawiej, wyjęcie zapisu do eeprom poza pętle zmniejsz rozmiar
pliku wynikowego z
Program: 32830 bytes (100.2% Full)
do
Program: 32816 bytes (100.1% Full)
Może w pętli liczyć na ramie a zapis robić poza nią?
Mimo wszystko i tak sporo to zajmuje.
Paweł
-
9. Data: 2009-03-14 20:34:25
Temat: Re: avr-gcc eeprom inline
Od: Adam Dybkowski <a...@4...pl>
T.M.F. pisze:
> Pytanie kontrolne - jakiej wersji avr-gcc uzywasz? Najnowsza ma
> regression bug i ma tendencje do bardzo ostrego inlinowania funkcji co
> zwieksza objetosc.
Piszesz o WinAVR 20090313 czy jakiejś dystrybucji linuxowej?
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
10. Data: 2009-03-14 20:41:24
Temat: Re: avr-gcc eeprom inline
Od: "pawel" <p...@p...onet.pl>
> Piszesz o WinAVR 20090313 czy jakiejś dystrybucji linuxowej?
Witam.
Chociaż pytanie nie do mnie.
Używam WinAvr 20071221 niestety we wszystkich nowszych wersjach kod znacznie
się rozrasta.
Paweł