keil 51 to avr gcc

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

Reply to
ynio
Loading thread data ...

ynio przemówił ludzkim głosem:

Powodów większego rozmiaru może być kilka:

  1. każdy rozkaz w avr to minimum 2 bajty, w 51 minimum to jeden bajt.
  2. keil potrafi _automatycznie_ zrobić faktoryzację kodu, gcc nie.
  3. w keilu można wyłączyć promocję do int, gcc jej z kolei nadużywa
  4. 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.

Reply to
Zbych

ynio napisał(a):

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.

Pozdr AK

Reply to
AK

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.