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³
Didn't find your answer? Ask the community — no account required.
Z
Zbych
pawel pisze:
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.
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.
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³
Z
Zbych
pawel pisze:
Jeśli eeprommy_read_byte wyląduje w pliku *.c a nie w nagłówkowym to rozmiar powinien zmaleć.
Uważasz, że kompilator robi kopię normalnej funkcji przy każdym wywołaniu?
T
T.M.F.
Zbych pisze:
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?
P
pawel
Stosunkowo sporo, atmega32 Program: 32830 bytes (100.2% Full)
gdzie ds18x20_ee to struktura, restout to jej pole zmniejsza kod wynikowy do: Program: 32744 bytes (99.9% Full)
Pawe³
P
pawel
Pmy³ka mia³o byæ tablica struktur
Pawe³
P
pawel
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³
A
Adam Dybkowski
T.M.F. pisze:
Piszesz o WinAVR 20090313 czy jakiejś dystrybucji linuxowej?
P
pawel
Witam. Chocia¿ pytanie nie do mnie. U¿ywam WinAvr 20071221 niestety we wszystkich nowszych wersjach kod znacznie siê rozrasta.
Pawe³
T
T.M.F.
pawel pisze:
Ee, czyli spoko, to praktycznie nic :)
Jesli mozesz to odwroc warunek od MAX_DS18X20 do 0. To wymaga mniej instrukcji do sprawdzenia. W innych petlach podobnie - staraj sie, zeby kompilator nie musial wstawiac dodatkowych CP, czyli np. odliczaj do zera, albo do 255, 256 czy cos w tym stylu.
restout ma jaka dlugosc? Jesli 1 lub 2 bajty to nie oplaca sie przekazywac adresu, lepiej wartosc.
Zobacz tez czy nie masz gdzies w kodzie operatorow logicznych, mozna je zoptymalizowac okreslajac explicite typ na np. uint8_t, gdyz gcc automatycznieje promuje do uint, co wielokrotnie zwieksza ilosc operacji.
T
T.M.F.
Adam Dybkowski pisze:
Pisze o WinAVR.
T
T.M.F.
T.M.F. pisze:
A, i nie o 20090313, to chyba wersja RC jest. Ale ostatnia stabilna tak sie paskudnie zzachowuje i co wiecej okreslanie przez opcje kompilatora jakie funkcje maja nie byc inline nic nie zmienia. BTW, jesli masz ta wersje RC zainstalowana mozesz sprawdzic, czy dziala wprowadzona do gcc opcja umozliwiajaca okreslenie optymalizacji na poziomie funkcji?
A
Adam Dybkowski
T.M.F. pisze:
Nie używam RC, na razie śmigam jeszcze na starej dobrej 20080610. A optymalizację inline'owania wymuszam przez atrybuty funkcji noinline i always_inline, jak na razie to działa poprawnie. Poczekam, aż coś się wyklaruje z nowszym WinAVR'em jeżeli takie problemy są obecnie.
Z
Zbych
T.M.F. pisze:
Ale to ma chyba działać dopiero od 4.4, a w winavr jest jeszcze 4.3.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.