Witam Mam pewien problem. jakis czas temu napisalem program do 89s52 w keil C. Program zajmowal ok 6kB (bin). Teraz postanowilem to samo przepisac na AVR atmege8. Jeszcze nie skonczylem a program juz zajmuje 6.5kB. Kompilacja ustawiona jest na najlepsza optymalizacje (-Os). Czemu tak jest ? Podejrzewam ze avr gcc laduje male funkcje jako inline, co zwieksza rozmiar ale przyspiesza. Mi natomiast zalezy na jak mniejszej wielkosc. Macie jakies porady ? dzieki ynio
każdy rozkaz w avr to minimum 2 bajty, w 51 minimum to jeden bajt.
keil potrafi _automatycznie_ zrobić faktoryzację kodu, gcc nie.
w keilu można wyłączyć promocję do int, gcc jej z kolei nadużywa
gcc kiepsko radzi sobie z długimi liczbami (np 32-bitowymi)
Raczej nie, chyba że sam zadeklarujesz funkcję jako inline, albo static.
- jeśli nie używasz dużych liczb (np. 32-bitowych) to użyj opcji -mint8 (skrócenie inta do 8 bitów), dzięki temu oszczędzisz trochę bajtów na zbędnych promocjach do 16-bitowego inta.
- dodaj opcję --ffunction-sections, gcc preferuje wtedy rozkazy skoków krótkich
- przejrzyj program pod względem powtarzających się fragmentów.
- o takich rzeczach jak preferowanie zmiennych 8-bitowych bez znaku chyba nie ma co wspominać
- jeśli często musisz składać dłuższe liczby z kilku np. bajtowych to używaj raczej unii niż sumy logicznej/arytmetycznej.
- przy operacjach bitowych na długich liczbach krótszy kod daje odwołanie do konkretnego bajtu liczby przez wskaźnik.
- jeśli nie jest to niezbędne to unikaj używania printfów itp. funkcji, lepiej napisać własne krótkie funkcje do wyrzucania znaków, konwersji liczb na ascii.....
Przy okazji, na grupie poświęconej avr-gcc jakiś czas temu (listopad zeszłego roku) była mowa o możliwości optymalizacji kodu na etapie linkowania (usuwanie nieużywanych funkcji, używanie skoków krótkich zamiast długich itp.). Niestety w najnowszym winavr nic nie ma na ten temat, więc wychodzi na to, że należałoby samemu nałożyć łaty.
Sprobuj ustawic optymalizacje na -O2 - nie wiem jak w przypadku avr, ale dla arm-a O2 daje mniejszy kod niz -Os. Ewentualnie zmien procesor na ATmega168 - jest kompatybilny z ATmega8 pinowo, takze nie trzeba zmieniac plytki.
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.