avr-gcc eeprom inline

Loading thread data ...

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.

Reply to
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?

Reply to
Zbych

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?

Reply to
T.M.F.

T.M.F. pisze:

Piszesz o WinAVR 20090313 czy jakiejś dystrybucji linuxowej?

Reply to
Adam Dybkowski

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.

Reply to
T.M.F.

Adam Dybkowski pisze:

Pisze o WinAVR.

Reply to
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?

Reply to
T.M.F.

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.

Reply to
Adam Dybkowski

T.M.F. pisze:

Ale to ma chyba działać dopiero od 4.4, a w winavr jest jeszcze 4.3.

Reply to
Zbych

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.